diff options
-rw-r--r-- | drivers/mfd/twl-core.c | 4 | ||||
-rw-r--r-- | drivers/power/twl6030_bci_battery.c | 45 | ||||
-rw-r--r-- | include/linux/i2c/twl.h | 1 |
3 files changed, 36 insertions, 14 deletions
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 86c4ab2..990666b 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -1393,10 +1393,14 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) /* * Check for the errata implementation * Errata ProDB00119490 present only in the TWL6032 ES1.1 + * Errata ProDB00112620 present only in the TWL6030 ES2.1 */ if (features & TWL6032_SUBCLASS) { if (twlrev == 1) errata |= TWL6032_ERRATA_DB00119490; + } else { + if (twlrev == 2) + errata |= TWL6030_ERRATA_DB00112620; } } diff --git a/drivers/power/twl6030_bci_battery.c b/drivers/power/twl6030_bci_battery.c index 4d60712..cae20f8 100644 --- a/drivers/power/twl6030_bci_battery.c +++ b/drivers/power/twl6030_bci_battery.c @@ -184,6 +184,8 @@ /* ANTICOLLAPSE_CTRL2 */ #define BUCK_VTH_SHIFT 5 +#define ANTICOLL_ANA (1 << 2) +#define ANTICOLL_DIG (1 << 1) /* FG_REG_00 */ #define CC_ACTIVE_MODE_SHIFT 6 @@ -322,39 +324,42 @@ struct twl6030_bci_device_info { /* max scale current based on sense resitor */ int current_max_scale; + + unsigned int min_vbus_val; }; static BLOCKING_NOTIFIER_HEAD(notifier_list); extern u32 wakeup_timer_seconds; -static void twl6030_config_min_vbus_reg(struct twl6030_bci_device_info *di, +static int twl6030_config_min_vbus_reg(struct twl6030_bci_device_info *di, unsigned int value) { u8 rd_reg = 0; int ret; + u8 anticollapse_ctrl = ANTICOLLAPSE_CTRL2; - /* not required on TWL6032 */ if (di->features & TWL6032_SUBCLASS) - return; + anticollapse_ctrl = ANTICOLLAPSE_CTRL1; if (value > 4760 || value < 4200) { dev_dbg(di->dev, "invalid min vbus\n"); - return; + return -EINVAL; } ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &rd_reg, - ANTICOLLAPSE_CTRL2); + anticollapse_ctrl); if (ret) goto err; rd_reg = rd_reg & 0x1F; rd_reg = rd_reg | (((value - 4200)/80) << BUCK_VTH_SHIFT); ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, rd_reg, - ANTICOLLAPSE_CTRL2); + anticollapse_ctrl); if (!ret) - return; + return ret; err: pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret); + return ret; } static void twl6030_config_iterm_reg(struct twl6030_bci_device_info *di, @@ -2286,7 +2291,8 @@ static ssize_t set_min_vbus(struct device *dev, struct device_attribute *attr, int status = count; struct twl6030_bci_device_info *di = dev_get_drvdata(dev); - if ((strict_strtol(buf, 10, &val) < 0) || (val < 4200) || (val > 4760)) + if ((strict_strtol(buf, 10, &val) < 0) || (val < di->min_vbus_val) || + (val > 4760)) return -EINVAL; di->min_vbus = val; twl6030_config_min_vbus_reg(di, val); @@ -2648,21 +2654,32 @@ static int __devinit twl6030_bci_battery_probe(struct platform_device *pdev) wake_lock_init(&chrg_lock, WAKE_LOCK_SUSPEND, "ac_chrg_wake_lock"); - if (di->errata & TWL6032_ERRATA_DB00119490) { + di->min_vbus_val = 4200; + if ((di->errata & TWL6032_ERRATA_DB00119490) || + (di->errata & TWL6030_ERRATA_DB00112620)) { /* - * Set Anti-collapse threshold correspond - * to the ERRATA DB00119490 (4.4 volts) + * Enable Anti-collapse threshold: + * for ERRATA DB00119490: 4.4 volts + * for ERRATA DB00112620: 4.2 volts */ + if (di->errata & TWL6032_ERRATA_DB00119490) + di->min_vbus_val = 4400; + + ret = twl6030_config_min_vbus_reg(di, di->min_vbus_val); + + if (ret) + goto temp_setup_fail; + + /* Enable Anti-collapse threshold */ ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, ®, ANTICOLLAPSE_CTRL1); if (ret) goto temp_setup_fail; - reg = reg & 0x1F; - reg = reg | ((0x3) << BUCK_VTH_SHIFT); + reg &= ~ANTICOLL_DIG; + reg |= ANTICOLL_ANA; ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, reg, ANTICOLLAPSE_CTRL1); - if (ret) goto temp_setup_fail; } diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index aac03fe..5f3e9cb 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -974,5 +974,6 @@ static inline int twl4030charger_usb_en(int enable) { return 0; } #define TWL6032_PREQ1_RES_ASS_A 0xd7 #define TWL6032_ERRATA_DB00119490 (1 << 0) +#define TWL6030_ERRATA_DB00112620 (1 << 1) #endif /* End of __TWL4030_H */ |