diff options
| author | Dmitriy Gruzman <dgruzman@motorola.com> | 2014-02-20 20:41:24 -0600 |
|---|---|---|
| committer | James Wylder <jwylder@motorola.com> | 2014-03-05 17:47:25 -0600 |
| commit | a552297105d2b36ac2189a5c004460dde2232fff (patch) | |
| tree | 9dfc77b06539d226c42aa58b9b4cee92bdd13918 | |
| parent | 1078cfe5122bd8cf782bb9f5ed427638dc563965 (diff) | |
| download | olio-linux-3.10-a552297105d2b36ac2189a5c004460dde2232fff.tar.xz olio-linux-3.10-a552297105d2b36ac2189a5c004460dde2232fff.zip | |
IKXCLOCK-298 max17042_battery: Use battery undervoltage IRQ for "0" SOC
Add option for using battery undervoltage interrupt to report 0% capacity. When
this option is enabled, "0" SOC is reported if and only if the battery
undervoltage IRQ has fired.
Change-Id: I8f65b3365bff30c7ace0c52615277e07de372ea0
Signed-off-by: Dmitriy Gruzman <dgruzman@motorola.com>
| -rw-r--r-- | Documentation/devicetree/bindings/power_supply/max17042_battery.txt | 4 | ||||
| -rw-r--r-- | drivers/power/max17042_battery.c | 24 | ||||
| -rw-r--r-- | include/linux/power/max17042_battery.h | 5 |
3 files changed, 32 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/power_supply/max17042_battery.txt b/Documentation/devicetree/bindings/power_supply/max17042_battery.txt index 3c1846a6340..1d7c8156c3a 100644 --- a/Documentation/devicetree/bindings/power_supply/max17042_battery.txt +++ b/Documentation/devicetree/bindings/power_supply/max17042_battery.txt @@ -16,6 +16,9 @@ Optional properties : - gpio-names: List of strings with GPIO names. + - maxim,batt_undervoltage_zero_soc : Define this property to report "0" SOC + if and only if battery undervoltage interrupt has fired + Example: battery-charger@36 { @@ -27,4 +30,5 @@ Example: >; gpios = <&gpio5 12 0x1>; gpio-names = "alert-pin"; + maxim,batt_undervoltage_zero_soc; }; diff --git a/drivers/power/max17042_battery.c b/drivers/power/max17042_battery.c index 5493555c646..1b5ba083af6 100644 --- a/drivers/power/max17042_battery.c +++ b/drivers/power/max17042_battery.c @@ -50,6 +50,7 @@ /* Interrupt mask bits */ #define CONFIG_ALRT_BIT_ENBL (1 << 2) +#define STATUS_INTR_VMIN_BIT (1 << 8) #define STATUS_INTR_SOCMIN_BIT (1 << 10) #define STATUS_INTR_SOCMAX_BIT (1 << 14) @@ -76,6 +77,7 @@ struct max17042_chip { struct max17042_platform_data *pdata; struct work_struct work; int init_complete; + bool batt_undervoltage; }; static int max17042_write_reg(struct i2c_client *client, u8 reg, u16 value) @@ -193,11 +195,23 @@ static int max17042_get_property(struct power_supply *psy, val->intval = ret * 625 / 8; break; case POWER_SUPPLY_PROP_CAPACITY: + if (chip->pdata->batt_undervoltage_zero_soc && + chip->batt_undervoltage) { + val->intval = 0; + break; + } + ret = max17042_read_reg(chip->client, MAX17042_RepSOC); if (ret < 0) return ret; - val->intval = ret >> 8; + ret >>= 8; + if (ret == 0 && + chip->pdata->batt_undervoltage_zero_soc && + !chip->batt_undervoltage) + val->intval = 1; + else + val->intval = ret; break; case POWER_SUPPLY_PROP_CHARGE_FULL: ret = max17042_read_reg(chip->client, MAX17042_FullCAP); @@ -632,6 +646,11 @@ static irqreturn_t max17042_thread_handler(int id, void *dev) max17042_set_soc_threshold(chip, 1); } + if (val & STATUS_INTR_VMIN_BIT) { + dev_info(&chip->client->dev, "Battery undervoltage INTR\n"); + chip->batt_undervoltage = true; + } + power_supply_changed(&chip->battery); return IRQ_HANDLED; } @@ -757,6 +776,9 @@ max17042_get_pdata(struct device *dev) pdata->enable_current_sense = true; } + pdata->batt_undervoltage_zero_soc = + of_property_read_bool(np, "maxim,batt_undervoltage_zero_soc"); + return pdata; } #else diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/max17042_battery.h index ee0080b3537..93e4a1479d7 100644 --- a/include/linux/power/max17042_battery.h +++ b/include/linux/power/max17042_battery.h @@ -210,6 +210,11 @@ struct max17042_platform_data { * the datasheet although it can be changed by board designers. */ unsigned int r_sns; + /* + * Enable this flag to report "0" SOC iff battery undervoltage interrupt + * has fired. + */ + bool batt_undervoltage_zero_soc; }; #endif /* __MAX17042_BATTERY_H_ */ |