diff options
Diffstat (limited to 'drivers/power/lp8727_charger.c')
-rw-r--r-- | drivers/power/lp8727_charger.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/power/lp8727_charger.c b/drivers/power/lp8727_charger.c index b5567bc99000..1a5f4b27e001 100644 --- a/drivers/power/lp8727_charger.c +++ b/drivers/power/lp8727_charger.c | |||
@@ -58,6 +58,7 @@ | |||
58 | 58 | ||
59 | /* STATUS2 register */ | 59 | /* STATUS2 register */ |
60 | #define TEMP_STAT (3 << 5) | 60 | #define TEMP_STAT (3 << 5) |
61 | #define TEMP_SHIFT 5 | ||
61 | 62 | ||
62 | enum lp8727_dev_id { | 63 | enum lp8727_dev_id { |
63 | ID_NONE, | 64 | ID_NONE, |
@@ -75,6 +76,13 @@ enum lp8727_chg_stat { | |||
75 | EOC, | 76 | EOC, |
76 | }; | 77 | }; |
77 | 78 | ||
79 | enum lp8727_die_temp { | ||
80 | LP8788_TEMP_75C, | ||
81 | LP8788_TEMP_95C, | ||
82 | LP8788_TEMP_115C, | ||
83 | LP8788_TEMP_135C, | ||
84 | }; | ||
85 | |||
78 | struct lp8727_psy { | 86 | struct lp8727_psy { |
79 | struct power_supply ac; | 87 | struct power_supply ac; |
80 | struct power_supply usb; | 88 | struct power_supply usb; |
@@ -315,12 +323,25 @@ static int lp8727_charger_get_property(struct power_supply *psy, | |||
315 | return 0; | 323 | return 0; |
316 | } | 324 | } |
317 | 325 | ||
326 | static bool lp8727_is_high_temperature(enum lp8727_die_temp temp) | ||
327 | { | ||
328 | switch (temp) { | ||
329 | case LP8788_TEMP_95C: | ||
330 | case LP8788_TEMP_115C: | ||
331 | case LP8788_TEMP_135C: | ||
332 | return true; | ||
333 | default: | ||
334 | return false; | ||
335 | } | ||
336 | } | ||
337 | |||
318 | static int lp8727_battery_get_property(struct power_supply *psy, | 338 | static int lp8727_battery_get_property(struct power_supply *psy, |
319 | enum power_supply_property psp, | 339 | enum power_supply_property psp, |
320 | union power_supply_propval *val) | 340 | union power_supply_propval *val) |
321 | { | 341 | { |
322 | struct lp8727_chg *pchg = dev_get_drvdata(psy->dev->parent); | 342 | struct lp8727_chg *pchg = dev_get_drvdata(psy->dev->parent); |
323 | struct lp8727_platform_data *pdata = pchg->pdata; | 343 | struct lp8727_platform_data *pdata = pchg->pdata; |
344 | enum lp8727_die_temp temp; | ||
324 | u8 read; | 345 | u8 read; |
325 | 346 | ||
326 | switch (psp) { | 347 | switch (psp) { |
@@ -337,11 +358,11 @@ static int lp8727_battery_get_property(struct power_supply *psy, | |||
337 | break; | 358 | break; |
338 | case POWER_SUPPLY_PROP_HEALTH: | 359 | case POWER_SUPPLY_PROP_HEALTH: |
339 | lp8727_read_byte(pchg, STATUS2, &read); | 360 | lp8727_read_byte(pchg, STATUS2, &read); |
340 | read = (read & TEMP_STAT) >> 5; | 361 | temp = (read & TEMP_STAT) >> TEMP_SHIFT; |
341 | if (read >= 0x1 && read <= 0x3) | 362 | |
342 | val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; | 363 | val->intval = lp8727_is_high_temperature(temp) ? |
343 | else | 364 | POWER_SUPPLY_HEALTH_OVERHEAT : |
344 | val->intval = POWER_SUPPLY_HEALTH_GOOD; | 365 | POWER_SUPPLY_HEALTH_GOOD; |
345 | break; | 366 | break; |
346 | case POWER_SUPPLY_PROP_PRESENT: | 367 | case POWER_SUPPLY_PROP_PRESENT: |
347 | if (!pdata) | 368 | if (!pdata) |