summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Gruzman <dgruzman@motorola.com>2014-02-20 20:41:24 -0600
committerJames Wylder <jwylder@motorola.com>2014-03-05 17:47:25 -0600
commita552297105d2b36ac2189a5c004460dde2232fff (patch)
tree9dfc77b06539d226c42aa58b9b4cee92bdd13918
parent1078cfe5122bd8cf782bb9f5ed427638dc563965 (diff)
downloadolio-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.txt4
-rw-r--r--drivers/power/max17042_battery.c24
-rw-r--r--include/linux/power/max17042_battery.h5
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_ */