summaryrefslogtreecommitdiff
path: root/driver/charger/isl923x.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /driver/charger/isl923x.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14526.57.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'driver/charger/isl923x.c')
-rw-r--r--driver/charger/isl923x.c1471
1 files changed, 0 insertions, 1471 deletions
diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c
deleted file mode 100644
index 9e3284c29f..0000000000
--- a/driver/charger/isl923x.c
+++ /dev/null
@@ -1,1471 +0,0 @@
-/* Copyright 2015 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Intersil ISL-9237/8 battery charger driver.
- */
-
-#include "adc.h"
-#include "battery.h"
-#include "battery_smart.h"
-#include "charge_state_v2.h"
-#include "charger.h"
-#include "compile_time_macros.h"
-#include "console.h"
-#include "common.h"
-#include "hooks.h"
-#include "i2c.h"
-#include "isl923x.h"
-#include "ocpc.h"
-#include "system.h"
-#include "task.h"
-#include "timer.h"
-#include "usb_pd_tcpm.h"
-#include "util.h"
-
-#ifndef CONFIG_CHARGER_NARROW_VDC
-#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
-#define R_SNS CONFIG_CHARGER_SENSE_RESISTOR
-#define REG_TO_CURRENT(REG) ((REG) * DEFAULT_R_SNS / R_SNS)
-#define CURRENT_TO_REG(CUR) ((CUR) * R_SNS / DEFAULT_R_SNS)
-#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 8
-#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)
-#define CPRINTS(format, args...) cprints(CC_CHARGER, format, ## args)
-
-enum isl923x_amon_bmon { AMON, BMON };
-enum isl923x_mon_dir { MON_CHARGE = 0, MON_DISCHARGE = 1 };
-
-static int learn_mode;
-
-/* Mutex for CONTROL1 register, that can be updated from multiple tasks. */
-K_MUTEX_DEFINE(control1_mutex);
-
-static enum ec_error_list isl923x_discharge_on_ac(int chgnum, int enable);
-
-/* Charger parameters */
-static const struct charger_info isl9237_charger_info = {
- .name = CHARGER_NAME,
- .voltage_max = CHARGE_V_MAX,
- .voltage_min = CHARGE_V_MIN,
- .voltage_step = CHARGE_V_STEP,
- .current_max = REG_TO_CURRENT(CHARGE_I_MAX),
- .current_min = REG_TO_CURRENT(CHARGE_I_MIN),
- .current_step = REG_TO_CURRENT(CHARGE_I_STEP),
- .input_current_max = AC_REG_TO_CURRENT(INPUT_I_MAX),
- .input_current_min = AC_REG_TO_CURRENT(INPUT_I_MIN),
- .input_current_step = AC_REG_TO_CURRENT(INPUT_I_STEP),
-};
-
-static inline enum ec_error_list raw_read8(int chgnum, int offset, int *value)
-{
- return i2c_read8(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- offset, value);
-}
-
-static inline enum ec_error_list raw_read16(int chgnum, int offset, int *value)
-{
- return i2c_read16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- offset, value);
-}
-
-static inline enum ec_error_list raw_write16(int chgnum, int offset, int value)
-{
- return i2c_write16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- offset, value);
-}
-
-static inline enum ec_error_list raw_update16(int chgnum, int offset, int mask,
- enum mask_update_action action)
-{
- return i2c_update16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- offset, mask, action);
-}
-
-static enum ec_error_list isl9237_set_current(int chgnum, uint16_t current)
-{
- return raw_write16(chgnum, ISL923X_REG_CHG_CURRENT,
- CURRENT_TO_REG(current));
-}
-
-static enum ec_error_list isl9237_set_voltage(int chgnum, uint16_t voltage)
-{
- return raw_write16(chgnum, ISL923X_REG_SYS_VOLTAGE_MAX, voltage);
-}
-
-/* chip specific interfaces */
-
-static enum ec_error_list isl923x_set_input_current_limit(int chgnum,
- int input_current)
-{
- int rv;
- uint16_t reg = AC_CURRENT_TO_REG(input_current);
-
- rv = raw_write16(chgnum, ISL923X_REG_ADAPTER_CURRENT_LIMIT1, reg);
- if (rv)
- return rv;
-
- return raw_write16(chgnum, ISL923X_REG_ADAPTER_CURRENT_LIMIT2, reg);
-}
-
-#ifdef CONFIG_CMD_CHARGER_ADC_AMON_BMON
-static int get_amon_bmon(int chgnum, enum isl923x_amon_bmon amon,
- enum isl923x_mon_dir direction, int *adc)
-{
- int reg, 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;
- }
-
- mutex_lock(&control1_mutex);
-
- ret = raw_read16(chgnum, ISL923X_REG_CONTROL1, &reg);
- if (!ret) {
- /* Switch between AMON/BMON */
- if (amon == AMON)
- reg &= ~ISL923X_C1_SELECT_BMON;
- else
- reg |= ISL923X_C1_SELECT_BMON;
-
- /* Enable monitor */
- reg &= ~ISL923X_C1_DISABLE_MON;
- ret = raw_write16(chgnum, ISL923X_REG_CONTROL1, reg);
- }
-
- mutex_unlock(&control1_mutex);
-
- if (ret)
- return ret;
-
- *adc = adc_read_channel(ADC_AMON_BMON);
-
- return ret;
-}
-#endif
-
-static enum ec_error_list isl923x_get_input_current_limit(int chgnum,
- int *input_current)
-{
- int rv;
- int regval;
-
- rv = raw_read16(chgnum, ISL923X_REG_ADAPTER_CURRENT_LIMIT1, &regval);
- if (rv)
- return rv;
-
- *input_current = AC_REG_TO_CURRENT(regval);
- return EC_SUCCESS;
-}
-
-#ifdef CONFIG_CHARGER_RAA489000
-static enum ec_error_list raa489000_get_input_current(int chgnum,
- int *input_current)
-{
- int rv;
- int regval;
- int reg;
-
- reg = RAA489000_REG_ADC_INPUT_CURRENT;
-
- rv = raw_read16(chgnum, reg, &regval);
- if (rv)
- return rv;
-
- /* The value is in 22.2mA increments. */
- regval *= 222;
- regval /= 10;
-
- *input_current = AC_REG_TO_CURRENT(regval);
- return EC_SUCCESS;
-}
-#elif defined(CONFIG_CMD_CHARGER_ADC_AMON_BMON)
-static enum ec_error_list isl923x_get_input_current(int chgnum,
- int *input_current)
-{
- int rv, adc;
-
- rv = get_amon_bmon(chgnum, AMON, MON_CHARGE, &adc);
- if (rv)
- return rv;
-
- *input_current = adc / CONFIG_CHARGER_SENSE_RESISTOR_AC;
-
- return EC_SUCCESS;
-}
-#endif /* CONFIG_CHARGER_RAA489000 */
-
-#if defined(CONFIG_CHARGER_OTG) && defined(CHARGER_ISL9238X)
-static enum ec_error_list isl923x_enable_otg_power(int chgnum, int enabled)
-{
- int rv, control1;
-
- mutex_lock(&control1_mutex);
-
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL1, &control1);
- if (rv)
- goto out;
-
- if (enabled)
- control1 |= ISL923X_C1_OTG;
- else
- control1 &= ~ISL923X_C1_OTG;
-
- rv = raw_write16(chgnum, ISL923X_REG_CONTROL1, control1);
-
-out:
- mutex_unlock(&control1_mutex);
-
- return rv;
-}
-
-/*
- * TODO(b:67920792): OTG is not implemented for ISL9237 that has different
- * register scale and range.
- */
-static enum ec_error_list isl923x_set_otg_current_voltage(int chgnum,
- int output_current,
- int output_voltage)
-{
- int rv;
- uint16_t volt_reg = (output_voltage / ISL9238_OTG_VOLTAGE_STEP)
- << ISL9238_OTG_VOLTAGE_SHIFT;
- uint16_t current_reg =
- DIV_ROUND_UP(output_current, ISL923X_OTG_CURRENT_STEP)
- << ISL923X_OTG_CURRENT_SHIFT;
-
- if (output_current < 0 || output_current > ISL923X_OTG_CURRENT_MAX ||
- output_voltage > ISL9238_OTG_VOLTAGE_MAX)
- return EC_ERROR_INVAL;
-
- /* Set voltage. */
- rv = raw_write16(chgnum, ISL923X_REG_OTG_VOLTAGE, volt_reg);
- if (rv)
- return rv;
-
- /* Set current. */
- return raw_write16(chgnum, ISL923X_REG_OTG_CURRENT, current_reg);
-}
-#endif /* CONFIG_CHARGER_OTG && CHARGER_ISL9238X */
-
-static enum ec_error_list isl923x_manufacturer_id(int chgnum, int *id)
-{
- int rv;
- int reg;
-
- rv = raw_read16(chgnum, ISL923X_REG_MANUFACTURER_ID, &reg);
- if (rv)
- return rv;
-
- *id = reg;
- return EC_SUCCESS;
-}
-
-static enum ec_error_list isl923x_device_id(int chgnum, int *id)
-{
- int rv;
- int reg;
-
- rv = raw_read16(chgnum, ISL923X_REG_DEVICE_ID, &reg);
- if (rv)
- return rv;
-
- *id = reg;
- return EC_SUCCESS;
-}
-
-static enum ec_error_list isl923x_get_option(int chgnum, int *option)
-{
- int rv;
- uint32_t controls;
- int reg;
-
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL0, &reg);
- if (rv)
- return rv;
-
- controls = reg;
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL1, &reg);
- if (rv)
- return rv;
-
- controls |= reg << 16;
- *option = controls;
- return EC_SUCCESS;
-}
-
-static enum ec_error_list isl923x_set_option(int chgnum, int option)
-{
- int rv;
- uint16_t reg;
-
- reg = option & 0xffff;
- rv = raw_write16(chgnum, ISL923X_REG_CONTROL0, reg);
-
- if (rv)
- return rv;
-
- reg = (option >> 16) & 0xffff;
- return raw_write16(chgnum, ISL923X_REG_CONTROL1, reg);
-}
-
-/* Charger interfaces */
-
-static const struct charger_info *isl923x_get_info(int chgnum)
-{
- return &isl9237_charger_info;
-}
-
-static enum ec_error_list isl923x_get_status(int chgnum, int *status)
-{
- *status = CHARGER_LEVEL_2;
-
- return EC_SUCCESS;
-}
-
-static enum ec_error_list isl923x_set_mode(int chgnum, int mode)
-{
- int rv = EC_SUCCESS;
-
- /*
- * See crosbug.com/p/51196. Always disable learn mode unless it was set
- * explicitly.
- */
- if (!learn_mode)
- rv = isl923x_discharge_on_ac(chgnum, 0);
-
- /* ISL923X does not support inhibit mode setting. */
- return rv;
-}
-
-#ifdef CONFIG_CHARGER_RAA489000
-static enum ec_error_list raa489000_get_actual_current(int chgnum, int *current)
-{
- int rv;
- int reg;
-
- rv = raw_read16(chgnum, RAA489000_REG_ADC_CHARGE_CURRENT, &reg);
- /* The value is in 22.2mA increments. */
- reg *= 222;
- reg /= 10;
-
- *current = REG_TO_CURRENT(reg);
- return rv;
-}
-#endif /* CONFIG_CHARGER_RAA489000 */
-
-static enum ec_error_list isl923x_get_current(int chgnum, int *current)
-{
- int rv;
- int reg;
-
- rv = raw_read16(chgnum, ISL923X_REG_CHG_CURRENT, &reg);
- if (rv)
- return rv;
-
- *current = REG_TO_CURRENT(reg);
- return EC_SUCCESS;
-}
-
-static enum ec_error_list isl923x_set_current(int chgnum, int current)
-{
- return isl9237_set_current(chgnum, current);
-}
-
-#ifdef CONFIG_CHARGER_RAA489000
-static enum ec_error_list raa489000_get_actual_voltage(int chgnum, int *voltage)
-{
- int rv;
- int reg;
-
- rv = raw_read16(chgnum, RAA489000_REG_ADC_VSYS, &reg);
- if (rv)
- return rv;
-
- /* The voltage is returned in bits 13:6. LSB is 96mV. */
- reg &= GENMASK(13, 6);
- reg >>= 6;
- reg *= 96;
-
- *voltage = reg;
- return EC_SUCCESS;
-}
-#endif /* CONFIG_CHARGER_RAA489000 */
-
-static enum ec_error_list isl923x_get_voltage(int chgnum, int *voltage)
-{
- return raw_read16(chgnum, ISL923X_REG_SYS_VOLTAGE_MAX, voltage);
-}
-
-static enum ec_error_list isl923x_set_voltage(int chgnum, int voltage)
-{
- /* The ISL923X will drop voltage to as low as requested. As the
- * charger state machine will pass in 0 voltage, protect the system
- * voltage by capping to the minimum. The reason is that the ISL923X
- * only can regulate the system voltage which will kill the board's
- * power if below 0. */
- if (voltage == 0) {
- const struct battery_info *bi = battery_get_info();
- voltage = bi->voltage_min;
- }
-
- return isl9237_set_voltage(chgnum, voltage);
-}
-
-static enum ec_error_list isl923x_post_init(int chgnum)
-{
- /*
- * charger_post_init() is called every time AC becomes present in the
- * system. It's called this frequently because there are some charger
- * ICs which become unpowered when AC is not present. Therefore, upon
- * AC becoming present again, the chargers need to be reinitialized.
- * The ISL9237/8 can be powered from VSYS and therefore do not need to
- * be reinitialized everytime. This is why isl923x_init() is called
- * once at HOOK_INIT time.
- */
- return EC_SUCCESS;
-}
-
-int isl923x_set_ac_prochot(int chgnum, uint16_t ma)
-{
- int rv;
-
- if (ma > ISL923X_AC_PROCHOT_CURRENT_MAX) {
- CPRINTS("%s: invalid current (%d mA)", CHARGER_NAME, ma);
- return EC_ERROR_INVAL;
- }
-
- rv = raw_write16(chgnum, ISL923X_REG_PROCHOT_AC, AC_CURRENT_TO_REG(ma));
- if (rv)
- CPRINTS("%s set_ac_prochot failed (%d)", CHARGER_NAME, rv);
- return rv;
-}
-
-int isl923x_set_dc_prochot(int chgnum, uint16_t ma)
-{
- int rv;
-
- if (ma > ISL923X_DC_PROCHOT_CURRENT_MAX) {
- CPRINTS("%s: invalid current (%d mA)", CHARGER_NAME, ma);
- return EC_ERROR_INVAL;
- }
-
- rv = raw_write16(chgnum, ISL923X_REG_PROCHOT_DC, CURRENT_TO_REG(ma));
- if (rv)
- CPRINTS("%s set_dc_prochot failed (%d)", CHARGER_NAME, rv);
- return rv;
-}
-
-int isl923x_set_comparator_inversion(int chgnum, int invert)
-{
- int rv;
- int regval;
-
- rv = i2c_read16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- ISL923X_REG_CONTROL2, &regval);
- if (invert)
- regval |= ISL923X_C2_INVERT_CMOUT;
- else
- regval &= ~ISL923X_C2_INVERT_CMOUT;
-
- if (!rv)
- rv |= i2c_write16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- ISL923X_REG_CONTROL2, regval);
-
- if (rv)
- CPRINTS("%s (%d) set_comparator_inversion failed (rv: %d)",
- CHARGER_NAME, chgnum, rv);
-
- return rv;
-}
-
-static void isl923x_init(int chgnum)
-{
- int reg;
- const struct battery_info *bi = battery_get_info();
- int precharge_voltage = bi->precharge_voltage ?
- bi->precharge_voltage : bi->voltage_min;
-
- if (IS_ENABLED(CONFIG_CHARGER_RAA489000)) {
- if (CONFIG_CHARGER_SENSE_RESISTOR ==
- CONFIG_CHARGER_SENSE_RESISTOR_AC) {
- /*
- * A 1:1 ratio for Rs1:Rs2 is allowed, but Control4
- * register Bit<11> must be set.
- */
- if (raw_read16(chgnum, ISL9238_REG_CONTROL4, &reg))
- goto init_fail;
-
- if (raw_write16(chgnum, ISL9238_REG_CONTROL4,
- reg |
- RAA489000_C4_PSYS_RSNS_RATIO_1_TO_1))
- goto init_fail;
- }
-
- /*
- * Enable hysteresis for CCM/DCM boundary to help with ripple.
- */
- if (raw_read16(chgnum, ISL9238_REG_CONTROL3, &reg))
- goto init_fail;
-
- if (raw_write16(chgnum, ISL9238_REG_CONTROL3,
- reg |
- RAA489000_C3_DCM_CCM_HYSTERESIS_ENABLE))
- goto init_fail;
-
- /* Set switching frequency to 600KHz to help with ripple. */
- if (raw_read16(chgnum, ISL923X_REG_CONTROL1, &reg))
- goto init_fail;
-
- reg &= ~ISL923X_C1_SWITCH_FREQ_MASK;
-
- if (raw_write16(chgnum, ISL923X_REG_CONTROL1,
- reg |
- ISL9237_C1_SWITCH_FREQ_599K))
- goto init_fail;
- }
-
- if (IS_ENABLED(CONFIG_TRICKLE_CHARGING))
- if (raw_write16(chgnum, ISL923X_REG_SYS_VOLTAGE_MIN,
- precharge_voltage))
- goto init_fail;
-
- /*
- * [10:9]: Prochot# Debounce time
- * 11b: 1ms
- */
- if (raw_read16(chgnum, ISL923X_REG_CONTROL2, &reg))
- goto init_fail;
-
- if (!IS_ENABLED(CONFIG_CHARGER_RAA489000))
- reg |= ISL923X_C2_OTG_DEBOUNCE_150;
-
- if (IS_ENABLED(CONFIG_CHARGER_RAA489000))
- reg |= ISL923X_C2_PROCHOT_DEBOUNCE_500;
- else
- reg |= ISL923X_C2_PROCHOT_DEBOUNCE_1000;
-
- if (raw_write16(chgnum, ISL923X_REG_CONTROL2,
- reg |
- ISL923X_C2_ADAPTER_DEBOUNCE_150))
- goto init_fail;
-
- if (IS_ENABLED(CONFIG_CHARGE_RAMP_HW)) {
- if (IS_ENABLED(CONFIG_CHARGER_ISL9237)) {
- if (raw_read16(chgnum, ISL923X_REG_CONTROL0, &reg))
- goto init_fail;
-
- /*
- * Set input voltage regulation reference voltage for
- * charge ramp.
- */
- reg &= ~ISL9237_C0_VREG_REF_MASK;
- reg |= ISL9237_C0_VREG_REF_4200;
-
- if (raw_write16(chgnum, ISL923X_REG_CONTROL0, reg))
- goto init_fail;
- } else {
- /*
- * For the ISL9238, set the input voltage regulation to
- * 4.439V. Note, the voltage is set in 341.3 mV steps.
- *
- * For the RAA489000, set the input voltage regulation
- * to 4.437V. Note, that the voltage is set in 85.33 mV
- * steps.
- */
- if (IS_ENABLED(CONFIG_CHARGER_RAA489000))
- reg = (4437 / RAA489000_INPUT_VOLTAGE_REF_STEP)
- << RAA489000_INPUT_VOLTAGE_REF_SHIFT;
- else
- reg = (4439 / ISL9238_INPUT_VOLTAGE_REF_STEP)
- << ISL9238_INPUT_VOLTAGE_REF_SHIFT;
-
- if (raw_write16(chgnum, ISL9238_REG_INPUT_VOLTAGE, reg))
- goto init_fail;
- }
- } else {
- if (raw_read16(chgnum, ISL923X_REG_CONTROL0, &reg))
- goto init_fail;
-
- /* Disable voltage regulation loop to disable charge ramp */
- reg |= ISL923X_C0_DISABLE_VREG;
-
- if (raw_write16(chgnum, ISL923X_REG_CONTROL0, reg))
- goto init_fail;
- }
-
- 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(CONFIG_CHARGER_RAA489000)) {
- /*
- * Return the BFET to normal operation as it may have been
- * turned off when entering hibernate.
- */
- if (raw_read16(chgnum, ISL923X_REG_CONTROL1, &reg))
- goto init_fail;
- reg &= ~RAA489000_C1_BGATE_FORCE_OFF;
- if (raw_write16(chgnum, ISL923X_REG_CONTROL1, reg))
- goto init_fail;
- }
-
- /* Revert all changes done by isl9238c_hibernate(). */
- if (IS_ENABLED(CONFIG_CHARGER_ISL9238C) && isl9238c_resume(chgnum))
- 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.
- * For the RAA489000, just don't reload ACLIM.
- */
- if (raw_read16(chgnum, ISL9238_REG_CONTROL3, &reg))
- goto init_fail;
- reg |= ISL9238_C3_NO_RELOAD_ACLIM_ON_ACIN;
- if (!IS_ENABLED(CONFIG_CHARGER_RAA489000))
- reg |= ISL9238_C3_NO_REREAD_PROG_PIN;
-
- /*
- * Disable autonomous charging initially since 1) it causes boot
- * loop issues with 2S batteries, and 2) it will automatically
- * get disabled as soon as we manually set the current limit
- * anyway.
- *
- * Note: This bit is inverted on the RAA489000.
- */
- if (IS_ENABLED(CONFIG_CHARGER_RAA489000))
- reg &= ~ISL9238_C3_DISABLE_AUTO_CHARING;
- else
- reg |= ISL9238_C3_DISABLE_AUTO_CHARING;
- if (raw_write16(chgnum, ISL9238_REG_CONTROL3, reg))
- goto init_fail;
-
- /*
- * No need to proceed with the rest of init if we sysjump'd to
- * this image as the input current limit has already been set.
- */
- if (system_jumped_late())
- return;
-
- /*
- * Initialize the input current limit to the board's default.
- */
- if (isl923x_set_input_current_limit(
- chgnum, CONFIG_CHARGER_INPUT_CURRENT))
- goto init_fail;
- }
-
-#ifdef CONFIG_OCPC
- if (IS_ENABLED(CONFIG_CHARGER_RAA489000)) {
- /*
- * Ignore BATGONE on auxiliary charger ICs as it's not connected
- * there.
- * Clear DISABLE_GP_CMP & MCU_LDO_BAT_STATE_DISABLE to
- * enable ALERT_B with control the power of sub-board
- */
- if (chgnum != CHARGER_PRIMARY) {
- if (raw_read16(chgnum, ISL9238_REG_CONTROL4, &reg))
- goto init_fail;
-
- reg |= RAA489000_C4_BATGONE_DISABLE;
- reg &= ~RAA489000_C4_DISABLE_GP_CMP;
-
- if (raw_write16(chgnum, ISL9238_REG_CONTROL4, reg))
- goto init_fail;
-
- if (raw_read16(chgnum, RAA489000_REG_CONTROL8, &reg))
- goto init_fail;
-
- reg &= ~RAA489000_C8_MCU_LDO_BAT_STATE_DISABLE;
-
- if (raw_write16(chgnum, RAA489000_REG_CONTROL8, reg))
- goto init_fail;
- }
- }
-#endif /* CONFIG_OCPC */
-
- return;
-init_fail:
- CPRINTS("%s init failed!", CHARGER_NAME);
-}
-
-static enum ec_error_list isl923x_discharge_on_ac(int chgnum, int enable)
-{
- int rv;
- int control1;
-
- mutex_lock(&control1_mutex);
-
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL1, &control1);
- if (rv)
- goto out;
-
- control1 &= ~ISL923X_C1_LEARN_MODE_AUTOEXIT;
- if (enable)
- control1 |= ISL923X_C1_LEARN_MODE_ENABLE;
- else
- control1 &= ~ISL923X_C1_LEARN_MODE_ENABLE;
-
- rv = raw_write16(chgnum, ISL923X_REG_CONTROL1, control1);
-
- learn_mode = !rv && enable;
-
-out:
- mutex_unlock(&control1_mutex);
- return rv;
-}
-
-#ifdef CONFIG_CHARGER_RAA489000
-enum ec_error_list raa489000_is_acok(int chgnum, bool *acok)
-{
- int regval, rv;
-
- if ((chgnum < 0) || (chgnum > board_get_charger_chip_count())) {
- CPRINTS("%s: Invalid chgnum! (%d)", __func__, chgnum);
- return EC_ERROR_INVAL;
- }
-
- rv = raw_read16(chgnum, ISL9238_REG_INFO2, &regval);
- if (rv != EC_SUCCESS)
- return rv;
- *acok = (regval & RAA489000_INFO2_ACOK);
-
- return EC_SUCCESS;
-}
-
-int raa489000_enable_asgate(int chgnum, bool enable)
-{
- enum mask_update_action action = enable ? MASK_SET : MASK_CLR;
-
- return raw_update16(chgnum, RAA489000_REG_CONTROL8,
- RAA489000_C8_ASGATE_ON_READY, action);
-}
-
-void raa489000_hibernate(int chgnum, bool disable_adc)
-{
- int rv, regval;
-
- if ((chgnum < 0) || (chgnum > board_get_charger_chip_count())) {
- CPRINTS("%s: Invalid chgnum! (%d)", __func__, chgnum);
- return;
- }
-
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL0, &regval);
- if (!rv) {
- /* set BGATE to normal operation */
- regval &= ~RAA489000_C0_BGATE_FORCE_ON;
-
- /* set normal charge pump operation */
- regval &= ~RAA489000_C0_EN_CHG_PUMPS_TO_100PCT;
-
- rv = raw_write16(chgnum, ISL923X_REG_CONTROL0, regval);
- }
- if (rv)
- CPRINTS("%s(%d): Failed to set Control0!", __func__, chgnum);
-
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL1, &regval);
- if (!rv) {
- /* Disable Supplemental support */
- regval &= ~RAA489000_C1_ENABLE_SUPP_SUPPORT_MODE;
-
- /*
- * Force BGATE off. For devices that utilize the Z-state, the
- * LDO will be powered through the BFET's body diode.
- */
- regval |= RAA489000_C1_BGATE_FORCE_OFF;
-
- /* Disable AMON/BMON */
- regval |= ISL923X_C1_DISABLE_MON;
-
- /* Disable PSYS */
- regval &= ~ISL923X_C1_ENABLE_PSYS;
-
- rv = raw_write16(chgnum, ISL923X_REG_CONTROL1, regval);
- }
- if (rv)
- CPRINTS("%s(%d): Failed to set Control1!", __func__, chgnum);
-
- rv = raw_read16(chgnum, ISL9238_REG_CONTROL3, &regval);
- if (!rv) {
- if (disable_adc)
- /* ADC is active only when adapter plugged in */
- regval &= ~RAA489000_ENABLE_ADC;
- else
- regval |= RAA489000_ENABLE_ADC;
-
- rv = raw_write16(chgnum, ISL9238_REG_CONTROL3, regval);
- }
- if (rv)
- CPRINTS("%s(%d): Failed to set Control3!", __func__, chgnum);
-
- rv = raw_read16(chgnum, ISL9238_REG_CONTROL4, &regval);
- if (!rv) {
- /* Disable GP comparator for battery only mode */
- regval |= RAA489000_C4_DISABLE_GP_CMP;
-
- rv = raw_write16(chgnum, ISL9238_REG_CONTROL4, regval);
- }
- if (rv)
- CPRINTS("%s(%d):Failed to set Control4!", __func__, chgnum);
-
-#ifdef CONFIG_OCPC
- /* The LDO is needed in the Z-state on the primary charger */
- if (chgnum != CHARGER_PRIMARY) {
- rv = raw_read16(chgnum, RAA489000_REG_CONTROL8, &regval);
- if (!rv) {
- /* Disable MCU LDO in battery state */
- regval |= RAA489000_C8_MCU_LDO_BAT_STATE_DISABLE;
-
- rv = raw_write16(chgnum, RAA489000_REG_CONTROL8,
- regval);
- }
- if (rv)
- CPRINTS("%s(%d):Failed to set Control8!", __func__,
- chgnum);
- }
-
- /* Disable DVC on the main charger to reduce power consumption. */
- if (chgnum == CHARGER_PRIMARY) {
- rv = raw_write16(chgnum, RAA489000_REG_CONTROL10, 0);
- if (rv)
- CPRINTS("%s(%d):Failed to set Control10!", __func__,
- chgnum);
- }
-#endif
-
- cflush();
-}
-#endif /* CONFIG_CHARGER_RAA489000 */
-
-#ifdef CONFIG_CHARGER_ISL9238C
-enum ec_error_list isl9238c_hibernate(int chgnum)
-{
- /* Disable IMON */
- RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1,
- ISL923X_C1_DISABLE_MON, MASK_SET));
-
- /* Disable PSYS */
- RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1,
- ISL923X_C1_ENABLE_PSYS, MASK_CLR));
-
- /* Disable GP comparator */
- RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL2,
- ISL923X_C2_COMPARATOR, MASK_SET));
-
- /* Force BGATE off */
- RETURN_ERROR(raw_update16(chgnum, ISL9238_REG_CONTROL3,
- ISL9238_C3_BGATE_OFF, MASK_SET));
-
-
- return EC_SUCCESS;
-}
-
-enum ec_error_list isl9238c_resume(int chgnum)
-{
- /* Revert everything in isl9238c_hibernate() */
- RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1,
- ISL923X_C1_DISABLE_MON, MASK_CLR));
-
- RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1,
- ISL923X_C1_ENABLE_PSYS, MASK_SET));
-
- RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL2,
- ISL923X_C2_COMPARATOR, MASK_CLR));
-
- RETURN_ERROR(raw_update16(chgnum, ISL9238_REG_CONTROL3,
- ISL9238_C3_BGATE_OFF, MASK_CLR));
-
- return EC_SUCCESS;
-}
-#endif /* CONFIG_CHARGER_ISL9238C */
-
-
-/*****************************************************************************/
-/* Hardware current ramping */
-
-#ifdef CONFIG_CHARGE_RAMP_HW
-static enum ec_error_list isl923x_set_hw_ramp(int chgnum, int enable)
-{
- int rv, reg;
-
- rv = raw_read16(chgnum, ISL923X_REG_CONTROL0, &reg);
- if (rv)
- return rv;
-
- /* HW ramp is controlled by input voltage regulation reference bits */
- if (enable)
- reg &= ~ISL923X_C0_DISABLE_VREG;
- else
- reg |= ISL923X_C0_DISABLE_VREG;
-
- return raw_write16(chgnum, ISL923X_REG_CONTROL0, reg);
-}
-
-static int isl923x_ramp_is_stable(int chgnum)
-{
- /*
- * Since ISL cannot read the current limit that the ramp has settled
- * on, then we can never consider the ramp stable, because we never
- * know what the stable limit is.
- */
- return 0;
-}
-
-static int isl923x_ramp_is_detected(int chgnum)
-{
- return 1;
-}
-
-static int isl923x_ramp_get_current_limit(int chgnum)
-{
- /*
- * ISL doesn't have a way to get this info, so return the nominal
- * current limit as an estimate.
- */
- int input_current;
-
- if (isl923x_get_input_current_limit(chgnum, &input_current))
- return 0;
- return input_current;
-}
-#endif /* CONFIG_CHARGE_RAMP_HW */
-
-
-#ifdef CONFIG_CHARGER_PSYS
-static int psys_enabled;
-/*
- * TODO(b/147440290): Set to appropriate charger with multiple charger support,
- * hardcode to 0 for now
- */
-static void charger_enable_psys(void)
-{
- int val;
-
- mutex_lock(&control1_mutex);
-
- /*
- * enable system power monitor PSYS function
- */
- if (raw_read16(CHARGER_SOLO, ISL923X_REG_CONTROL1, &val))
- goto out;
-
- val |= ISL923X_C1_ENABLE_PSYS;
-
- if (raw_write16(CHARGER_SOLO, ISL923X_REG_CONTROL1, val))
- goto out;
-
- psys_enabled = 1;
-
-out:
- mutex_unlock(&control1_mutex);
-}
-DECLARE_HOOK(HOOK_CHIPSET_RESUME, charger_enable_psys, HOOK_PRIO_DEFAULT);
-
-static void charger_disable_psys(void)
-{
- int val;
-
- mutex_lock(&control1_mutex);
-
- /*
- * disable system power monitor PSYS function
- */
- if (raw_read16(CHARGER_SOLO, ISL923X_REG_CONTROL1, &val))
- goto out;
-
- val &= ~ISL923X_C1_ENABLE_PSYS;
-
- if (raw_write16(CHARGER_SOLO, ISL923X_REG_CONTROL1, val))
- goto out;
-
- psys_enabled = 0;
-
-out:
- mutex_unlock(&control1_mutex);
-}
-DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, charger_disable_psys, HOOK_PRIO_DEFAULT);
-
-#ifdef CONFIG_CHARGER_PSYS_READ
-int charger_get_system_power(void)
-{
- int adc;
-
- /*
- * If PSYS is not enabled, AP is probably off, and the value is usually
- * too small to be measured acurately anyway.
- */
- if (!psys_enabled)
- return -1;
-
- /*
- * We assume that the output gain is always left to the default
- * 1.44 uA/W, and that the ADC scaling values are setup accordingly in
- * board file, so that the value is indicated in uW.
- */
- adc = adc_read_channel(ADC_PSYS);
-
- return adc;
-}
-
-static int console_command_psys(int argc, char **argv)
-{
- ccprintf("PSYS = %d uW\n", charger_get_system_power());
- return 0;
-}
-DECLARE_CONSOLE_COMMAND(psys, console_command_psys,
- NULL,
- "Get the system power in mW");
-#endif /* CONFIG_CHARGER_PSYS_READ */
-#endif /* CONFIG_CHARGER_PSYS */
-
-#ifdef CONFIG_CMD_CHARGER_ADC_AMON_BMON
-static int print_amon_bmon(int chgnum, enum isl923x_amon_bmon amon,
- enum isl923x_mon_dir direction, int resistor)
-{
- int ret, adc, curr;
-
- ret = get_amon_bmon(chgnum, amon, direction, &adc);
- if (ret)
- return ret;
-
- curr = adc / resistor;
- ccprintf("%cMON(%sharging): %d uV, %d mA\n", amon == AMON ? 'A' : 'B',
- direction == MON_DISCHARGE ? "Disc" : "C", adc, curr);
-
- return ret;
-}
-
-/**
- * Get charger AMON and BMON current.
- */
-static int console_command_amon_bmon(int argc, char **argv)
-{
- int ret = EC_SUCCESS;
- int print_ac = 1;
- int print_battery = 1;
- int print_charge = 1;
- int print_discharge = 1;
- int chgnum = 0;
- char *e;
-
- if (argc >= 2) {
- print_ac = (argv[1][0] == 'a');
- print_battery = (argv[1][0] == 'b');
- if (IS_ENABLED(CHARGER_ISL9238X) && argv[1][1] != '\0') {
- print_charge = (argv[1][1] == 'c');
- print_discharge = (argv[1][1] == 'd');
- }
- if (argc >= 3) {
- chgnum = strtoi(argv[2], &e, 10);
- if (*e)
- return EC_ERROR_PARAM2;
- }
- }
-
- if (print_ac) {
- if (print_charge)
- ret |= print_amon_bmon(chgnum, AMON, MON_CHARGE,
- CONFIG_CHARGER_SENSE_RESISTOR_AC);
- if (IS_ENABLED(CHARGER_ISL9238X) && print_discharge)
- ret |= print_amon_bmon(chgnum, AMON, MON_DISCHARGE,
- CONFIG_CHARGER_SENSE_RESISTOR_AC);
- }
-
- if (print_battery) {
- if (IS_ENABLED(CHARGER_ISL9238X) && print_charge)
- ret |= print_amon_bmon(chgnum, BMON, MON_CHARGE,
- /*
- * charging current monitor has
- * 2x amplification factor
- */
- 2 * CONFIG_CHARGER_SENSE_RESISTOR);
- if (print_discharge)
- ret |= print_amon_bmon(chgnum, BMON, MON_DISCHARGE,
- CONFIG_CHARGER_SENSE_RESISTOR);
- }
-
- return ret;
-}
-DECLARE_CONSOLE_COMMAND(amonbmon, console_command_amon_bmon,
-#ifdef CONFIG_CHARGER_ISL9237
- "amonbmon [a|b] <chgnum>",
-#else
- "amonbmon [a[c|d]|b[c|d]] <chgnum>",
-#endif
- "Get charger AMON/BMON voltage diff, current");
-#endif /* CONFIG_CMD_CHARGER_ADC_AMON_BMON */
-
-#ifdef CONFIG_CMD_CHARGER_DUMP
-static void dump_reg_range(int chgnum, int low, int high)
-{
- int reg;
- int regval;
- int rv;
-
- for (reg = low; reg <= high; reg++) {
- CPRINTF("[%Xh] = ", reg);
- rv = i2c_read16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- reg, &regval);
- if (!rv)
- CPRINTF("0x%04x\n", regval);
- else
- CPRINTF("ERR (%d)\n", rv);
- cflush();
- }
-}
-
-static int command_isl923x_dump(int argc, char **argv)
-{
- int chgnum = 0;
- char *e;
-
- if (argc >= 2) {
- chgnum = strtoi(argv[1], &e, 10);
- if (*e)
- return EC_ERROR_PARAM1;
- }
-
- 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 (IS_ENABLED(CHARGER_ISL9238X) ||
- IS_ENABLED(CONFIG_CHARGER_RAA489000))
- dump_reg_range(chgnum, 0x4B, 0x4E);
- dump_reg_range(chgnum, 0xFE, 0xFF);
-
- return EC_SUCCESS;
-}
-DECLARE_CONSOLE_COMMAND(charger_dump, command_isl923x_dump,
- "charger_dump <chgnum>", "Dumps ISL923x registers");
-#endif /* CONFIG_CMD_CHARGER_DUMP */
-
-static enum ec_error_list isl923x_get_vbus_voltage(int chgnum, int port,
- int *voltage)
-{
- int val;
- int rv;
-
- rv = raw_read16(chgnum, RAA489000_REG_ADC_VBUS, &val);
- if (rv)
- return rv;
-
- /* The VBUS voltage is returned in bits 13:6. The LSB is 96mV. */
- val &= GENMASK(13, 6);
- val = val >> 6;
- val *= 96;
- *voltage = val;
-
- return EC_SUCCESS;
-}
-
-#if defined(CONFIG_CHARGER_RAA489000) && defined(CONFIG_OCPC)
-static enum ec_error_list raa489000_enable_linear_charge(int chgnum,
- bool enable)
-{
- const struct battery_info *batt_info;
- int trickle_regval;
- int precharge_current;
- int regval;
- enum ec_error_list rv;
- int act_chg = charge_get_active_chg_chip();
-
- batt_info = battery_get_info();
-
- if (enable) {
- /* Set the auxiliary max VSYS to 300mV + min VSYS. */
- rv = isl9237_set_voltage(act_chg, batt_info->voltage_min + 300);
-
- /* Disable charge current loop for the aux charger. */
- rv |= raw_update16(act_chg, RAA489000_REG_CONTROL10,
- RAA489000_C10_DISABLE_DVC_CC_LOOP,
- MASK_SET);
-
- /*
- * Set primary charger charge current to the desired precharge
- * current.
- */
- rv |= isl9237_set_current(CHARGER_PRIMARY,
- batt_info->precharge_current);
-
- /*
- * Set primary charger max VSYS to the max of the battery.
- */
- rv |= isl9237_set_voltage(CHARGER_PRIMARY,
- batt_info->voltage_max);
-
- /*
- * Set trickle charging level.
- *
- * 64mA is the minimum current level we must set.
- */
- precharge_current = MAX(64, batt_info->precharge_current);
- trickle_regval = precharge_current / 32;
- trickle_regval--; /* convert to 0-based field */
- rv |= raw_read16(CHARGER_PRIMARY, ISL923X_REG_CONTROL2,
- &regval);
- regval &= ~(GENMASK(15, 13));
- regval |= trickle_regval << 13;
- rv |= raw_write16(CHARGER_PRIMARY, ISL923X_REG_CONTROL2,
- regval);
-
- /* Enable DVC trickle charge and DVC charge mode. */
- rv |= raw_update16(CHARGER_PRIMARY, RAA489000_REG_CONTROL10,
- RAA489000_C10_ENABLE_DVC_MODE |
- RAA489000_C10_ENABLE_DVC_TRICKLE_CHARGE,
- MASK_SET);
-
- if (rv)
- return EC_ERROR_UNKNOWN;
-
- } else {
- /* Disable DVC trickle charge. */
- rv = raw_update16(CHARGER_PRIMARY, RAA489000_REG_CONTROL10,
- RAA489000_C10_ENABLE_DVC_TRICKLE_CHARGE,
- MASK_CLR);
- }
-
- return rv;
-}
-
-static enum ec_error_list raa489000_set_vsys_compensation(int chgnum,
- struct ocpc_data *o,
- int current_ma,
- int voltage_mv)
-{
- int device_id = 0;
- int rv;
- int rp1;
- int rp2;
- int regval;
-
- /* This should never be called against the primary charger. */
- ASSERT(chgnum != CHARGER_PRIMARY);
-
- /* Only B0+ silicon supports VSYS compensation. */
- rv = isl923x_device_id(chgnum, &device_id);
- if (rv)
- return EC_ERROR_UNKNOWN;
-
- /*
- * Note: this makes the assumption that this charger IC is used on the
- * primary port as well.
- */
-
- if (device_id < RAA489000_DEV_ID_B0)
- return EC_ERROR_UNIMPLEMENTED;
-
- /*
- * Need to set board resistance values: Rp1 and Rp2. These are expected
- * to be fairly constant once we are able to calculate their values.
- *
- * Rp1 is the total resistance from the right-hand side of the
- * auxiliary sense resistor to the actual VSYS node. It should include:
- * a. resistance of sub board sense resistor
- * b. connector/cable resistance
- * c. sub board PCB resistance to the actual VSYS node
- *
- * Rp2 is the total resistance from the actual VSYS node to the battery.
- * It should include:
- * a. resistance of primary charger sense resistor (battery side)
- * b. Rds(on) of BGATE FET
- * c. main board PCB resistance to the battery
- * d. battery internal resistance
- */
-
- /*
- * Rp1 is set between 36-156mOhms in 4mOhm increments. This must be
- * non-zero in order for compensation to work.
- *
- * To get Rp1, we need to look at the delta between VSYS measured by the
- * auxiliary charger IC and the primary charger IC where the actual VSYS
- * node is as well as the current provided by the auxiliary charger IC.
- * The system keeps track of combined resistance; therefore, Rp2 is the
- * difference between the combined resistance and Rp1 that we calculate.
- * If Rp1 is less than 36mOhms, then the compensation is disabled.
- */
-
- rp1 = MIN(o->rsys_mo, RAA489000_RP1_MAX);
- rp1 -= RAA489000_RP1_MIN;
- if (rp1 < 0) {
- if (o->last_vsys == OCPC_UNINIT)
- CPRINTS("RAA489000(%d): Disabling DVC (Rp1 < 36mOhms)",
- chgnum);
- rp1 = 0;
- } else {
- rp1 /= 4;
- rp1++; /* Rp1 min starts at register value 1 */
- }
-
- /* Rp2 is set between 0-124mOhms in 4mOhm increments. */
- rp2 = o->rbatt_mo;
- rp2 = CLAMP(rp2, RAA489000_RP2_MIN, RAA489000_RP2_MAX);
- rp2 /= 4;
-
- rv |= raw_read16(chgnum, RAA489000_REG_CONTROL10, &regval);
- if (!rv) {
- /* Set Rp1 and Rp2 */
- regval &= ~RAA489000_C10_RP1_MASK;
- regval &= ~RAA489000_C10_RP2_MASK;
- regval |= rp2;
- regval |= (rp1 << RAA489000_C10_RP1_SHIFT);
-
- /* Enable DVC mode */
- regval |= RAA489000_C10_ENABLE_DVC_MODE;
-
- /* Disable charge current loop */
- regval |= RAA489000_C10_DISABLE_DVC_CC_LOOP;
-
- rv |= raw_write16(chgnum, RAA489000_REG_CONTROL10, regval);
- }
-
- if (rv) {
- CPRINTS("%s(%d) Failed to enable DVC!", __func__, chgnum);
- return EC_ERROR_UNKNOWN;
- }
-
- /* Lastly, enable DVC fast charge mode for the primary charger IC. */
- rv = raw_read16(CHARGER_PRIMARY, RAA489000_REG_CONTROL10, &regval);
- regval |= RAA489000_C10_ENABLE_DVC_CHARGE_MODE;
- rv |= raw_write16(CHARGER_PRIMARY, RAA489000_REG_CONTROL10, regval);
- if (rv) {
- CPRINTS("%s Failed to enable DVC on primary charger!",
- __func__);
- return EC_ERROR_UNKNOWN;
- }
-
- /*
- * We'll need to use the PID loop in order to properly set VSYS such
- * such that we get the desired charge current.
- */
- return EC_ERROR_UNIMPLEMENTED;
-}
-#endif /* CONFIG_CHARGER_RAA489000 && CONFIG_OCPC */
-
-const struct charger_drv isl923x_drv = {
- .init = &isl923x_init,
- .post_init = &isl923x_post_init,
- .get_info = &isl923x_get_info,
- .get_status = &isl923x_get_status,
- .set_mode = &isl923x_set_mode,
-#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
-#ifdef CONFIG_CHARGER_RAA489000
- .get_actual_current = &raa489000_get_actual_current,
-#endif
- .get_current = &isl923x_get_current,
- .set_current = &isl923x_set_current,
-#ifdef CONFIG_CHARGER_RAA489000
- .get_actual_voltage = &raa489000_get_actual_voltage,
-#endif
- .get_voltage = &isl923x_get_voltage,
- .set_voltage = &isl923x_set_voltage,
- .discharge_on_ac = &isl923x_discharge_on_ac,
- .get_vbus_voltage = &isl923x_get_vbus_voltage,
- .set_input_current_limit = &isl923x_set_input_current_limit,
- .get_input_current_limit = &isl923x_get_input_current_limit,
-#ifdef CONFIG_CHARGER_RAA489000
- .get_input_current = &raa489000_get_input_current,
-#elif defined(CONFIG_CMD_CHARGER_ADC_AMON_BMON)
- .get_input_current = &isl923x_get_input_current,
-#endif
- .manufacturer_id = &isl923x_manufacturer_id,
- .device_id = &isl923x_device_id,
- .get_option = &isl923x_get_option,
- .set_option = &isl923x_set_option,
-#ifdef CONFIG_CHARGE_RAMP_HW
- .set_hw_ramp = &isl923x_set_hw_ramp,
- .ramp_is_stable = &isl923x_ramp_is_stable,
- .ramp_is_detected = &isl923x_ramp_is_detected,
- .ramp_get_current_limit = &isl923x_ramp_get_current_limit,
-#endif
-#if defined(CONFIG_CHARGER_RAA489000) && defined(CONFIG_OCPC)
- .enable_linear_charge = &raa489000_enable_linear_charge,
- .set_vsys_compensation = &raa489000_set_vsys_compensation,
-#endif
-};