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;