summaryrefslogtreecommitdiff
path: root/driver/charger/bq24773.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/charger/bq24773.c')
-rw-r--r--driver/charger/bq24773.c136
1 files changed, 94 insertions, 42 deletions
diff --git a/driver/charger/bq24773.c b/driver/charger/bq24773.c
index 4cd85b5ff1..87ef187357 100644
--- a/driver/charger/bq24773.c
+++ b/driver/charger/bq24773.c
@@ -42,28 +42,61 @@ static const struct charger_info bq2477x_charger_info = {
.input_current_step = REG_TO_CURRENT(INPUT_I_STEP, R_AC),
};
+#ifdef CONFIG_CHARGER_BQ24773
+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_write8(int chgnum, int offset, int value)
+{
+ return i2c_write8(chg_chips[chgnum].i2c_port,
+ chg_chips[chgnum].i2c_addr_flags,
+ offset, value);
+}
+#endif
+
+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);
+}
+
+
/* chip specific interfaces */
-int charger_set_input_current(int input_current)
+static enum ec_error_list bq2477x_set_input_current(int chgnum,
+ int input_current)
{
#ifdef CONFIG_CHARGER_BQ24770
- return raw_write16(REG_INPUT_CURRENT,
+ return raw_write16(chgnum, REG_INPUT_CURRENT,
CURRENT_TO_REG(input_current, R_AC));
#elif defined(CONFIG_CHARGER_BQ24773)
- return raw_write8(REG_INPUT_CURRENT,
+ return raw_write8(chgnum, REG_INPUT_CURRENT,
CURRENT_TO_REG8(input_current, R_AC));
#endif
}
-int charger_get_input_current(int *input_current)
+static enum ec_error_list bq2477x_get_input_current(int chgnum,
+ int *input_current)
{
int rv;
int reg;
#ifdef CONFIG_CHARGER_BQ24770
- rv = raw_read16(REG_INPUT_CURRENT, &reg);
+ rv = raw_read16(chgnum, REG_INPUT_CURRENT, &reg);
#elif defined(CONFIG_CHARGER_BQ24773)
- rv = raw_read8(REG_INPUT_CURRENT, &reg);
+ rv = raw_read8(chgnum, REG_INPUT_CURRENT, &reg);
#endif
if (rv)
return rv;
@@ -76,48 +109,48 @@ int charger_get_input_current(int *input_current)
return EC_SUCCESS;
}
-int charger_manufacturer_id(int *id)
+static enum ec_error_list bq2477x_manufacturer_id(int chgnum, int *id)
{
#ifdef CONFIG_CHARGER_BQ24770
- return raw_read16(REG_MANUFACTURE_ID, id);
+ return raw_read16(chgnum, REG_MANUFACTURE_ID, id);
#elif defined(CONFIG_CHARGER_BQ24773)
*id = 0x40; /* TI */
return EC_SUCCESS;
#endif
}
-int charger_device_id(int *id)
+static enum ec_error_list bq2477x_device_id(int chgnum, int *id)
{
#ifdef CONFIG_CHARGER_BQ24770
- return raw_read16(REG_DEVICE_ADDRESS, id);
+ return raw_read16(chgnum, REG_DEVICE_ADDRESS, id);
#elif defined(CONFIG_CHARGER_BQ24773)
- return raw_read8(REG_DEVICE_ADDRESS, id);
+ return raw_read8(chgnum, REG_DEVICE_ADDRESS, id);
#endif
}
-int charger_get_option(int *option)
+static enum ec_error_list bq2477x_get_option(int chgnum, int *option)
{
- return raw_read16(REG_CHARGE_OPTION0, option);
+ return raw_read16(chgnum, REG_CHARGE_OPTION0, option);
}
-int charger_set_option(int option)
+static enum ec_error_list bq2477x_set_option(int chgnum, int option)
{
- return raw_write16(REG_CHARGE_OPTION0, option);
+ return raw_write16(chgnum, REG_CHARGE_OPTION0, option);
}
/* Charger interfaces */
-const struct charger_info *charger_get_info(void)
+static const struct charger_info *bq2477x_get_info(int chgnum)
{
return &bq2477x_charger_info;
}
-int charger_get_status(int *status)
+static enum ec_error_list bq2477x_get_status(int chgnum, int *status)
{
int rv;
int option;
- rv = charger_get_option(&option);
+ rv = bq2477x_get_option(chgnum, &option);
if (rv)
return rv;
@@ -130,12 +163,12 @@ int charger_get_status(int *status)
return EC_SUCCESS;
}
-int charger_set_mode(int mode)
+static enum ec_error_list bq2477x_set_mode(int chgnum, int mode)
{
int rv;
int option;
- rv = charger_get_option(&option);
+ rv = bq2477x_get_option(chgnum, &option);
if (rv)
return rv;
@@ -143,15 +176,15 @@ int charger_set_mode(int mode)
option |= OPTION0_CHARGE_INHIBIT;
else
option &= ~OPTION0_CHARGE_INHIBIT;
- return charger_set_option(option);
+ return bq2477x_set_option(chgnum, option);
}
-int charger_get_current(int *current)
+static enum ec_error_list bq2477x_get_current(int chgnum, int *current)
{
int rv;
int reg;
- rv = raw_read16(REG_CHARGE_CURRENT, &reg);
+ rv = raw_read16(chgnum, REG_CHARGE_CURRENT, &reg);
if (rv)
return rv;
@@ -160,55 +193,56 @@ int charger_get_current(int *current)
return EC_SUCCESS;
}
-int charger_set_current(int current)
+static enum ec_error_list bq2477x_set_current(int chgnum, int current)
{
current = charger_closest_current(current);
- return raw_write16(REG_CHARGE_CURRENT, CURRENT_TO_REG(current, R_SNS));
+ return raw_write16(chgnum, REG_CHARGE_CURRENT,
+ CURRENT_TO_REG(current, R_SNS));
}
-int charger_get_voltage(int *voltage)
+static enum ec_error_list bq2477x_get_voltage(int chgnum, int *voltage)
{
- return raw_read16(REG_MAX_CHARGE_VOLTAGE, voltage);
+ return raw_read16(chgnum, REG_MAX_CHARGE_VOLTAGE, voltage);
}
-int charger_set_voltage(int voltage)
+static enum ec_error_list bq2477x_set_voltage(int chgnum, int voltage)
{
voltage = charger_closest_voltage(voltage);
- return raw_write16(REG_MAX_CHARGE_VOLTAGE, voltage);
+ return raw_write16(chgnum, REG_MAX_CHARGE_VOLTAGE, voltage);
}
/* Charging power state initialization */
-int charger_post_init(void)
+static enum ec_error_list bq2477x_post_init(int chgnum)
{
int rv, option;
#ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED
int option2;
#endif
- rv = charger_get_option(&option);
+ rv = bq2477x_get_option(chgnum, &option);
if (rv)
return rv;
option &= ~OPTION0_LEARN_ENABLE;
- rv = charger_set_option(option);
+ rv = bq2477x_set_option(chgnum, option);
if (rv)
return rv;
#ifndef BOARD_SAMUS
/* Turn off PROCHOT warning */
- rv = raw_read16(REG_PROCHOT_OPTION1, &option);
+ rv = raw_read16(chgnum, REG_PROCHOT_OPTION1, &option);
if (rv)
return rv;
option &= ~PROCHOT_OPTION1_SELECTOR_MASK;
- rv = raw_write16(REG_PROCHOT_OPTION1, option);
+ rv = raw_write16(chgnum, REG_PROCHOT_OPTION1, option);
#else
/* On Samus, use PROCHOT warning to detect charging problems */
/* Turn on PROCHOT warning */
- rv = raw_write16(REG_PROCHOT_OPTION1, 0x8120);
+ rv = raw_write16(chgnum, REG_PROCHOT_OPTION1, 0x8120);
/* Set PROCHOT ICRIT warning when IADP is >120% of IDPM */
- rv |= raw_write16(REG_PROCHOT_OPTION0, 0x1b54);
+ rv |= raw_write16(chgnum, REG_PROCHOT_OPTION0, 0x1b54);
#endif
if (rv)
@@ -216,14 +250,14 @@ int charger_post_init(void)
#ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED
/* Read the external ILIM pin enabled flag. */
- rv = raw_read16(REG_CHARGE_OPTION2, &option2);
+ rv = raw_read16(chgnum, REG_CHARGE_OPTION2, &option2);
if (rv)
return rv;
/* Set ILIM pin disabled if it is currently enabled. */
if (option2 & OPTION2_EN_EXTILIM) {
option2 &= ~OPTION2_EN_EXTILIM;
- rv = raw_write16(REG_CHARGE_OPTION2, option2);
+ rv = raw_write16(chgnum, REG_CHARGE_OPTION2, option2);
}
return rv;
#else
@@ -231,19 +265,37 @@ int charger_post_init(void)
#endif
}
-int charger_discharge_on_ac(int enable)
+static enum ec_error_list bq2477x_discharge_on_ac(int chgnum, int enable)
{
int rv;
int option;
- rv = charger_get_option(&option);
+ rv = bq2477x_get_option(chgnum, &option);
if (rv)
return rv;
if (enable)
- rv = charger_set_option(option | OPTION0_LEARN_ENABLE);
+ rv = bq2477x_set_option(chgnum, option | OPTION0_LEARN_ENABLE);
else
- rv = charger_set_option(option & ~OPTION0_LEARN_ENABLE);
+ rv = bq2477x_set_option(chgnum, option & ~OPTION0_LEARN_ENABLE);
return rv;
}
+
+const struct charger_drv bq2477x_drv = {
+ .post_init = &bq2477x_post_init,
+ .get_info = &bq2477x_get_info,
+ .get_status = &bq2477x_get_status,
+ .set_mode = &bq2477x_set_mode,
+ .get_current = &bq2477x_get_current,
+ .set_current = &bq2477x_set_current,
+ .get_voltage = &bq2477x_get_voltage,
+ .set_voltage = &bq2477x_set_voltage,
+ .discharge_on_ac = &bq2477x_discharge_on_ac,
+ .set_input_current = &bq2477x_set_input_current,
+ .get_input_current = &bq2477x_get_input_current,
+ .manufacturer_id = &bq2477x_manufacturer_id,
+ .device_id = &bq2477x_device_id,
+ .get_option = &bq2477x_get_option,
+ .set_option = &bq2477x_set_option,
+};