From 0b9f80ab540b2e51f6e86f6a1adec67761f9368d Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 8 Feb 2008 00:50:03 +0300 Subject: [PATCH 62/64] tosa-bat-fix-charging Signed-off-by: Dmitry Baryshkov --- drivers/power/tosa_battery.c | 28 +++++++++++++++++++++------- 1 files changed, 21 insertions(+), 7 deletions(-) diff --git a/drivers/power/tosa_battery.c b/drivers/power/tosa_battery.c index 008e791..2db9116 100644 --- a/drivers/power/tosa_battery.c +++ b/drivers/power/tosa_battery.c @@ -153,39 +153,53 @@ static irqreturn_t tosa_bat_full_isr(int irq, void *data) return IRQ_HANDLED; } +static char *status_text[] = { + [POWER_SUPPLY_STATUS_UNKNOWN] = "Unknown", + [POWER_SUPPLY_STATUS_CHARGING] = "Charging", + [POWER_SUPPLY_STATUS_DISCHARGING] = "Discharging", + [POWER_SUPPLY_STATUS_NOT_CHARGING] = "Not charging", + [POWER_SUPPLY_STATUS_FULL] = "Full", +}; + static void tosa_bat_update(struct tosa_bat *bat) { - int old = bat->status; + int old; struct power_supply *psy = &bat->psy; mutex_lock(&bat->work_lock); + old = bat->status; + if (bat->is_present && !bat->is_present(bat)) { - printk(KERN_DEBUG "%s not present\n", psy->name); + printk(KERN_NOTICE "%s not present\n", psy->name); bat->status = POWER_SUPPLY_STATUS_NOT_CHARGING; bat->full_chrg = -1; } else if (power_supply_am_i_supplied(psy)) { + if (bat->status == POWER_SUPPLY_STATUS_DISCHARGING) { + gpio_set_value(bat->gpio_charge_off, 0); + mdelay(15); + } if (gpio_get_value(bat->gpio_full)) { - printk(KERN_DEBUG "%s full\n", psy->name); - if (old == POWER_SUPPLY_STATUS_CHARGING || bat->full_chrg == -1) bat->full_chrg = tosa_read_bat(bat); gpio_set_value(bat->gpio_charge_off, 1); bat->status = POWER_SUPPLY_STATUS_FULL; } else { - printk(KERN_ERR "%s charge\n", psy->name); gpio_set_value(bat->gpio_charge_off, 0); bat->status = POWER_SUPPLY_STATUS_CHARGING; } } else { - printk(KERN_ERR "%s discharge\n", psy->name); gpio_set_value(bat->gpio_charge_off, 1); bat->status = POWER_SUPPLY_STATUS_DISCHARGING; } - if (old != bat->status) + if (old != bat->status) { + printk(KERN_NOTICE "%s %s -> %s\n", psy->name, + status_text[old], + status_text[bat->status]); power_supply_changed(psy); + } mutex_unlock(&bat->work_lock); } -- 1.5.3.8