From aa6f5ffbdba45aa8e19e5048648fc6c7b25376d3 Mon Sep 17 00:00:00 2001 From: merge Date: Thu, 22 Jan 2009 13:55:32 +0000 Subject: MERGE-via-pending-tracking-hist-MERGE-via-stable-tracking-MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040-1232632141 pending-tracking-hist top was MERGE-via-stable-tracking-MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040-1232632141 / fdf777a63bcb59e0dfd78bfe2c6242e01f6d4eb9 ... parent commitmessage: From: merge MERGE-via-stable-tracking-hist-MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040 stable-tracking-hist top was MERGE-via-mokopatches-tracking-fix-stray-endmenu-patch-1232632040 / 90463bfd2d5a3c8b52f6e6d71024a00e052b0ced ... parent commitmessage: From: merge MERGE-via-mokopatches-tracking-hist-fix-stray-endmenu-patch mokopatches-tracking-hist top was fix-stray-endmenu-patch / 3630e0be570de8057e7f8d2fe501ed353cdf34e6 ... parent commitmessage: From: Andy Green fix-stray-endmenu.patch Signed-off-by: Andy Green --- drivers/power/bq27000_battery.c | 97 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) (limited to 'drivers/power/bq27000_battery.c') diff --git a/drivers/power/bq27000_battery.c b/drivers/power/bq27000_battery.c index dbbcdb379aa..ccd56ea137c 100644 --- a/drivers/power/bq27000_battery.c +++ b/drivers/power/bq27000_battery.c @@ -125,6 +125,8 @@ struct bq27000_bat_regs { struct bq27000_device_info { struct device *dev; struct power_supply bat; + struct power_supply ac; + struct power_supply usb; struct delayed_work work; struct bq27000_platform_data *pdata; @@ -170,7 +172,6 @@ static void bq27000_battery_external_power_changed(struct power_supply *psy) { struct bq27000_device_info *di = container_of(psy, struct bq27000_device_info, bat); - power_supply_changed(&di->bat); dev_dbg(di->dev, "%s\n", __FUNCTION__); } @@ -335,6 +336,54 @@ static void bq27000_battery_work(struct work_struct *work) dev_err(di->dev, "battery service reschedule failed\n"); } +static int ac_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + int ret = 0; + struct bq27000_device_info *di = container_of(psy, struct bq27000_device_info, ac); + + if (!(di->pdata->hdq_initialized)()) + return -EINVAL; + + switch (psp) { + case POWER_SUPPLY_PROP_ONLINE: + if (di->pdata->get_charger_online_status) + val->intval = (di->pdata->get_charger_online_status)(); + else + return -EINVAL; + break; + default: + ret = -EINVAL; + break; + } + return ret; +} + +static int usb_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + int ret = 0; + struct bq27000_device_info *di = container_of(psy, struct bq27000_device_info, usb); + + if (!(di->pdata->hdq_initialized)()) + return -EINVAL; + + switch (psp) { + case POWER_SUPPLY_PROP_ONLINE: + if (di->pdata->get_charger_online_status) + val->intval = (di->pdata->get_charger_online_status)(); + else + return -EINVAL; + break; + default: + ret = -EINVAL; + break; + } + return ret; +} + static enum power_supply_property bq27000_battery_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_HEALTH, @@ -350,6 +399,10 @@ static enum power_supply_property bq27000_battery_props[] = { POWER_SUPPLY_PROP_ONLINE }; +static enum power_supply_property power_props[] = { + POWER_SUPPLY_PROP_ONLINE, +}; + static int bq27000_battery_probe(struct platform_device *pdev) { int retval = 0; @@ -379,12 +432,36 @@ static int bq27000_battery_probe(struct platform_device *pdev) di->bat.use_for_apm = 1; di->pdata = pdata; + di->ac.name = "ac"; + di->ac.type = POWER_SUPPLY_TYPE_MAINS; + di->ac.properties = power_props; + di->ac.num_properties = ARRAY_SIZE(power_props); + di->ac.get_property = ac_get_property; + + di->usb.name = "usb"; + di->usb.type = POWER_SUPPLY_TYPE_USB; + di->usb.properties = power_props; + di->usb.num_properties = ARRAY_SIZE(power_props); + di->usb.get_property = usb_get_property; + retval = power_supply_register(&pdev->dev, &di->bat); if (retval) { dev_err(di->dev, "failed to register battery\n"); goto batt_failed; } + retval = power_supply_register(&pdev->dev, &di->ac); + if (retval) { + dev_err(di->dev, "failed to register ac\n"); + goto ac_failed; + } + + retval = power_supply_register(&pdev->dev, &di->usb); + if (retval) { + dev_err(di->dev, "failed to register usb\n"); + goto usb_failed; + } + INIT_DELAYED_WORK(&di->work, bq27000_battery_work); if (!schedule_delayed_work(&di->work, 0)) @@ -392,6 +469,10 @@ static int bq27000_battery_probe(struct platform_device *pdev) return 0; +usb_failed: + power_supply_unregister(&di->ac); +ac_failed: + power_supply_unregister(&di->bat); batt_failed: kfree(di); di_alloc_failed: @@ -405,10 +486,24 @@ static int bq27000_battery_remove(struct platform_device *pdev) cancel_delayed_work(&di->work); power_supply_unregister(&di->bat); + power_supply_unregister(&di->ac); + power_supply_unregister(&di->usb); return 0; } +void bq27000_charging_state_change(struct platform_device *pdev) +{ + struct bq27000_device_info *di = platform_get_drvdata(pdev); + + if (!di) + return; + + power_supply_changed(&di->ac); + power_supply_changed(&di->usb); +} +EXPORT_SYMBOL_GPL(bq27000_charging_state_change); + #ifdef CONFIG_PM static int bq27000_battery_suspend(struct platform_device *pdev, -- cgit v1.2.3