Commit 079cdff3 authored by Andreas Kemnade's avatar Andreas Kemnade Committed by Sebastian Reichel

power: supply: twl4030_charger: disable eoc interrupt on linear charge

This avoids getting woken up from suspend after power interruptions
when the bci wrongly thinks the battery is full just because
of input current going low because of low input power
Signed-off-by: default avatarAndreas Kemnade <andreas@kemnade.info>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 8314c212
...@@ -440,6 +440,7 @@ static void twl4030_current_worker(struct work_struct *data) ...@@ -440,6 +440,7 @@ static void twl4030_current_worker(struct work_struct *data)
static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable)
{ {
int ret; int ret;
u32 reg;
if (bci->usb_mode == CHARGE_OFF) if (bci->usb_mode == CHARGE_OFF)
enable = false; enable = false;
...@@ -453,14 +454,38 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable) ...@@ -453,14 +454,38 @@ static int twl4030_charger_enable_usb(struct twl4030_bci *bci, bool enable)
bci->usb_enabled = 1; bci->usb_enabled = 1;
} }
if (bci->usb_mode == CHARGE_AUTO) if (bci->usb_mode == CHARGE_AUTO) {
/* Enable interrupts now. */
reg = ~(u32)(TWL4030_ICHGLOW | TWL4030_ICHGEOC |
TWL4030_TBATOR2 | TWL4030_TBATOR1 |
TWL4030_BATSTS);
ret = twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, reg,
TWL4030_INTERRUPTS_BCIIMR1A);
if (ret < 0) {
dev_err(bci->dev,
"failed to unmask interrupts: %d\n",
ret);
return ret;
}
/* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */ /* forcing the field BCIAUTOUSB (BOOT_BCI[1]) to 1 */
ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB); ret = twl4030_clear_set_boot_bci(0, TWL4030_BCIAUTOUSB);
}
/* forcing USBFASTMCHG(BCIMFSTS4[2]) to 1 */ /* forcing USBFASTMCHG(BCIMFSTS4[2]) to 1 */
ret = twl4030_clear_set(TWL_MODULE_MAIN_CHARGE, 0, ret = twl4030_clear_set(TWL_MODULE_MAIN_CHARGE, 0,
TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4); TWL4030_USBFASTMCHG, TWL4030_BCIMFSTS4);
if (bci->usb_mode == CHARGE_LINEAR) { if (bci->usb_mode == CHARGE_LINEAR) {
/* Enable interrupts now. */
reg = ~(u32)(TWL4030_ICHGLOW | TWL4030_TBATOR2 |
TWL4030_TBATOR1 | TWL4030_BATSTS);
ret = twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, reg,
TWL4030_INTERRUPTS_BCIIMR1A);
if (ret < 0) {
dev_err(bci->dev,
"failed to unmask interrupts: %d\n",
ret);
return ret;
}
twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC|TWL4030_CVENAC, 0); twl4030_clear_set_boot_bci(TWL4030_BCIAUTOAC|TWL4030_CVENAC, 0);
/* Watch dog key: WOVF acknowledge */ /* Watch dog key: WOVF acknowledge */
ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE, 0x33, ret = twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE, 0x33,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment