aboutsummaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorBalaji Rao <balajirrao@openmoko.org>2008-12-29 12:11:30 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-12-29 12:11:30 +0000
commit4c92928c63ab443dc1d3f5368c0fd6ae40c36c83 (patch)
treed47d58cb65a79958e1e1ade805e81d52d60190ad /drivers/power
parente142549d884a17b81b4c87de8ab116bd8b1df03c (diff)
Start charging when the usb current limit is changed.
This makes sure that charging status remains correct when currrent limit is altered from userspace. Signed-off-by: Balaji Rao <balajirrao@openmoko.org>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/pcf50633-charger.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/drivers/power/pcf50633-charger.c b/drivers/power/pcf50633-charger.c
index 9bbfaac48a1..5cfdb274f89 100644
--- a/drivers/power/pcf50633-charger.c
+++ b/drivers/power/pcf50633-charger.c
@@ -30,6 +30,8 @@ void pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
{
int ret;
u8 bits;
+ int charging_start = 1;
+ u8 mbcs2, chgmod;
if (ma >= 1000)
bits = PCF50633_MBCC7_USB_1000mA;
@@ -37,8 +39,10 @@ void pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
bits = PCF50633_MBCC7_USB_500mA;
else if (ma >= 100)
bits = PCF50633_MBCC7_USB_100mA;
- else
+ else {
bits = PCF50633_MBCC7_USB_SUSPEND;
+ charging_start = 0;
+ }
ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC7,
PCF50633_MBCC7_USB_MASK, bits);
@@ -47,6 +51,20 @@ void pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
else
dev_info(pcf->dev, "usb curlim to %d mA\n", ma);
+ mbcs2 = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2);
+ chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK);
+
+ /* If chgmod == BATFULL, setting chgena has no effect.
+ * We need to set resume instead.
+ */
+ if (chgmod != PCF50633_MBCS2_MBC_BAT_FULL)
+ pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
+ PCF50633_MBCC1_CHGENA, PCF50633_MBCC1_CHGENA);
+ else
+ pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
+ PCF50633_MBCC1_RESUME, PCF50633_MBCC1_RESUME);
+
+ pcf->mbc.usb_active = charging_start;
power_supply_changed(&pcf->mbc.usb);
}
EXPORT_SYMBOL_GPL(pcf50633_mbc_usb_curlim_set);
@@ -152,7 +170,10 @@ static void pcf50633_mbc_irq_handler(struct pcf50633 *pcf, int irq, void *data)
if (irq == PCF50633_IRQ_BATFULL) {
mbc->usb_active = 0;
mbc->adapter_active = 0;
- }
+ } else if (irq == PCF50633_IRQ_USBLIMON)
+ mbc->usb_active = 0;
+ else if (irq == PCF50633_IRQ_USBLIMOFF)
+ mbc->usb_active = 1;
power_supply_changed(&mbc->ac);
power_supply_changed(&mbc->usb);