summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijay Hiremath <vijay.p.hiremath@intel.com>2017-01-12 12:57:52 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-01-13 15:22:35 -0800
commit6a7e4a7b353c53d33d44662c71763490ffd1fdc4 (patch)
tree9ef9524663f201b8ce84b250617af2e539973e2c
parent9fd2736d90c598b335d689d8db5ad727194a1991 (diff)
downloadchrome-ec-6a7e4a7b353c53d33d44662c71763490ffd1fdc4.tar.gz
charge_ramp: Adjust minimum ramp current
A valid charge port is always detected as VBUS supplier type, 'USB charger' can detect the same port as BC1.2 DCP supplier type & also 'TCPC' can detect the same port as TYPEC supplier type. Thus a valid port is detected as 2 or 3 supplier types. Depending on the supplier's priority and the power that the supplier can provide, charge manager choses the charge supplier type of the port. If the USB charger detected supplier is BC1.2 DCP and the TCPC detected supplier is TYPEC then the supplier can provide stable current from TYPEC supplier's advertised current hence start ramping from TYPEC supplier's advertised current. BUG=chrome-os-partner:61420 BRANCH=none TEST=Manually tested on reef. Donette bottom port can switch from 1.5A to 3A upon high load. Change-Id: I871eca3ae4041f00bb3fd50e6aa939643f30a1f2 Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com> Reviewed-on: https://chromium-review.googlesource.com/427961 Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com> Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--common/charge_manager.c24
-rw-r--r--common/charge_ramp.c4
-rw-r--r--include/charge_manager.h9
-rw-r--r--test/charge_ramp.c6
4 files changed, 41 insertions, 2 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c
index 1c9bac377e..c0c5eded5e 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -16,6 +16,7 @@
#include "system.h"
#include "tcpm.h"
#include "timer.h"
+#include "usb_charge.h"
#include "usb_pd.h"
#include "usb_pd_tcpm.h"
#include "util.h"
@@ -906,6 +907,29 @@ int charge_manager_get_power_limit_uw(void)
return current_ma * voltage_mv;
}
+#ifdef HAS_TASK_CHG_RAMP
+int charge_manager_get_ramp_start_current(int port, int supplier)
+{
+ /*
+ * A valid charge port is always detected as VBUS supplier type,
+ * 'USB charger' can detect the same port as BC1.2 DCP supplier type
+ * & also 'TCPC' can detect the same port as TYPEC supplier type. Thus
+ * a valid port is detected as 2 or 3 supplier types. Depending on the
+ * supplier's priority and the power that the supplier can provide,
+ * charge manager choses the charge supplier type of the port.
+ *
+ * If the USB charger detected supplier is BC1.2 DCP and the TCPC
+ * detected supplier is TYPEC then the supplier can provide stable
+ * current from TYPEC supplier's advertised current hence start
+ * ramping from TYPEC supplier's advertised current.
+ */
+ return (supplier == CHARGE_SUPPLIER_BC12_DCP &&
+ available_charge[CHARGE_SUPPLIER_TYPEC][port].current) ?
+ available_charge[CHARGE_SUPPLIER_TYPEC][port].current :
+ USB_CHARGER_MIN_CURR_MA;
+}
+#endif
+
#ifdef CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT
void charge_manager_source_port(int port, int enable)
{
diff --git a/common/charge_ramp.c b/common/charge_ramp.c
index f6942d7516..c84e126140 100644
--- a/common/charge_ramp.c
+++ b/common/charge_ramp.c
@@ -29,7 +29,6 @@
/* Current ramp increment */
#define RAMP_CURR_INCR_MA 64
#define RAMP_CURR_DELAY (500*MSEC)
-#define RAMP_CURR_START_MA 500
/* How much to backoff the input current limit when limit has been found */
#define RAMP_ICL_BACKOFF (2*RAMP_CURR_INCR_MA)
@@ -102,7 +101,8 @@ void chg_ramp_charge_supplier_change(int port, int supplier, int current,
/* Set min and max input current limit based on if ramp is allowed */
if (board_is_ramp_allowed(active_sup)) {
- min_icl = RAMP_CURR_START_MA;
+ min_icl = charge_manager_get_ramp_start_current(active_port,
+ active_sup);
max_icl = board_get_ramp_current_limit(active_sup, current);
} else {
min_icl = max_icl = current;
diff --git a/include/charge_manager.h b/include/charge_manager.h
index 64c8272886..df69bc196a 100644
--- a/include/charge_manager.h
+++ b/include/charge_manager.h
@@ -194,4 +194,13 @@ void board_set_charge_limit(int port, int supplier, int charge_ma,
*/
int board_vbus_source_enabled(int port);
+/**
+ * Get ramp start current.
+ *
+ * @param port PD port.
+ * @param supplier Identified CHARGE_SUPPLIER_*.
+ * @return ramp start current.
+ */
+int charge_manager_get_ramp_start_current(int port, int supplier);
+
#endif /* __CROS_EC_CHARGE_MANAGER_H */
diff --git a/test/charge_ramp.c b/test/charge_ramp.c
index 33db036a59..a300c5e04f 100644
--- a/test/charge_ramp.c
+++ b/test/charge_ramp.c
@@ -14,6 +14,7 @@
#include "task.h"
#include "test_util.h"
#include "timer.h"
+#include "usb_charge.h"
#include "util.h"
#define TASK_EVENT_OVERCURRENT (1 << 0)
@@ -36,6 +37,11 @@ static int charge_limit_ma;
/* Mock functions */
+int charge_manager_get_ramp_start_current(int port, int supplier)
+{
+ return USB_CHARGER_MIN_CURR_MA;
+}
+
int board_is_ramp_allowed(int supplier)
{
/* Ramp for TEST4-TEST8 */