aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mfd/twl-core.c5
-rw-r--r--drivers/power/twl6030_bci_battery.c29
-rw-r--r--include/linux/i2c/twl.h1
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, &reg_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 */