diff options
-rw-r--r-- | drivers/mfd/twl-core.c | 5 | ||||
-rw-r--r-- | drivers/power/twl6030_bci_battery.c | 29 | ||||
-rw-r--r-- | include/linux/i2c/twl.h | 1 |
3 files changed, 34 insertions, 1 deletions
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 990666b..0ad61da 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -1394,13 +1394,16 @@ 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 + * Errata ProDB00110684 present only in the TWL6030 ES2.1 */ if (features & TWL6032_SUBCLASS) { if (twlrev == 1) errata |= TWL6032_ERRATA_DB00119490; } else { - if (twlrev == 2) + if (twlrev == 2) { errata |= TWL6030_ERRATA_DB00112620; + errata |= TWL6030_ERRATA_DB00110684; + } } } diff --git a/drivers/power/twl6030_bci_battery.c b/drivers/power/twl6030_bci_battery.c index cae20f8..d1a8f43 100644 --- a/drivers/power/twl6030_bci_battery.c +++ b/drivers/power/twl6030_bci_battery.c @@ -654,6 +654,7 @@ static void twl6030_start_usb_charger_sw(struct twl6030_bci_device_info *di) { int ret; u8 reg = 0; + u8 reg_int_mask = 0; if (!is_battery_present(di)) { dev_dbg(di->dev, "BATTERY NOT DETECTED!\n"); @@ -679,6 +680,23 @@ static void twl6030_start_usb_charger_sw(struct twl6030_bci_device_info *di) return; } + if (di->errata & TWL6030_ERRATA_DB00110684) { + /* mask CHARGERUSB_THMREG interrupt */ + + ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, ®_int_mask, + CHARGERUSB_INT_MASK); + + if (ret) + goto err; + + reg_int_mask &= ~MASK_MCHARGERUSB_THMREG; + + ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, reg_int_mask, + CHARGERUSB_INT_MASK); + if (ret) + goto err; + } + twl6030_config_vichrg_reg(di, di->charger_outcurrentmA); twl6030_config_cinlimit_reg(di, di->charger_incurrentmA); twl6030_config_voreg_reg(di, di->platform_data->max_bat_voltagemV); @@ -697,6 +715,17 @@ static void twl6030_start_usb_charger_sw(struct twl6030_bci_device_info *di) di->charge_status = POWER_SUPPLY_STATUS_CHARGING; } + + if (di->errata & TWL6030_ERRATA_DB00110684) { + /* unmask CHARGERUSB_THMREG interrupt */ + reg_int_mask |= MASK_MCHARGERUSB_THMREG; + + ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, reg_int_mask, + CHARGERUSB_INT_MASK); + if (ret) + goto err; + } + return; err: pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret); diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 5f3e9cb..b3802c2 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -975,5 +975,6 @@ static inline int twl4030charger_usb_en(int enable) { return 0; } #define TWL6032_ERRATA_DB00119490 (1 << 0) #define TWL6030_ERRATA_DB00112620 (1 << 1) +#define TWL6030_ERRATA_DB00110684 (1 << 2) #endif /* End of __TWL4030_H */ |