diff options
Diffstat (limited to 'drivers/power')
-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 b5567bc..1a5f4b2 100644 --- a/drivers/power/lp8727_charger.c +++ b/drivers/power/lp8727_charger.c @@ -58,6 +58,7 @@ /* STATUS2 register */ #define TEMP_STAT (3 << 5) +#define TEMP_SHIFT 5 enum lp8727_dev_id { ID_NONE, @@ -75,6 +76,13 @@ enum lp8727_chg_stat { EOC, }; +enum lp8727_die_temp { + LP8788_TEMP_75C, + LP8788_TEMP_95C, + LP8788_TEMP_115C, + LP8788_TEMP_135C, +}; + struct lp8727_psy { struct power_supply ac; struct power_supply usb; @@ -315,12 +323,25 @@ static int lp8727_charger_get_property(struct power_supply *psy, return 0; } +static bool lp8727_is_high_temperature(enum lp8727_die_temp temp) +{ + switch (temp) { + case LP8788_TEMP_95C: + case LP8788_TEMP_115C: + case LP8788_TEMP_135C: + return true; + default: + return false; + } +} + static int lp8727_battery_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) { struct lp8727_chg *pchg = dev_get_drvdata(psy->dev->parent); struct lp8727_platform_data *pdata = pchg->pdata; + enum lp8727_die_temp temp; u8 read; switch (psp) { @@ -337,11 +358,11 @@ static int lp8727_battery_get_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_HEALTH: lp8727_read_byte(pchg, STATUS2, &read); - read = (read & TEMP_STAT) >> 5; - if (read >= 0x1 && read <= 0x3) - val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; - else - val->intval = POWER_SUPPLY_HEALTH_GOOD; + temp = (read & TEMP_STAT) >> TEMP_SHIFT; + + val->intval = lp8727_is_high_temperature(temp) ? + POWER_SUPPLY_HEALTH_OVERHEAT : + POWER_SUPPLY_HEALTH_GOOD; break; case POWER_SUPPLY_PROP_PRESENT: if (!pdata) |