summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorsyed rafiuddin <srafiuddin@nvidia.com>2011-05-12 12:36:23 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:43:08 -0800
commit19bd4df1ede886feddf4322d80b71109e65e623f (patch)
tree4889564320576fa3f37c32d3e675333d7c151085 /drivers/power
parent005686d2fa20df7b2fe3665fdafa8477fd418615 (diff)
power: battery: bq27x00: add "health" property
Addition of Health property which informs the health of the battery like good, dead and over charge. Bug 786669 Original-Change-Id: I4ed3684ec4e777d110f3c5bd2a062ac5be22c6e2 Reviewed-on: http://git-master/r/30505 Reviewed-by: Varun Wadekar <vwadekar@nvidia.com> Reviewed-by: Mayuresh Kulkarni <mkulkarni@nvidia.com> Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: R6786a07368846c217fa2c298df565423a1c63bbb
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/bq27x00_battery.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c
index 42232c296171..b33eae795fab 100644
--- a/drivers/power/bq27x00_battery.c
+++ b/drivers/power/bq27x00_battery.c
@@ -60,8 +60,10 @@
#define BQ27500_REG_SOC 0x2C
#define BQ27500_REG_DCAP 0x3C /* Design capacity */
#define BQ27500_FLAG_DSC BIT(0)
+#define BQ27500_FLAG_SOCF BIT(1)
#define BQ27500_FLAG_BAT_DET BIT(3)
#define BQ27500_FLAG_FC BIT(9)
+#define BQ27500_FLAG_OTC BIT(15)
#define BQ27000_RS 20 /* Resistor sense */
@@ -133,6 +135,7 @@ static enum power_supply_property bq27x00_battery_props[] = {
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_SERIAL_NUMBER,
+ POWER_SUPPLY_PROP_HEALTH,
};
static unsigned int poll_interval = 360;
@@ -150,6 +153,31 @@ static inline int bq27x00_read(struct bq27x00_device_info *di, u8 reg,
return di->bus.read(di, reg, single);
}
+static int bq27510_battery_health(struct bq27x00_device_info *di,
+ int reg_offset)
+{
+ int ret;
+ int status;
+
+ if (di->chip == BQ27500 || di->chip == BQ27510) {
+ ret = i2c_smbus_read_word_data(di->client, reg_offset);
+ if (ret < 0) {
+ dev_err(di->dev, "read failure\n");
+ return ret;
+ }
+
+ if (ret & BQ27500_FLAG_SOCF)
+ status = POWER_SUPPLY_HEALTH_DEAD;
+ else if (ret & BQ27500_FLAG_OTC)
+ status = POWER_SUPPLY_HEALTH_OVERHEAT;
+ else
+ status = POWER_SUPPLY_HEALTH_GOOD;
+ return status;
+ }
+
+ return -1;
+}
+
/*
* Return the battery Relative State-of-Charge
* Or < 0 if something fails.
@@ -594,6 +622,9 @@ static int bq27x00_battery_get_property(struct power_supply *psy,
if (bq27510_get_battery_serial_number(di, val))
return -EINVAL;
break;
+ case POWER_SUPPLY_PROP_HEALTH:
+ val->intval = bq27510_battery_health(di, BQ27x00_REG_FLAGS);
+ break;
default:
return -EINVAL;
}