diff options
Diffstat (limited to 'driver/charger/isl923x.c')
-rw-r--r-- | driver/charger/isl923x.c | 189 |
1 files changed, 91 insertions, 98 deletions
diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c index c90fe5224e..84f833cc64 100644 --- a/driver/charger/isl923x.c +++ b/driver/charger/isl923x.c @@ -1,4 +1,4 @@ -/* Copyright 2015 The Chromium OS Authors. All rights reserved. +/* Copyright 2015 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * @@ -8,6 +8,7 @@ #include "adc.h" #include "battery.h" #include "battery_smart.h" +#include "builtin/assert.h" #include "charge_state_v2.h" #include "charger.h" #include "compile_time_macros.h" @@ -32,62 +33,61 @@ #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 +#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) +#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 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 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 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 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 +#define CHARGE_I_MAX RAA489000_CURRENT_REG_MAX #else -#define CHARGE_I_MAX ISL923X_CURRENT_REG_MAX +#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_MIN 4 +#define CHARGE_I_OFF 0 #define CHARGE_I_STEP 4 #ifdef CONFIG_CHARGER_RAA489000 -#define INPUT_I_MAX RAA489000_CURRENT_REG_MAX +#define INPUT_I_MAX RAA489000_CURRENT_REG_MAX #else -#define INPUT_I_MAX ISL923X_CURRENT_REG_MAX +#define INPUT_I_MAX ISL923X_CURRENT_REG_MAX #endif /* CONFIG_CHARGER_RAA489000 */ -#define INPUT_I_MIN 4 -#define INPUT_I_STEP 4 +#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) +#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 }; @@ -102,38 +102,36 @@ static enum ec_error_list isl923x_discharge_on_ac_weak_disable(int chgnum); /* Charger parameters */ static const struct charger_info isl9237_charger_info = { - .name = CHARGER_NAME, - .voltage_max = CHARGE_V_MAX, - .voltage_min = CHARGE_V_MIN, + .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_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_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_read16(int chgnum, int offset, int *value) { return i2c_read16(chg_chips[chgnum].i2c_port, - chg_chips[chgnum].i2c_addr_flags, - offset, value); + 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); + 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); + chg_chips[chgnum].i2c_addr_flags, offset, mask, + action); } static enum ec_error_list isl9237_set_current(int chgnum, uint16_t current) @@ -236,7 +234,7 @@ static enum ec_error_list isl923x_get_input_current_limit(int chgnum, #ifdef CONFIG_CHARGER_RAA489000 static enum ec_error_list raa489000_get_input_current(int chgnum, - int *input_current) + int *input_current) { int rv; int regval; @@ -305,13 +303,13 @@ static enum ec_error_list isl923x_set_otg_current_voltage(int chgnum, { int rv; uint16_t volt_reg = (output_voltage / ISL9238_OTG_VOLTAGE_STEP) - << ISL9238_OTG_VOLTAGE_SHIFT; + << ISL9238_OTG_VOLTAGE_SHIFT; uint16_t current_reg = DIV_ROUND_UP(output_current, ISL923X_OTG_CURRENT_STEP) - << ISL923X_OTG_CURRENT_SHIFT; + << ISL923X_OTG_CURRENT_SHIFT; if (output_current < 0 || output_current > ISL923X_OTG_CURRENT_MAX || - output_voltage > ISL9238_OTG_VOLTAGE_MAX) + output_voltage > ISL9238_OTG_VOLTAGE_MAX) return EC_ERROR_INVAL; /* Set voltage. */ @@ -554,8 +552,8 @@ int isl923x_set_comparator_inversion(int chgnum, int invert) int regval; rv = i2c_read16(chg_chips[chgnum].i2c_port, - chg_chips[chgnum].i2c_addr_flags, - ISL923X_REG_CONTROL2, ®val); + chg_chips[chgnum].i2c_addr_flags, ISL923X_REG_CONTROL2, + ®val); if (invert) regval |= ISL923X_C2_INVERT_CMOUT; else @@ -577,8 +575,8 @@ 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; + int precharge_voltage = bi->precharge_voltage ? bi->precharge_voltage : + bi->voltage_min; if (IS_ENABLED(CONFIG_CHARGER_RAA489000)) { if (CONFIG_CHARGER_SENSE_RESISTOR == @@ -590,9 +588,9 @@ static void isl923x_init(int chgnum) if (raw_read16(chgnum, ISL9238_REG_CONTROL4, ®)) goto init_fail; - if (raw_write16(chgnum, ISL9238_REG_CONTROL4, - reg | - RAA489000_C4_PSYS_RSNS_RATIO_1_TO_1)) + if (raw_write16( + chgnum, ISL9238_REG_CONTROL4, + reg | RAA489000_C4_PSYS_RSNS_RATIO_1_TO_1)) goto init_fail; } @@ -603,8 +601,7 @@ static void isl923x_init(int chgnum) goto init_fail; if (raw_write16(chgnum, ISL9238_REG_CONTROL3, - reg | - RAA489000_C3_DCM_CCM_HYSTERESIS_ENABLE)) + reg | RAA489000_C3_DCM_CCM_HYSTERESIS_ENABLE)) goto init_fail; /* Set switching frequency to 600KHz to help with ripple. */ @@ -614,8 +611,7 @@ static void isl923x_init(int chgnum) reg &= ~ISL923X_C1_SWITCH_FREQ_MASK; if (raw_write16(chgnum, ISL923X_REG_CONTROL1, - reg | - ISL9237_C1_SWITCH_FREQ_599K)) + reg | ISL9237_C1_SWITCH_FREQ_599K)) goto init_fail; } @@ -650,8 +646,7 @@ static void isl923x_init(int chgnum) reg |= ISL923X_C2_PROCHOT_DEBOUNCE_1000; if (raw_write16(chgnum, ISL923X_REG_CONTROL2, - reg | - ISL923X_C2_ADAPTER_DEBOUNCE_150)) + reg | ISL923X_C2_ADAPTER_DEBOUNCE_150)) goto init_fail; /* @@ -687,10 +682,10 @@ static void isl923x_init(int chgnum) */ if (IS_ENABLED(CONFIG_CHARGER_RAA489000)) reg = (4437 / RAA489000_INPUT_VOLTAGE_REF_STEP) - << RAA489000_INPUT_VOLTAGE_REF_SHIFT; + << RAA489000_INPUT_VOLTAGE_REF_SHIFT; else reg = (4439 / ISL9238_INPUT_VOLTAGE_REF_STEP) - << ISL9238_INPUT_VOLTAGE_REF_SHIFT; + << ISL9238_INPUT_VOLTAGE_REF_SHIFT; if (raw_write16(chgnum, ISL9238_REG_INPUT_VOLTAGE, reg)) goto init_fail; @@ -762,7 +757,7 @@ static void isl923x_init(int chgnum) * Initialize the input current limit to the board's default. */ if (isl923x_set_input_current_limit( - chgnum, CONFIG_CHARGER_INPUT_CURRENT)) + chgnum, CONFIG_CHARGER_INPUT_CURRENT)) goto init_fail; } @@ -975,16 +970,15 @@ enum ec_error_list isl9238c_hibernate(int chgnum) { /* Disable PSYS */ RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1, - ISL923X_C1_ENABLE_PSYS, MASK_CLR)); + ISL923X_C1_ENABLE_PSYS, MASK_CLR)); /* Disable GP comparator */ RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL2, - ISL923X_C2_COMPARATOR, MASK_SET)); + ISL923X_C2_COMPARATOR, MASK_SET)); /* Force BGATE off */ RETURN_ERROR(raw_update16(chgnum, ISL9238_REG_CONTROL3, - ISL9238_C3_BGATE_OFF, MASK_SET)); - + ISL9238_C3_BGATE_OFF, MASK_SET)); return EC_SUCCESS; } @@ -993,18 +987,17 @@ enum ec_error_list isl9238c_resume(int chgnum) { /* Revert everything in isl9238c_hibernate() */ RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1, - ISL923X_C1_ENABLE_PSYS, MASK_SET)); + ISL923X_C1_ENABLE_PSYS, MASK_SET)); RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL2, - ISL923X_C2_COMPARATOR, MASK_CLR)); + ISL923X_C2_COMPARATOR, MASK_CLR)); RETURN_ERROR(raw_update16(chgnum, ISL9238_REG_CONTROL3, - ISL9238_C3_BGATE_OFF, MASK_CLR)); + ISL9238_C3_BGATE_OFF, MASK_CLR)); return EC_SUCCESS; } - /*****************************************************************************/ /* Hardware current ramping */ @@ -1038,7 +1031,6 @@ static int isl923x_ramp_get_current_limit(int chgnum) } #endif /* CONFIG_CHARGE_RAMP_HW */ - #ifdef CONFIG_CHARGER_PSYS static int psys_enabled; /* @@ -1115,13 +1107,12 @@ int charger_get_system_power(void) return adc; } -static int console_command_psys(int argc, char **argv) +static int console_command_psys(int argc, const char **argv) { ccprintf("PSYS = %d uW\n", charger_get_system_power()); return 0; } -DECLARE_CONSOLE_COMMAND(psys, console_command_psys, - NULL, +DECLARE_CONSOLE_COMMAND(psys, console_command_psys, NULL, "Get the system power in mW"); #endif /* CONFIG_CHARGER_PSYS_READ */ #endif /* CONFIG_CHARGER_PSYS */ @@ -1138,7 +1129,7 @@ static int print_amon_bmon(int chgnum, enum isl923x_amon_bmon amon, curr = adc / resistor; ccprintf("%cMON(%sharging): %d uV, %d mA\n", amon == AMON ? 'A' : 'B', - direction == MON_DISCHARGE ? "Disc" : "C", adc, curr); + direction == MON_DISCHARGE ? "Disc" : "C", adc, curr); return ret; } @@ -1146,7 +1137,7 @@ static int print_amon_bmon(int chgnum, enum isl923x_amon_bmon amon, /** * Get charger AMON and BMON current. */ -static int console_command_amon_bmon(int argc, char **argv) +static int console_command_amon_bmon(int argc, const char **argv) { int ret = EC_SUCCESS; int print_ac = 1; @@ -1172,24 +1163,27 @@ static int console_command_amon_bmon(int argc, char **argv) if (print_ac) { if (print_charge) - ret |= print_amon_bmon(chgnum, AMON, MON_CHARGE, - CONFIG_CHARGER_SENSE_RESISTOR_AC); + 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); + 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); + 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); + CONFIG_CHARGER_SENSE_RESISTOR); } return ret; @@ -1213,8 +1207,7 @@ static void dump_reg_range(int chgnum, int low, int high) for (reg = low; reg <= high; reg++) { CPRINTF("[%Xh] = ", reg); rv = i2c_read16(chg_chips[chgnum].i2c_port, - chg_chips[chgnum].i2c_addr_flags, - reg, ®val); + chg_chips[chgnum].i2c_addr_flags, reg, ®val); if (!rv) CPRINTF("0x%04x\n", regval); else @@ -1275,15 +1268,14 @@ static enum ec_error_list raa489000_enable_linear_charge(int chgnum, /* Disable charge current loop for the aux charger. */ rv |= raw_update16(act_chg, RAA489000_REG_CONTROL10, - RAA489000_C10_DISABLE_DVC_CC_LOOP, - MASK_SET); + 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); + batt_info->precharge_current); /* * Set primary charger max VSYS to the max of the battery. @@ -1307,10 +1299,11 @@ static enum ec_error_list raa489000_enable_linear_charge(int chgnum, 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); + 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; |