summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2020-06-04 18:35:58 +0800
committerCommit Bot <commit-bot@chromium.org>2020-06-10 11:32:18 +0000
commit3dc4147d8792447671b3a37726e4f62f72c0db8b (patch)
treed3e88f0791875b930d0605303199f562130a1a6d
parent7589c88c048700f349a7515539f8fe8f5c67b155 (diff)
downloadchrome-ec-3dc4147d8792447671b3a37726e4f62f72c0db8b.tar.gz
charger/isl9238c: enable slew rate control
Enable charge current and maximum system voltage slew rate control on ISL9238C by default for better charger stability. Since the control is only available on ISL9238C, not on A/B, and there's no way to distinguish C and A/B in software side, introduce a new config CONFIG_CHARGER_ISL9238C for 9238C users. BUG=b:155366741 TEST=1) on asurada, verify the register configured correctly 2) verify the waveform looks better BRANCH=kukui Signed-off-by: Ting Shen <phoenixshen@google.com> Change-Id: I577db3eebcad0ed3793f4b7d525e4246515f8503 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2231725 Tested-by: Hsu Alvis <alvishsu@google.com> Tested-by: Ting Shen <phoenixshen@chromium.org> Reviewed-by: Eric Yilun Lin <yllin@chromium.org> Reviewed-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--baseboard/kukui/baseboard.h2
-rw-r--r--board/asurada/board.h2
-rw-r--r--driver/build.mk1
-rw-r--r--driver/charger/isl923x.c71
-rw-r--r--driver/charger/isl923x.h9
-rw-r--r--include/config.h5
6 files changed, 56 insertions, 34 deletions
diff --git a/baseboard/kukui/baseboard.h b/baseboard/kukui/baseboard.h
index 09b9dc46ac..390a345fe0 100644
--- a/baseboard/kukui/baseboard.h
+++ b/baseboard/kukui/baseboard.h
@@ -55,7 +55,7 @@
#define PD_MAX_VOLTAGE_MV 12850
#define CONFIG_USB_PD_PREFER_MV
#elif defined(VARIANT_KUKUI_CHARGER_ISL9238)
-#define CONFIG_CHARGER_ISL9238
+#define CONFIG_CHARGER_ISL9238C
#define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 /* BOARD_RS1 */
#define CONFIG_CHARGER_SENSE_RESISTOR 10 /* BOARD_RS2 */
#define CONFIG_CHARGER_OTG
diff --git a/board/asurada/board.h b/board/asurada/board.h
index 9301ec3c10..af75f30b75 100644
--- a/board/asurada/board.h
+++ b/board/asurada/board.h
@@ -33,7 +33,7 @@
/* Charger */
#define CONFIG_CHARGER
#define CONFIG_CHARGER_INPUT_CURRENT 512
-#define CONFIG_CHARGER_ISL9238
+#define CONFIG_CHARGER_ISL9238C
#define CONFIG_CHARGER_MAINTAIN_VBAT
#define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 /* BOARD_RS1 */
#define CONFIG_CHARGER_SENSE_RESISTOR 10 /* BOARD_RS2 */
diff --git a/driver/build.mk b/driver/build.mk
index 4f708a3a66..220873eeeb 100644
--- a/driver/build.mk
+++ b/driver/build.mk
@@ -62,6 +62,7 @@ driver-$(CONFIG_CHARGER_BQ24773)+=charger/bq24773.o
driver-$(CONFIG_CHARGER_BQ25710)+=charger/bq25710.o
driver-$(CONFIG_CHARGER_ISL9237)+=charger/isl923x.o
driver-$(CONFIG_CHARGER_ISL9238)+=charger/isl923x.o
+driver-$(CONFIG_CHARGER_ISL9238C)+=charger/isl923x.o
driver-$(CONFIG_CHARGER_ISL9241)+=charger/isl9241.o
driver-$(CONFIG_CHARGER_MT6370)+=charger/rt946x.o
driver-$(CONFIG_CHARGER_RAA489000)+=charger/isl923x.o
diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c
index ae23b03426..5fce2d0b62 100644
--- a/driver/charger/isl923x.c
+++ b/driver/charger/isl923x.c
@@ -26,6 +26,10 @@
#error "ISL9237/8 is a NVDC charger, please enable CONFIG_CHARGER_NARROW_VDC."
#endif
+#if defined(CONFIG_CHARGER_ISL9238) || defined(CONFIG_CHARGER_ISL9238C)
+#define CHARGER_ISL9238X
+#endif
+
#define DEFAULT_R_AC 20
#define DEFAULT_R_SNS 10
#define R_AC CONFIG_CHARGER_SENSE_RESISTOR_AC
@@ -132,7 +136,7 @@ static enum ec_error_list isl923x_get_input_current(int chgnum,
return EC_SUCCESS;
}
-#if defined(CONFIG_CHARGER_OTG) && defined(CONFIG_CHARGER_ISL9238)
+#if defined(CONFIG_CHARGER_OTG) && defined(CHARGER_ISL9238X)
static enum ec_error_list isl923x_enable_otg_power(int chgnum, int enabled)
{
int rv, control1;
@@ -183,7 +187,7 @@ static enum ec_error_list isl923x_set_otg_current_voltage(int chgnum,
/* Set current. */
return raw_write16(chgnum, ISL923X_REG_OTG_CURRENT, current_reg);
}
-#endif /* CONFIG_CHARGER_OTG && CONFIG_CHARGER_ISL9238 */
+#endif /* CONFIG_CHARGER_OTG && CHARGER_ISL9238X */
static enum ec_error_list isl923x_manufacturer_id(int chgnum, int *id)
{
@@ -470,7 +474,18 @@ static void isl923x_init(int chgnum)
goto init_fail;
}
- if (IS_ENABLED(CONFIG_CHARGER_ISL9238) ||
+ if (IS_ENABLED(CONFIG_CHARGER_ISL9238C)) {
+ /* b/155366741: enable slew rate control */
+ if (raw_read16(chgnum, ISL9238C_REG_CONTROL6, &reg))
+ goto init_fail;
+
+ reg |= ISL9238C_C6_SLEW_RATE_CONTROL;
+
+ if (raw_write16(chgnum, ISL9238C_REG_CONTROL6, reg))
+ goto init_fail;
+ }
+
+ if (IS_ENABLED(CHARGER_ISL9238X) ||
IS_ENABLED(CONFIG_CHARGER_RAA489000)) {
/*
* Don't reread the prog pin and don't reload the ILIM on ACIN.
@@ -777,20 +792,20 @@ static int print_amon_bmon(int chgnum, enum amon_bmon amon,
{
int adc, curr, reg, ret;
-#ifdef CONFIG_CHARGER_ISL9238
- ret = raw_read16(chgnum, ISL9238_REG_CONTROL3, &reg);
- if (ret)
- return ret;
+ if (IS_ENABLED(CHARGER_ISL9238X)) {
+ ret = raw_read16(chgnum, ISL9238_REG_CONTROL3, &reg);
+ if (ret)
+ return ret;
- /* Switch direction */
- if (direction)
- reg |= ISL9238_C3_AMON_BMON_DIRECTION;
- else
- reg &= ~ISL9238_C3_AMON_BMON_DIRECTION;
- ret = raw_write16(chgnum, ISL9238_REG_CONTROL3, reg);
- if (ret)
- return ret;
-#endif
+ /* Switch direction */
+ if (direction)
+ reg |= ISL9238_C3_AMON_BMON_DIRECTION;
+ else
+ reg &= ~ISL9238_C3_AMON_BMON_DIRECTION;
+ ret = raw_write16(chgnum, ISL9238_REG_CONTROL3, reg);
+ if (ret)
+ return ret;
+ }
mutex_lock(&control1_mutex);
@@ -836,12 +851,10 @@ static int console_command_amon_bmon(int argc, char **argv)
if (argc >= 2) {
print_ac = (argv[1][0] == 'a');
print_battery = (argv[1][0] == 'b');
-#ifdef CONFIG_CHARGER_ISL9238
- if (argv[1][1] != '\0') {
+ if (IS_ENABLED(CHARGER_ISL9238X) && argv[1][1] != '\0') {
print_charge = (argv[1][1] == 'c');
print_discharge = (argv[1][1] == 'd');
}
-#endif
if (argc >= 3) {
chgnum = strtoi(argv[2], &e, 10);
if (*e)
@@ -853,23 +866,19 @@ static int console_command_amon_bmon(int argc, char **argv)
if (print_charge)
ret |= print_amon_bmon(chgnum, AMON, 0,
CONFIG_CHARGER_SENSE_RESISTOR_AC);
-#ifdef CONFIG_CHARGER_ISL9238
- if (print_discharge)
+ if (IS_ENABLED(CHARGER_ISL9238X) && print_discharge)
ret |= print_amon_bmon(chgnum, AMON, 1,
CONFIG_CHARGER_SENSE_RESISTOR_AC);
-#endif
}
if (print_battery) {
-#ifdef CONFIG_CHARGER_ISL9238
- if (print_charge)
+ if (IS_ENABLED(CHARGER_ISL9238X) && print_charge)
ret |= print_amon_bmon(chgnum, BMON, 0,
/*
* charging current monitor has
* 2x amplification factor
*/
- 2*CONFIG_CHARGER_SENSE_RESISTOR);
-#endif
+ 2 * CONFIG_CHARGER_SENSE_RESISTOR);
if (print_discharge)
ret |= print_amon_bmon(chgnum, BMON, 1,
CONFIG_CHARGER_SENSE_RESISTOR);
@@ -918,11 +927,13 @@ static int command_isl923x_dump(int argc, char **argv)
}
dump_reg_range(chgnum, 0x14, 0x15);
+ if (IS_ENABLED(CONFIG_CHARGER_ISL9238C))
+ dump_reg_range(chgnum, 0x37, 0x37);
dump_reg_range(chgnum, 0x38, 0x3F);
dump_reg_range(chgnum, 0x47, 0x4A);
-#if defined(CONFIG_CHARGER_ISL9238) || defined(CONFIG_CHARGER_RAA489000)
- dump_reg_range(chgnum, 0x4B, 0x4E);
-#endif /* CONFIG_CHARGER_ISL9238 || CONFIG_CHARGER_RAA489000 */
+ if (IS_ENABLED(CHARGER_ISL9238X) ||
+ IS_ENABLED(CONFIG_CHARGER_RAA489000))
+ dump_reg_range(chgnum, 0x4B, 0x4E);
dump_reg_range(chgnum, 0xFE, 0xFF);
return EC_SUCCESS;
@@ -1070,7 +1081,7 @@ const struct charger_drv isl923x_drv = {
.get_info = &isl923x_get_info,
.get_status = &isl923x_get_status,
.set_mode = &isl923x_set_mode,
-#if defined(CONFIG_CHARGER_OTG) && defined(CONFIG_CHARGER_ISL9238)
+#if defined(CONFIG_CHARGER_OTG) && defined(CHARGER_ISL9238X)
.enable_otg_power = &isl923x_enable_otg_power,
.set_otg_current_voltage = &isl923x_set_otg_current_voltage,
#endif
diff --git a/driver/charger/isl923x.h b/driver/charger/isl923x.h
index d9d11a6e20..09d7d88a43 100644
--- a/driver/charger/isl923x.h
+++ b/driver/charger/isl923x.h
@@ -25,6 +25,7 @@
#define ISL923X_REG_CONTROL2 0x3d
#define ISL9238_REG_CONTROL3 0x4c
#define ISL9238_REG_CONTROL4 0x4e
+#define ISL9238C_REG_CONTROL6 0x37
#define ISL923X_REG_INFO 0x3a
#define ISL9238_REG_INFO2 0x4d
#define ISL923X_REG_OTG_VOLTAGE 0x49
@@ -255,6 +256,9 @@
/* Control4: GP comparator control bit */
#define RAA489000_C4_DISABLE_GP_CMP BIT(12)
+/* Control6: charger current and maximum system voltage slew rate control. */
+#define ISL9238C_C6_SLEW_RATE_CONTROL BIT(6)
+
/* Control8: MCU_LDO - BAT state disable */
#define RAA489000_C8_MCU_LDO_BAT_STATE_DISABLE BIT(14)
@@ -338,6 +342,11 @@ enum isl9237_fsm_state {
#define CHARGE_V_MAX ISL9238_SYS_VOLTAGE_REG_MAX
#define CHARGE_V_MIN ISL923X_SYS_VOLTAGE_REG_MIN
#define CHARGE_V_STEP 8
+#elif defined(CONFIG_CHARGER_ISL9238C)
+#define CHARGER_NAME "isl9238c"
+#define CHARGE_V_MAX ISL9238_SYS_VOLTAGE_REG_MAX
+#define CHARGE_V_MIN ISL923X_SYS_VOLTAGE_REG_MIN
+#define CHARGE_V_STEP 8
#elif defined(CONFIG_CHARGER_RAA489000)
#define CHARGER_NAME "raa489000"
#define CHARGE_V_MAX RAA489000_SYS_VOLTAGE_REG_MAX
diff --git a/include/config.h b/include/config.h
index d2355a0fe7..763b932c0e 100644
--- a/include/config.h
+++ b/include/config.h
@@ -795,7 +795,8 @@
#undef CONFIG_CHARGER_BQ24773
#undef CONFIG_CHARGER_BQ25710
#undef CONFIG_CHARGER_ISL9237
-#undef CONFIG_CHARGER_ISL9238
+#undef CONFIG_CHARGER_ISL9238 /* For ISL9238 A/B */
+#undef CONFIG_CHARGER_ISL9238C
#undef CONFIG_CHARGER_ISL9241
#undef CONFIG_CHARGER_MT6370
#undef CONFIG_CHARGER_RAA489000
@@ -4892,7 +4893,7 @@
* architecture.
*/
#if defined(CONFIG_CHARGER_ISL9237) || defined(CONFIG_CHARGER_ISL9238) || \
- defined(CONFIG_CHARGER_ISL9241) || \
+ defined(CONFIG_CHARGER_ISL9238C) || defined(CONFIG_CHARGER_ISL9241) || \
defined(CONFIG_CHARGER_RAA489000) || defined(CONFIG_CHARGER_SM5803)
#define CONFIG_CHARGER_NARROW_VDC
#endif