diff options
Diffstat (limited to 'drivers/power/wm8350_power.c')
-rw-r--r-- | drivers/power/wm8350_power.c | 33 |
1 files changed, 25 insertions, 8 deletions
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 | /********************************************************************* |