summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYongBeum.Ha <ybha@samsung.corp-partner.google.com>2020-09-25 15:02:15 +0900
committerCommit Bot <commit-bot@chromium.org>2020-10-23 16:16:57 +0000
commit34e78a2e1debf9df58575f4dc2cf4d17407ec5ce (patch)
tree494adc49d039eb60b941da62995734de27eb558b
parent59551dcaee6c30b3764a9f00aae8487c0495dfec (diff)
downloadchrome-ec-34e78a2e1debf9df58575f4dc2cf4d17407ec5ce.tar.gz
Casta : Support Multi-Charger
Casta need to support 2 chargers(ISL9238 & BQ25710) BUG=b:168122776 BRANCH=firmware-octopus-11297.B TEST=Build, flash EC and check with each system that have BQ25710 and ISL9238 Signed-off-by: YongBeum.Ha <ybha@samsung.corp-partner.google.com> Change-Id: I18758acbd0920132c2958bf9d238b4eac3fb5b73 Signed-off-by: YongBeum.Ha <ybha@samsung.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2428358 Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org> Commit-Queue: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r--baseboard/octopus/baseboard.c3
-rw-r--r--baseboard/octopus/baseboard.h8
-rw-r--r--board/casta/board.c24
-rw-r--r--board/casta/board.h3
-rw-r--r--common/charger.c10
-rw-r--r--driver/charger/bd9995x.c13
-rw-r--r--driver/charger/bd9995x.h13
-rw-r--r--driver/charger/bq24773.c16
-rw-r--r--driver/charger/bq24773.h16
-rw-r--r--driver/charger/bq25710.c122
-rw-r--r--driver/charger/bq25710.h14
-rw-r--r--driver/charger/isl923x.c49
-rw-r--r--driver/charger/isl923x.h20
-rw-r--r--driver/charger/rt946x.c13
-rw-r--r--driver/charger/rt946x.h13
15 files changed, 236 insertions, 101 deletions
diff --git a/baseboard/octopus/baseboard.c b/baseboard/octopus/baseboard.c
index a6f37b3356..bbc6944c1e 100644
--- a/baseboard/octopus/baseboard.c
+++ b/baseboard/octopus/baseboard.c
@@ -323,7 +323,8 @@ void board_set_charge_limit(int port, int supplier, int charge_ma,
* Empirically, the charger seems to draw a little more current that
* it is set to, so we reduce our limit by 5%.
*/
-#ifdef VARIANT_OCTOPUS_CHARGER_ISL9238
+#if defined(VARIANT_OCTOPUS_CHARGER_ISL9238) || \
+ defined(CONFIG_CHARGER_BQ25710) || defined(CONFIG_CHARGER_ISL9238)
charge_ma = (charge_ma * 95) / 100;
#endif
charge_set_input_current_limit(MAX(charge_ma,
diff --git a/baseboard/octopus/baseboard.h b/baseboard/octopus/baseboard.h
index c20af902b3..c3097907cf 100644
--- a/baseboard/octopus/baseboard.h
+++ b/baseboard/octopus/baseboard.h
@@ -128,6 +128,14 @@
*/
#undef CONFIG_EXTPOWER_DEBOUNCE_MS
#define CONFIG_EXTPOWER_DEBOUNCE_MS 50
+#elif defined(CONFIG_CHARGER_RUNTIME_CONFIG)
+ #define CONFIG_CHARGER_ISL9238
+ #define CONFIG_CHARGER_BQ25710
+ #define CONFIG_CHARGER_SENSE_RESISTOR_AC_ISL9238 20
+ #define CONFIG_CHARGER_SENSE_RESISTOR_AC_BQ25710 10
+
+ #undef CONFIG_EXTPOWER_DEBOUNCE_MS
+ #define CONFIG_EXTPOWER_DEBOUNCE_MS 200
#else
#error Must define a VARIANT_OCTOPUS_CHARGER
#endif /* VARIANT_OCTOPUS_CHARGER */
diff --git a/board/casta/board.c b/board/casta/board.c
index 71311e5ce2..71ab12891e 100644
--- a/board/casta/board.c
+++ b/board/casta/board.c
@@ -8,11 +8,14 @@
#include "adc.h"
#include "adc_chip.h"
#include "battery.h"
+#include "cbi_ssfc.h"
#include "charge_manager.h"
#include "charge_state.h"
#include "common.h"
#include "cros_board_info.h"
#include "driver/charger/bd9995x.h"
+#include "driver/charger/bq25710.h"
+#include "driver/charger/isl923x.h"
#include "driver/ppc/nx20p348x.h"
#include "driver/tcpm/anx7447.h"
#include "driver/tcpm/ps8xxx.h"
@@ -88,6 +91,16 @@ const struct temp_sensor_t temp_sensors[] = {
};
BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT);
+/* Charger config. Start i2c address at isl9238, update during runtime */
+struct charger_config_t chg_chips[] = {
+ {
+ .i2c_port = I2C_PORT_CHARGER,
+ .i2c_addr_flags = ISL923X_ADDR,
+ .drv = &isl923x_drv,
+ },
+};
+const unsigned int chg_cnt = ARRAY_SIZE(chg_chips);
+
/*
* I2C callbacks to ensure bus free time for battery I2C transactions is at
* least 5ms.
@@ -131,6 +144,17 @@ void i2c_end_xfer_notify(int port, int slave_addr)
battery_last_i2c_time = get_time();
}
+/* TODO: Casta: remove this routine after rev0 is not supported */
+static void board_init(void)
+{
+ if(get_cbi_ssfc_charger() != SSFC_CHARGER_BQ25710)
+ return;
+
+ chg_chips[0].drv = &bq25710_drv;
+ chg_chips[0].i2c_addr_flags = BQ25710_SMBUS_ADDR1;
+}
+DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_INIT_I2C + 2);
+
void board_overcurrent_event(int port, int is_overcurrented)
{
/* Sanity check the port. */
diff --git a/board/casta/board.h b/board/casta/board.h
index edba87081f..64c758de1b 100644
--- a/board/casta/board.h
+++ b/board/casta/board.h
@@ -10,9 +10,9 @@
/* Select Baseboard features */
#define VARIANT_OCTOPUS_EC_NPCX796FB
-#define VARIANT_OCTOPUS_CHARGER_ISL9238
#define VARIANT_OCTOPUS_TCPC_0_PS8751
#define VARIANT_OCTOPUS_NO_SENSORS
+#define CONFIG_CHARGER_RUNTIME_CONFIG
#include "baseboard.h"
#define CONFIG_LED_COMMON
@@ -59,6 +59,7 @@
#define CONFIG_MKBP_USE_HOST_EVENT
/* Battery W/A */
+#define CONFIG_CHARGER_BQ25710_IDCHG_LIMIT_MA 6144
#define CONFIG_CHARGER_PROFILE_OVERRIDE
#define CONFIG_I2C_XFER_BOARD_CALLBACK
diff --git a/common/charger.c b/common/charger.c
index 29002e44da..b3781ab4d7 100644
--- a/common/charger.c
+++ b/common/charger.c
@@ -276,7 +276,17 @@ static void charger_chips_init(void)
chg_chips[chip].drv->init(chip);
}
}
+#if !defined(CONFIG_CHARGER_RUNTIME_CONFIG)
DECLARE_HOOK(HOOK_INIT, charger_chips_init, HOOK_PRIO_INIT_I2C + 1);
+#else
+/*
+ * If charager is determined by SSFC,
+ * first cbi can be read after i2c init.(I2C + 1)
+ * second charge is selected on board_init(I2C + 2)
+ * then we can init charger_chips_init(I2C + 3)
+ */
+DECLARE_HOOK(HOOK_INIT, charger_chips_init, HOOK_PRIO_INIT_I2C + 3);
+#endif
enum ec_error_list charger_post_init(void)
{
diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c
index 186310af5d..2a63cbb744 100644
--- a/driver/charger/bd9995x.c
+++ b/driver/charger/bd9995x.c
@@ -67,6 +67,19 @@ static int select_input_port_update;
#endif
/* Charger parameters */
+#define CHARGER_NAME BD9995X_CHARGER_NAME
+#define CHARGE_V_MAX 19200
+#define CHARGE_V_MIN 3072
+#define CHARGE_V_STEP 16
+#define CHARGE_I_MAX 16320
+#define CHARGE_I_MIN 128
+#define CHARGE_I_OFF 0
+#define CHARGE_I_STEP 64
+#define INPUT_I_MAX 16352
+#define INPUT_I_MIN 512
+#define INPUT_I_STEP 32
+
+/* Charger parameters */
static const struct charger_info bd9995x_charger_info = {
.name = CHARGER_NAME,
.voltage_max = CHARGE_V_MAX,
diff --git a/driver/charger/bd9995x.h b/driver/charger/bd9995x.h
index 8d8e2da5be..aa3f27f02e 100644
--- a/driver/charger/bd9995x.h
+++ b/driver/charger/bd9995x.h
@@ -36,19 +36,6 @@ enum bd9995x_charge_port {
BD9995X_CHARGE_PORT_BOTH,
};
-/* Charger parameters */
-#define CHARGER_NAME BD9995X_CHARGER_NAME
-#define CHARGE_V_MAX 19200
-#define CHARGE_V_MIN 3072
-#define CHARGE_V_STEP 16
-#define CHARGE_I_MAX 16320
-#define CHARGE_I_MIN 128
-#define CHARGE_I_OFF 0
-#define CHARGE_I_STEP 64
-#define INPUT_I_MAX 16352
-#define INPUT_I_MIN 512
-#define INPUT_I_STEP 32
-
/* Min. charge current w/ no battery to prevent collapse */
#define BD9995X_NO_BATTERY_CHARGE_I_MIN 512
diff --git a/driver/charger/bq24773.c b/driver/charger/bq24773.c
index caded3c5f8..653321ced9 100644
--- a/driver/charger/bq24773.c
+++ b/driver/charger/bq24773.c
@@ -28,6 +28,22 @@
#define REG8_TO_CURRENT(REG, RS) ((REG) * DEFAULT_SENSE_RESISTOR / (RS) * R8)
#define CURRENT_TO_REG8(CUR, RS) ((CUR) * (RS) / DEFAULT_SENSE_RESISTOR / R8)
+/* ChargeCurrent Register - 0x14 (mA) */
+#define CHARGE_I_OFF 0
+#define CHARGE_I_MIN 128
+#define CHARGE_I_MAX 8128
+#define CHARGE_I_STEP 64
+
+/* MaxChargeVoltage Register - 0x15 (mV) */
+#define CHARGE_V_MIN 1024
+#define CHARGE_V_MAX 19200
+#define CHARGE_V_STEP 16
+
+/* InputCurrent Register - 0x3f (mA) */
+#define INPUT_I_MIN 128
+#define INPUT_I_MAX 8128
+#define INPUT_I_STEP 64
+
/* Charger parameters */
static const struct charger_info bq2477x_charger_info = {
.name = CHARGER_NAME,
diff --git a/driver/charger/bq24773.h b/driver/charger/bq24773.h
index 40e44827da..24e9a0ed9d 100644
--- a/driver/charger/bq24773.h
+++ b/driver/charger/bq24773.h
@@ -54,22 +54,6 @@
/* Prochot Option bits */
#define PROCHOT_OPTION1_SELECTOR_MASK 0x7f /* [6:0] PROCHOT SELECTOR */
-/* ChargeCurrent Register - 0x14 (mA) */
-#define CHARGE_I_OFF 0
-#define CHARGE_I_MIN 128
-#define CHARGE_I_MAX 8128
-#define CHARGE_I_STEP 64
-
-/* MaxChargeVoltage Register - 0x15 (mV) */
-#define CHARGE_V_MIN 1024
-#define CHARGE_V_MAX 19200
-#define CHARGE_V_STEP 16
-
-/* InputCurrent Register - 0x3f (mA) */
-#define INPUT_I_MIN 128
-#define INPUT_I_MAX 8128
-#define INPUT_I_STEP 64
-
#ifdef CONFIG_CHARGER_BQ24770
#define CHARGER_NAME "bq24770"
#undef I2C_ADDR_CHARGER
diff --git a/driver/charger/bq25710.c b/driver/charger/bq25710.c
index 62447afdc3..ce80bb4d5b 100644
--- a/driver/charger/bq25710.c
+++ b/driver/charger/bq25710.c
@@ -5,17 +5,33 @@
* TI bq25710 battery charger driver.
*/
+#include "battery.h"
#include "battery_smart.h"
#include "bq25710.h"
#include "charge_ramp.h"
+#include "charge_state_v2.h"
#include "charger.h"
#include "common.h"
#include "console.h"
#include "hooks.h"
#include "i2c.h"
+#include "task.h"
+#include "system.h"
#include "timer.h"
#include "util.h"
+#ifndef CONFIG_CHARGER_NARROW_VDC
+#error "BQ25710 is a NVDC charger, please enable CONFIG_CHARGER_NARROW_VDC."
+#endif
+
+/*
+ * Delay required from taking the bq25710 out of low power mode and having the
+ * correct value in register 0x3E for VSYS_MIN voltage. The length of the delay
+ * was determined by experiment. Less than 12 msec was not enough of delay, so
+ * the value here is set to 20 msec to have plenty of margin.
+ */
+#define BQ25710_VDDA_STARTUP_DELAY_MSEC 20
+
/* Sense resistor configurations and macros */
#define DEFAULT_SENSE_RESISTOR 10
@@ -32,6 +48,16 @@
/* Console output macros */
#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args)
+#ifdef CONFIG_CHARGER_BQ25710_IDCHG_LIMIT_MA
+/*
+ * If this config option is defined, then the bq25710 needs to remain in
+ * performance mode when the AP is in S0. Performance mode is active whenever AC
+ * power is connected or when the EN_LWPWR bit in ChargeOption0 is clear.
+ */
+static uint32_t bq25710_perf_mode_req;
+static struct mutex bq25710_perf_mode_mutex;
+#endif
+
/* Charger parameters */
static const struct charger_info bq25710_charger_info = {
.name = "bq25710",
@@ -65,6 +91,7 @@ static inline enum ec_error_list raw_write16(int chgnum, int offset, int value)
#if defined(CONFIG_CHARGE_RAMP_HW) || \
defined(CONFIG_USB_PD_VBUS_MEASURE_CHARGER)
+#ifdef CONFIG_USB_PD_VBUS_MEASURE_CHARGER
static int bq25710_get_low_power_mode(int chgnum, int *mode)
{
int rv;
@@ -78,6 +105,7 @@ static int bq25710_get_low_power_mode(int chgnum, int *mode)
return EC_SUCCESS;
}
+#endif //CONFIG_USB_PD_VBUS_MEASURE_CHARGER
static int bq25710_set_low_power_mode(int chgnum, int enable)
{
@@ -88,6 +116,21 @@ static int bq25710_set_low_power_mode(int chgnum, int enable)
if (rv)
return rv;
+#ifdef CONFIG_CHARGER_BQ25710_IDCHG_LIMIT_MA
+ mutex_lock(&bq25710_perf_mode_mutex);
+ /*
+ * Performance mode means not in low power mode. The bit that controls
+ * this is EN_LWPWR in ChargeOption0. The 'enable' param in this
+ * function is refeerring to low power mode, so enabling low power mode
+ * means disabling performance mode and vice versa.
+ */
+ if (enable)
+ bq25710_perf_mode_req &= ~(1 << task_get_current());
+ else
+ bq25710_perf_mode_req |= (1 << task_get_current());
+ enable = !bq25710_perf_mode_req;
+#endif
+
if (enable)
reg |= BQ25710_CHARGE_OPTION_0_LOW_POWER_MODE;
else
@@ -103,6 +146,7 @@ static int bq25710_set_low_power_mode(int chgnum, int enable)
return EC_SUCCESS;
}
+#ifdef CONFIG_USB_PD_VBUS_MEASURE_CHARGER
static int bq25710_adc_start(int chgnum, int adc_en_mask)
{
int reg;
@@ -146,6 +190,7 @@ static int bq25710_adc_start(int chgnum, int adc_en_mask)
return EC_SUCCESS;
}
+#endif //CONFIG_USB_PD_VBUS_MEASURE_CHARGER
#endif
static void bq25710_init(int chgnum)
@@ -161,22 +206,26 @@ static void bq25710_init(int chgnum)
* MIN_SYSTEM_VOLTAGE register prior to setting the reset so that the
* correct value is preserved. In order to have the correct value read,
* the bq25710 must not be in low power mode, otherwise the VDDA rail
- * may not be powered if AC is not connected.
+ * may not be powered if AC is not connected. Note, this reset is only
+ * required when running out of RO and not following sysjump to RW.
*/
- rv = bq25710_set_low_power_mode(chgnum, 0);
- /* Allow enough time for VDDA to be powered */
- msleep(BQ25710_VDDA_STARTUP_DELAY_MSEC);
- rv |= raw_read16(chgnum, BQ25710_REG_MIN_SYSTEM_VOLTAGE, &vsys);
- rv |= raw_read16(chgnum, BQ25710_REG_CHARGE_OPTION_3, &reg);
- if (!rv) {
- reg |= BQ25710_CHARGE_OPTION_3_RESET_REG;
- /* Set all registers to default values */
- raw_write16(chgnum, BQ25710_REG_CHARGE_OPTION_3, reg);
- /* Restore VSYS_MIN voltage to POR reset value */
- raw_write16(chgnum, BQ25710_REG_MIN_SYSTEM_VOLTAGE, vsys);
+ if (!system_is_in_rw()) {
+ rv = bq25710_set_low_power_mode(chgnum, 0);
+ /* Allow enough time for VDDA to be powered */
+ msleep(BQ25710_VDDA_STARTUP_DELAY_MSEC);
+ rv |= raw_read16(chgnum, BQ25710_REG_MIN_SYSTEM_VOLTAGE, &vsys);
+ rv |= raw_read16(chgnum, BQ25710_REG_CHARGE_OPTION_3, &reg);
+ if (!rv) {
+ reg |= BQ25710_CHARGE_OPTION_3_RESET_REG;
+ /* Set all registers to default values */
+ raw_write16(chgnum, BQ25710_REG_CHARGE_OPTION_3, reg);
+ /* Restore VSYS_MIN voltage to POR reset value */
+ raw_write16(chgnum, BQ25710_REG_MIN_SYSTEM_VOLTAGE,
+ vsys);
+ }
+ /* Reenable low power mode */
+ bq25710_set_low_power_mode(chgnum, 1);
}
- /* Reenable low power mode */
- bq25710_set_low_power_mode(chgnum, 1);
if (!raw_read16(chgnum, BQ25710_REG_PROCHOT_OPTION_1, &reg)) {
/* Disable VDPM prochot profile at initialization */
@@ -401,12 +450,18 @@ static int bq25710_get_vbus_voltage(int chgnum, int port)
* LSB => 64mV.
* Return 0 when VBUS <= 3.2V as ADC can't measure it.
*/
- return reg ?
+ *voltage = reg ?
(reg * BQ25710_ADC_VBUS_STEP_MV + BQ25710_ADC_VBUS_BASE_MV) : 0;
error:
- CPRINTF("Could not read VBUS ADC! Error: %d\n", rv);
- return 0;
+ if (rv)
+ CPRINTF("Could not read VBUS ADC! Error: %d\n", rv);
+ return rv;
+}
+#else
+static int bq25710_get_vbus_voltage(int chgnum, int port)
+{
+ return EC_ERROR_UNIMPLEMENTED;
}
#endif
@@ -430,13 +485,20 @@ static void bq25710_chg_ramp_handle(void)
/*
* Once the charge ramp is stable write back the stable ramp
- * current to input current register.
+ * current to the host input current limit register
*/
+ ramp_curr = chg_ramp_get_current_limit();
if (chg_ramp_is_stable()) {
- ramp_curr = chg_ramp_get_current_limit();
if (ramp_curr && !charger_set_input_current(ramp_curr))
- CPRINTF("stable ramp current=%d\n", ramp_curr);
+ CPRINTF("bq25710: stable ramp current=%d\n", ramp_curr);
+ } else {
+ CPRINTF("bq25710: ICO stall, ramp current=%d\n", ramp_curr);
}
+ /*
+ * Disable ICO mode. When ICO mode is active the input current limit is
+ * given by the value in register IIN_DPM (0x22)
+ */
+ charger_set_hw_ramp(0);
}
DECLARE_DEFERRED(bq25710_chg_ramp_handle);
@@ -495,9 +557,7 @@ static int bq25710_ramp_is_stable(int chgnum)
static int bq25710_ramp_get_current_limit(int chgnum)
{
- int reg;
- int mode;
- int tries_left = 8;
+ int reg, rv;
rv = raw_read16(chgnum, BQ25710_REG_IIN_DPM, &reg);
if (rv) {
@@ -506,9 +566,10 @@ static int bq25710_ramp_get_current_limit(int chgnum)
return 0;
}
- /* Exit low power mode so ADC conversion takes typical time */
- if (bq25710_set_low_power_mode(0))
- goto error;
+ return ((reg >> BQ25710_IIN_DPM_BIT_SHIFT) * BQ25710_IIN_DPM_STEP_MA +
+ BQ25710_IIN_DPM_STEP_MA);
+}
+#endif /* CONFIG_CHARGE_RAMP_HW */
#ifdef CONFIG_CHARGER_BQ25710_IDCHG_LIMIT_MA
/* Called on AP S5 -> S3 and S3/S0iX -> S0 transition */
@@ -519,15 +580,6 @@ static void bq25710_chipset_startup(void)
DECLARE_HOOK(HOOK_CHIPSET_STARTUP, bq25710_chipset_startup, HOOK_PRIO_DEFAULT);
DECLARE_HOOK(HOOK_CHIPSET_RESUME, bq25710_chipset_startup, HOOK_PRIO_DEFAULT);
- /*
- * Wait until the ADC operation completes. The spec says typical
- * conversion time is 10 msec. If low power mode isn't exited first,
- * then the conversion time jumps to ~60 msec.
- */
- do {
- msleep(2);
- raw_read16(BQ25710_REG_ADC_OPTION, &reg);
- } while (--tries_left && (reg & BQ25710_ADC_OPTION_ADC_START));
/* Called on AP S0 -> S0iX/S3 or S3 -> S5 transition */
static void bq25710_chipset_suspend(void)
diff --git a/driver/charger/bq25710.h b/driver/charger/bq25710.h
index 41c7de5798..5d8b4a92fe 100644
--- a/driver/charger/bq25710.h
+++ b/driver/charger/bq25710.h
@@ -8,6 +8,12 @@
#ifndef __CROS_EC_BQ25710_H
#define __CROS_EC_BQ25710_H
+#ifdef CONFIG_CHARGER_SENSE_RESISTOR_AC_BQ25710
+ #undef CONFIG_CHARGER_SENSE_RESISTOR_AC
+ #define CONFIG_CHARGER_SENSE_RESISTOR_AC \
+ CONFIG_CHARGER_SENSE_RESISTOR_AC_BQ25710
+#endif
+
/* SMBUS Interface */
#define BQ25710_SMBUS_ADDR1 0x12
@@ -44,10 +50,14 @@
#define BQ25710_CHARGE_OPTION_0_CHRG_INHIBIT (1 << 0)
/* ChargeOption2 Register */
-#define BQ25710_CHARGE_OPTION_2_EN_EXTILIM (1 << 7)
+#define BQ25710_CHARGE_OPTION_2_EN_EXTILIM BIT(7)
+#define BQ25710_CHARGE_OPTION_2_TMAX_SHIFT 8
+#define BQ25710_CHARGE_OPTION_2_TMAX_MASK (0x3 << \
+ BQ25710_CHARGE_OPTION_2_TMAX_SHIFT)
/* ChargeOption3 Register */
-#define BQ25710_CHARGE_OPTION_3_EN_ICO_MODE (1 << 11)
+#define BQ25710_CHARGE_OPTION_3_RESET_REG BIT(14)
+#define BQ25710_CHARGE_OPTION_3_EN_ICO_MODE BIT(11)
/* ChargeStatus Register */
#define BQ25710_CHARGE_STATUS_ICO_DONE (1 << 14)
diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c
index ec44793d37..d218e7f9ff 100644
--- a/driver/charger/isl923x.c
+++ b/driver/charger/isl923x.c
@@ -23,6 +23,17 @@
#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
+
+#ifdef CONFIG_CHARGER_SENSE_RESISTOR_AC_ISL9238
+ #undef CONFIG_CHARGER_SENSE_RESISTOR_AC
+ #define CONFIG_CHARGER_SENSE_RESISTOR_AC \
+ CONFIG_CHARGER_SENSE_RESISTOR_AC_ISL9238
+#endif
+
+
#define DEFAULT_R_AC 20
#define DEFAULT_R_SNS 10
#define R_AC CONFIG_CHARGER_SENSE_RESISTOR_AC
@@ -32,6 +43,44 @@
#define AC_REG_TO_CURRENT(REG) ((REG) * DEFAULT_R_AC / R_AC)
#define AC_CURRENT_TO_REG(CUR) ((CUR) * R_AC / DEFAULT_R_AC)
+#if defined(CONFIG_CHARGER_ISL9237)
+#define CHARGER_NAME "isl9237"
+#define CHARGE_V_MAX ISL9237_SYS_VOLTAGE_REG_MAX
+#define CHARGE_V_MIN ISL923X_SYS_VOLTAGE_REG_MIN
+#define CHARGE_V_STEP 8
+#elif defined(CONFIG_CHARGER_ISL9238)
+#define CHARGER_NAME "isl9238"
+#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
+#define CHARGE_V_MIN RAA489000_SYS_VOLTAGE_REG_MIN
+#define CHARGE_V_STEP 64
+#endif
+
+#ifdef CONFIG_CHARGER_RAA489000
+#define CHARGE_I_MAX RAA489000_CURRENT_REG_MAX
+#else
+#define CHARGE_I_MAX ISL923X_CURRENT_REG_MAX
+#endif /* CONFIG_CHARGER_RAA489000 */
+#define CHARGE_I_MIN 4
+#define CHARGE_I_OFF 0
+#define CHARGE_I_STEP 4
+#ifdef CONFIG_CHARGER_RAA489000
+#define INPUT_I_MAX RAA489000_CURRENT_REG_MAX
+#else
+#define INPUT_I_MAX ISL923X_CURRENT_REG_MAX
+#endif /* CONFIG_CHARGER_RAA489000 */
+#define INPUT_I_MIN 4
+#define INPUT_I_STEP 4
+
/* Console output macros */
#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args)
diff --git a/driver/charger/isl923x.h b/driver/charger/isl923x.h
index fb76f55432..586e92aa7b 100644
--- a/driver/charger/isl923x.h
+++ b/driver/charger/isl923x.h
@@ -282,26 +282,6 @@ enum isl9237_fsm_state {
#define ISL923X_INFO_DCHOT (1 << 11)
#define ISL9237_INFO_ACHOT (1 << 12)
-#if defined(CONFIG_CHARGER_ISL9237)
-#define CHARGER_NAME "isl9237"
-#define CHARGE_V_MAX ISL9237_SYS_VOLTAGE_REG_MAX
-#define CHARGE_V_MIN ISL923X_SYS_VOLTAGE_REG_MIN
-#define CHARGE_V_STEP 8
-#elif defined(CONFIG_CHARGER_ISL9238)
-#define CHARGER_NAME "isl9238"
-#define CHARGE_V_MAX ISL9238_SYS_VOLTAGE_REG_MAX
-#define CHARGE_V_MIN ISL923X_SYS_VOLTAGE_REG_MIN
-#define CHARGE_V_STEP 8
-#endif
-
-#define CHARGE_I_MAX ISL923X_CURRENT_REG_MAX
-#define CHARGE_I_MIN 4
-#define CHARGE_I_OFF 0
-#define CHARGE_I_STEP 4
-#define INPUT_I_MAX ISL923X_CURRENT_REG_MAX
-#define INPUT_I_MIN 4
-#define INPUT_I_STEP 4
-
#undef I2C_ADDR_CHARGER
#define I2C_ADDR_CHARGER ISL923X_ADDR
diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c
index 6a30f6b6ef..4a9a37a239 100644
--- a/driver/charger/rt946x.c
+++ b/driver/charger/rt946x.c
@@ -26,6 +26,19 @@
#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args)
/* Charger parameters */
+#define CHARGER_NAME RT946X_CHARGER_NAME
+#define CHARGE_V_MAX 4710
+#define CHARGE_V_MIN 3900
+#define CHARGE_V_STEP 10
+#define CHARGE_I_MAX 5000
+#define CHARGE_I_MIN 100
+#define CHARGE_I_OFF 0
+#define CHARGE_I_STEP 100
+#define INPUT_I_MAX 3250
+#define INPUT_I_MIN 100
+#define INPUT_I_STEP 50
+
+/* Charger parameters */
static const struct charger_info rt946x_charger_info = {
.name = CHARGER_NAME,
.voltage_max = CHARGE_V_MAX,
diff --git a/driver/charger/rt946x.h b/driver/charger/rt946x.h
index 9d9cf4d8bd..c9b3540a0c 100644
--- a/driver/charger/rt946x.h
+++ b/driver/charger/rt946x.h
@@ -8,19 +8,6 @@
#ifndef __CROS_EC_RT946X_H
#define __CROS_EC_RT946X_H
-/* Charger parameters */
-#define CHARGER_NAME RT946X_CHARGER_NAME
-#define CHARGE_V_MAX 4710
-#define CHARGE_V_MIN 3900
-#define CHARGE_V_STEP 10
-#define CHARGE_I_MAX 5000
-#define CHARGE_I_MIN 100
-#define CHARGE_I_OFF 0
-#define CHARGE_I_STEP 100
-#define INPUT_I_MAX 3250
-#define INPUT_I_MIN 100
-#define INPUT_I_STEP 50
-
/* Registers for rt9466, rt9467 */
#if defined(CONFIG_CHARGER_RT9466) || defined(CONFIG_CHARGER_RT9467)
#define RT946X_REG_CORECTRL0 0x00