Added sysfs entry to reset the gas gauge and minor cleanup.
Change-Id: Id28a1b514eb756d74fc87e12c0b7514054a9a56e
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c
index 57450b3..b0dac1a 100644
--- a/drivers/power/bq27x00_battery.c
+++ b/drivers/power/bq27x00_battery.c
@@ -43,6 +43,13 @@
#define G3_FW_VERSION 0x0324
#define L1_FW_VERSION 0x0600
+#define CONTROL_CMD 0x00
+/* Subcommands of Control() */
+#define DEV_TYPE_SUBCMD 0x0001
+#define FW_VER_SUBCMD 0x0002
+#define DF_VER_SUBCMD 0x001F
+#define RESET_SUBCMD 0x0041
+
#define INVALID_REG_ADDR 0xFF
enum bq27x00_reg_index {
@@ -171,6 +178,7 @@
u8 *regs;
int fw_ver;
+ int df_ver;
};
static enum power_supply_property bq27x00_battery_props[] = {
@@ -835,31 +843,43 @@
return 0;
}
-static int bq27x00_battery_read_fw_version(struct bq27x00_device_info *di)
+static int bq27x00_battery_reset(struct bq27x00_device_info *di)
{
- bq27x00_write_i2c(di, 0x00, 0x0002, false);
+ dev_info(di->dev, "Gas Gauge Reset\n");
+
+ bq27x00_write_i2c(di, CONTROL_CMD, RESET_SUBCMD, false);
msleep(10);
- return bq27x00_read_i2c(di, 0x00, false);
+ return bq27x00_read_i2c(di, CONTROL_CMD, false);
+}
+
+
+static int bq27x00_battery_read_fw_version(struct bq27x00_device_info *di)
+{
+ bq27x00_write_i2c(di, CONTROL_CMD, FW_VER_SUBCMD, false);
+
+ msleep(10);
+
+ return bq27x00_read_i2c(di, CONTROL_CMD, false);
}
static int bq27x00_battery_read_device_type(struct bq27x00_device_info *di)
{
- bq27x00_write_i2c(di, 0x00, 0x0001, false);
+ bq27x00_write_i2c(di, CONTROL_CMD, DEV_TYPE_SUBCMD, false);
msleep(10);
- return bq27x00_read_i2c(di, 0x00, false);
+ return bq27x00_read_i2c(di, CONTROL_CMD, false);
}
static int bq27x00_battery_read_dataflash_version(struct bq27x00_device_info *di)
{
- bq27x00_write_i2c(di, 0x00, 0x001f, false);
+ bq27x00_write_i2c(di, CONTROL_CMD, DF_VER_SUBCMD, false);
msleep(10);
- return bq27x00_read_i2c(di, 0x00, false);
+ return bq27x00_read_i2c(di, CONTROL_CMD, false);
}
#define SLAVE_LATENCY_DELAY 100
@@ -1074,17 +1094,28 @@
return sprintf(buf, "%d\n", dev_type);
}
+static ssize_t show_reset(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct bq27x00_device_info *di = dev_get_drvdata(dev);
+
+ bq27x00_battery_reset(di);
+
+ return sprintf(buf, "okay\n");
+}
static DEVICE_ATTR(dump_data_flash, S_IRUGO, show_dump_data_flash, NULL);
static DEVICE_ATTR(fw_version, S_IRUGO, show_firmware_version, NULL);
static DEVICE_ATTR(df_version, S_IRUGO, show_dataflash_version, NULL);
static DEVICE_ATTR(device_type, S_IRUGO, show_device_type, NULL);
+static DEVICE_ATTR(reset, S_IRUGO, show_reset, NULL);
static struct attribute *bq27x00_attributes[] = {
&dev_attr_dump_data_flash.attr,
&dev_attr_fw_version.attr,
&dev_attr_df_version.attr,
&dev_attr_device_type.attr,
+ &dev_attr_reset.attr,
NULL
};
@@ -1139,7 +1170,10 @@
/* Get the fw version to determine the register mapping */
di->fw_ver = bq27x00_battery_read_fw_version(di);
- dev_info(&client->dev, "Gas Guage fw version is 0x%04x\n", di->fw_ver);
+ di->df_ver = bq27x00_battery_read_dataflash_version(di);
+ dev_info(&client->dev,
+ "Gas Guage fw version 0x%04x; df version 0x%04x\n",
+ di->fw_ver, di->df_ver);
if (di->fw_ver == L1_FW_VERSION)
di->regs = bq27x00_fw_l1_regs;