diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2008-11-30 16:45:14 -0500 |
---|---|---|
committer | Samuel Ortiz <samuel@sortiz.org> | 2009-01-04 06:17:39 -0500 |
commit | 4008e879e1325c29362aa2c3fa4b527273ae15a8 (patch) | |
tree | 1fe1e210e6031a6a19d42b88645f94641a23f7db | |
parent | 7e386e6e0e4f34f0545e8923e22fe4dd61ef9d48 (diff) |
power_supply: Add battery health reporting for WM8350
Implement support for reporting battery health in the WM8350 battery
interface. Since we are now able to report this via the classs remove
the diagnostics from the interrupt handler.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
Signed-off-by: Samuel Ortiz <sameo@openedhand.com>
-rw-r--r-- | drivers/mfd/wm8350-regmap.c | 2 | ||||
-rw-r--r-- | drivers/power/wm8350_power.c | 33 | ||||
-rw-r--r-- | include/linux/mfd/wm8350/core.h | 7 |
3 files changed, 33 insertions, 9 deletions
diff --git a/drivers/mfd/wm8350-regmap.c b/drivers/mfd/wm8350-regmap.c index aaf394aa9c2d..b43d64c2b920 100644 --- a/drivers/mfd/wm8350-regmap.c +++ b/drivers/mfd/wm8350-regmap.c | |||
@@ -1314,7 +1314,7 @@ const struct wm8350_reg_access wm8350_reg_io_map[] = { | |||
1314 | { 0xFFFF, 0xFFFF, 0xFFFF }, /* R223 */ | 1314 | { 0xFFFF, 0xFFFF, 0xFFFF }, /* R223 */ |
1315 | { 0x0000, 0x0000, 0x0000 }, /* R224 */ | 1315 | { 0x0000, 0x0000, 0x0000 }, /* R224 */ |
1316 | { 0x8F3F, 0x0000, 0xFFFF }, /* R225 - DCDC/LDO status */ | 1316 | { 0x8F3F, 0x0000, 0xFFFF }, /* R225 - DCDC/LDO status */ |
1317 | { 0x0000, 0x0000, 0x0000 }, /* R226 */ | 1317 | { 0x0000, 0x0000, 0xFFFF }, /* R226 - Charger status */ |
1318 | { 0x0000, 0x0000, 0xFFFF }, /* R227 */ | 1318 | { 0x0000, 0x0000, 0xFFFF }, /* R227 */ |
1319 | { 0x0000, 0x0000, 0x0000 }, /* R228 */ | 1319 | { 0x0000, 0x0000, 0x0000 }, /* R228 */ |
1320 | { 0x0000, 0x0000, 0x0000 }, /* R229 */ | 1320 | { 0x0000, 0x0000, 0x0000 }, /* R229 */ |
diff --git a/drivers/power/wm8350_power.c b/drivers/power/wm8350_power.c index 74e7593beffb..1b16bf343f2f 100644 --- a/drivers/power/wm8350_power.c +++ b/drivers/power/wm8350_power.c | |||
@@ -190,22 +190,18 @@ static void wm8350_charger_handler(struct wm8350 *wm8350, int irq, void *data) | |||
190 | struct wm8350_charger_policy *policy = power->policy; | 190 | struct wm8350_charger_policy *policy = power->policy; |
191 | 191 | ||
192 | switch (irq) { | 192 | switch (irq) { |
193 | case WM8350_IRQ_CHG_BAT_HOT: | ||
194 | dev_err(wm8350->dev, "battery too hot\n"); | ||
195 | break; | ||
196 | case WM8350_IRQ_CHG_BAT_COLD: | ||
197 | dev_err(wm8350->dev, "battery too cold\n"); | ||
198 | break; | ||
199 | case WM8350_IRQ_CHG_BAT_FAIL: | 193 | case WM8350_IRQ_CHG_BAT_FAIL: |
200 | dev_err(wm8350->dev, "battery failed\n"); | 194 | dev_err(wm8350->dev, "battery failed\n"); |
201 | break; | 195 | break; |
202 | case WM8350_IRQ_CHG_TO: | 196 | case WM8350_IRQ_CHG_TO: |
203 | dev_err(wm8350->dev, "charger timeout\n"); | 197 | dev_err(wm8350->dev, "charger timeout\n"); |
204 | break; | ||
205 | case WM8350_IRQ_CHG_END: | ||
206 | power_supply_changed(&power->battery); | 198 | power_supply_changed(&power->battery); |
207 | break; | 199 | break; |
200 | |||
201 | case WM8350_IRQ_CHG_BAT_HOT: | ||
202 | case WM8350_IRQ_CHG_BAT_COLD: | ||
208 | case WM8350_IRQ_CHG_START: | 203 | case WM8350_IRQ_CHG_START: |
204 | case WM8350_IRQ_CHG_END: | ||
209 | power_supply_changed(&power->battery); | 205 | power_supply_changed(&power->battery); |
210 | break; | 206 | break; |
211 | 207 | ||
@@ -308,6 +304,23 @@ static enum power_supply_property wm8350_usb_props[] = { | |||
308 | * Battery properties | 304 | * Battery properties |
309 | *********************************************************************/ | 305 | *********************************************************************/ |
310 | 306 | ||
307 | static int wm8350_bat_check_health(struct wm8350 *wm8350) | ||
308 | { | ||
309 | u16 reg; | ||
310 | |||
311 | if (wm8350_read_battery_uvolts(wm8350) < 2850000) | ||
312 | return POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; | ||
313 | |||
314 | reg = wm8350_reg_read(wm8350, WM8350_CHARGER_OVERRIDES); | ||
315 | if (reg & WM8350_CHG_BATT_HOT_OVRDE) | ||
316 | return POWER_SUPPLY_HEALTH_OVERHEAT; | ||
317 | |||
318 | if (reg & WM8350_CHG_BATT_COLD_OVRDE) | ||
319 | return POWER_SUPPLY_HEALTH_COLD; | ||
320 | |||
321 | return POWER_SUPPLY_HEALTH_GOOD; | ||
322 | } | ||
323 | |||
311 | static int wm8350_bat_get_property(struct power_supply *psy, | 324 | static int wm8350_bat_get_property(struct power_supply *psy, |
312 | enum power_supply_property psp, | 325 | enum power_supply_property psp, |
313 | union power_supply_propval *val) | 326 | union power_supply_propval *val) |
@@ -326,6 +339,9 @@ static int wm8350_bat_get_property(struct power_supply *psy, | |||
326 | case POWER_SUPPLY_PROP_VOLTAGE_NOW: | 339 | case POWER_SUPPLY_PROP_VOLTAGE_NOW: |
327 | val->intval = wm8350_read_battery_uvolts(wm8350); | 340 | val->intval = wm8350_read_battery_uvolts(wm8350); |
328 | break; | 341 | break; |
342 | case POWER_SUPPLY_PROP_HEALTH: | ||
343 | val->intval = wm8350_bat_check_health(wm8350); | ||
344 | break; | ||
329 | default: | 345 | default: |
330 | ret = -EINVAL; | 346 | ret = -EINVAL; |
331 | break; | 347 | break; |
@@ -338,6 +354,7 @@ static enum power_supply_property wm8350_bat_props[] = { | |||
338 | POWER_SUPPLY_PROP_STATUS, | 354 | POWER_SUPPLY_PROP_STATUS, |
339 | POWER_SUPPLY_PROP_ONLINE, | 355 | POWER_SUPPLY_PROP_ONLINE, |
340 | POWER_SUPPLY_PROP_VOLTAGE_NOW, | 356 | POWER_SUPPLY_PROP_VOLTAGE_NOW, |
357 | POWER_SUPPLY_PROP_HEALTH, | ||
341 | }; | 358 | }; |
342 | 359 | ||
343 | /********************************************************************* | 360 | /********************************************************************* |
diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h index 2a7abeebe777..afeff6f1316c 100644 --- a/include/linux/mfd/wm8350/core.h +++ b/include/linux/mfd/wm8350/core.h | |||
@@ -58,6 +58,7 @@ | |||
58 | #define WM8350_OVER_CURRENT_INT_STATUS_MASK 0x25 | 58 | #define WM8350_OVER_CURRENT_INT_STATUS_MASK 0x25 |
59 | #define WM8350_GPIO_INT_STATUS_MASK 0x26 | 59 | #define WM8350_GPIO_INT_STATUS_MASK 0x26 |
60 | #define WM8350_COMPARATOR_INT_STATUS_MASK 0x27 | 60 | #define WM8350_COMPARATOR_INT_STATUS_MASK 0x27 |
61 | #define WM8350_CHARGER_OVERRIDES 0xE2 | ||
61 | #define WM8350_MISC_OVERRIDES 0xE3 | 62 | #define WM8350_MISC_OVERRIDES 0xE3 |
62 | #define WM8350_COMPARATOR_OVERRIDES 0xE7 | 63 | #define WM8350_COMPARATOR_OVERRIDES 0xE7 |
63 | #define WM8350_STATE_MACHINE_STATUS 0xE9 | 64 | #define WM8350_STATE_MACHINE_STATUS 0xE9 |
@@ -533,6 +534,12 @@ | |||
533 | #define WM8350_DC1_STS 0x0001 | 534 | #define WM8350_DC1_STS 0x0001 |
534 | 535 | ||
535 | /* | 536 | /* |
537 | * R226 (0xE2) - Charger status | ||
538 | */ | ||
539 | #define WM8350_CHG_BATT_HOT_OVRDE 0x8000 | ||
540 | #define WM8350_CHG_BATT_COLD_OVRDE 0x4000 | ||
541 | |||
542 | /* | ||
536 | * R227 (0xE3) - Misc Overrides | 543 | * R227 (0xE3) - Misc Overrides |
537 | */ | 544 | */ |
538 | #define WM8350_USB_LIMIT_OVRDE 0x0400 | 545 | #define WM8350_USB_LIMIT_OVRDE 0x0400 |