Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Mark Brown and committed by
Samuel Ortiz
4008e879 7e386e6e

+33 -9
+1 -1
drivers/mfd/wm8350-regmap.c
··· 1314 1314 { 0xFFFF, 0xFFFF, 0xFFFF }, /* R223 */ 1315 1315 { 0x0000, 0x0000, 0x0000 }, /* R224 */ 1316 1316 { 0x8F3F, 0x0000, 0xFFFF }, /* R225 - DCDC/LDO status */ 1317 - { 0x0000, 0x0000, 0x0000 }, /* R226 */ 1317 + { 0x0000, 0x0000, 0xFFFF }, /* R226 - Charger status */ 1318 1318 { 0x0000, 0x0000, 0xFFFF }, /* R227 */ 1319 1319 { 0x0000, 0x0000, 0x0000 }, /* R228 */ 1320 1320 { 0x0000, 0x0000, 0x0000 }, /* R229 */
+25 -8
drivers/power/wm8350_power.c
··· 190 190 struct wm8350_charger_policy *policy = power->policy; 191 191 192 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 193 case WM8350_IRQ_CHG_BAT_FAIL: 200 194 dev_err(wm8350->dev, "battery failed\n"); 201 195 break; 202 196 case WM8350_IRQ_CHG_TO: 203 197 dev_err(wm8350->dev, "charger timeout\n"); 204 - break; 205 - case WM8350_IRQ_CHG_END: 206 198 power_supply_changed(&power->battery); 207 199 break; 200 + 201 + case WM8350_IRQ_CHG_BAT_HOT: 202 + case WM8350_IRQ_CHG_BAT_COLD: 208 203 case WM8350_IRQ_CHG_START: 204 + case WM8350_IRQ_CHG_END: 209 205 power_supply_changed(&power->battery); 210 206 break; 211 207 ··· 304 308 * Battery properties 305 309 *********************************************************************/ 306 310 311 + static int wm8350_bat_check_health(struct wm8350 *wm8350) 312 + { 313 + u16 reg; 314 + 315 + if (wm8350_read_battery_uvolts(wm8350) < 2850000) 316 + return POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; 317 + 318 + reg = wm8350_reg_read(wm8350, WM8350_CHARGER_OVERRIDES); 319 + if (reg & WM8350_CHG_BATT_HOT_OVRDE) 320 + return POWER_SUPPLY_HEALTH_OVERHEAT; 321 + 322 + if (reg & WM8350_CHG_BATT_COLD_OVRDE) 323 + return POWER_SUPPLY_HEALTH_COLD; 324 + 325 + return POWER_SUPPLY_HEALTH_GOOD; 326 + } 327 + 307 328 static int wm8350_bat_get_property(struct power_supply *psy, 308 329 enum power_supply_property psp, 309 330 union power_supply_propval *val) ··· 339 326 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 340 327 val->intval = wm8350_read_battery_uvolts(wm8350); 341 328 break; 329 + case POWER_SUPPLY_PROP_HEALTH: 330 + val->intval = wm8350_bat_check_health(wm8350); 331 + break; 342 332 default: 343 333 ret = -EINVAL; 344 334 break; ··· 354 338 POWER_SUPPLY_PROP_STATUS, 355 339 POWER_SUPPLY_PROP_ONLINE, 356 340 POWER_SUPPLY_PROP_VOLTAGE_NOW, 341 + POWER_SUPPLY_PROP_HEALTH, 357 342 }; 358 343 359 344 /*********************************************************************
+7
include/linux/mfd/wm8350/core.h
··· 58 58 #define WM8350_OVER_CURRENT_INT_STATUS_MASK 0x25 59 59 #define WM8350_GPIO_INT_STATUS_MASK 0x26 60 60 #define WM8350_COMPARATOR_INT_STATUS_MASK 0x27 61 + #define WM8350_CHARGER_OVERRIDES 0xE2 61 62 #define WM8350_MISC_OVERRIDES 0xE3 62 63 #define WM8350_COMPARATOR_OVERRIDES 0xE7 63 64 #define WM8350_STATE_MACHINE_STATUS 0xE9 ··· 532 531 #define WM8350_DC3_STS 0x0004 533 532 #define WM8350_DC2_STS 0x0002 534 533 #define WM8350_DC1_STS 0x0001 534 + 535 + /* 536 + * R226 (0xE2) - Charger status 537 + */ 538 + #define WM8350_CHG_BATT_HOT_OVRDE 0x8000 539 + #define WM8350_CHG_BATT_COLD_OVRDE 0x4000 535 540 536 541 /* 537 542 * R227 (0xE3) - Misc Overrides