mako: touch: add sys node for charger status update

Will be used to enable noise mitigation bit in firmware
to reduce noise when TA/USA/Wireless charger is connected.

Change-Id: Ia4174271758ca2dbd013b80ddcabffea2e2cae82
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/drivers/input/touchscreen/lge_touch_core.c b/drivers/input/touchscreen/lge_touch_core.c
index 46f4138..d8335ef 100644
--- a/drivers/input/touchscreen/lge_touch_core.c
+++ b/drivers/input/touchscreen/lge_touch_core.c
@@ -1541,6 +1541,53 @@
 	return count;
 }
 
+/* show_charger
+ *
+ * Show the current charger status
+ */
+static ssize_t show_charger(struct lge_touch_data *ts, char *buf)
+{
+	int ret = 0;
+
+	switch (ts->charger_type) {
+	case 0:
+		ret = sprintf(buf, "%s\n", "NO CHARGER");
+		break;
+	case 1:
+		ret = sprintf(buf, "%s\n", "WIRELESS");
+		break;
+	case 2:
+		ret = sprintf(buf, "%s\n", "USB");
+		break;
+	case 3:
+		ret = sprintf(buf, "%s\n", "AC");
+		break;
+	}
+
+	return ret;
+}
+
+/* store_charger
+ *
+ * Store the charger status
+ * Syntax: <type> <1:0>  type: 0: NO Charger, 1: WIRELESS, 2: USB, 3: AC
+ */
+static ssize_t store_charger(struct lge_touch_data *ts, const char *buf, size_t count)
+{
+	long type;
+
+	if (!kstrtol(buf, 10, &type)) {
+		if (type >= 0 && type <= 3) {
+			/* regardless of charger type */
+			ts->charger_type = type;
+			touch_device_func->ic_ctrl(ts->client,
+				IC_CTRL_CHARGER, ts->charger_type);
+		}
+	}
+
+	return count;
+}
+
 static LGE_TOUCH_ATTR(platform_data, S_IRUGO | S_IWUSR, show_platform_data, NULL);
 static LGE_TOUCH_ATTR(firmware, S_IRUGO | S_IWUSR, show_fw_info, store_fw_upgrade);
 static LGE_TOUCH_ATTR(fw_ver, S_IRUGO | S_IWUSR, show_fw_ver, NULL);
@@ -1551,6 +1598,7 @@
 static LGE_TOUCH_ATTR(show_touches, S_IRUGO | S_IWUSR, show_show_touches, store_show_touches);
 static LGE_TOUCH_ATTR(pointer_location, S_IRUGO | S_IWUSR, show_pointer_location,
 					store_pointer_location);
+static LGE_TOUCH_ATTR(charger, S_IRUGO | S_IWUSR, show_charger, store_charger);
 
 static struct attribute *lge_touch_attribute_list[] = {
 	&lge_touch_attr_platform_data.attr,
@@ -1562,6 +1610,7 @@
 	&lge_touch_attr_accuracy.attr,
 	&lge_touch_attr_show_touches.attr,
 	&lge_touch_attr_pointer_location.attr,
+	&lge_touch_attr_charger.attr,
 	NULL,
 };
 
diff --git a/drivers/input/touchscreen/touch_synaptics.c b/drivers/input/touchscreen/touch_synaptics.c
index b27ac1b..e7a2a22 100644
--- a/drivers/input/touchscreen/touch_synaptics.c
+++ b/drivers/input/touchscreen/touch_synaptics.c
@@ -154,6 +154,8 @@
 #define FINGER_STATE_PRESENT_NOVALID    2
 #define FINGER_STATE_REVSERVED          3
 
+#define CHARGER_CONNECTED               0x20
+
 int synaptics_ts_get_data(struct i2c_client *client, struct t_data* data,
 					struct b_data* button, u8* total_num)
 {
@@ -554,7 +556,8 @@
 			return -EIO;
 
 	if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
-		DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED) < 0)) {
+		DEVICE_CONTROL_NOSLEEP | DEVICE_CONTROL_CONFIGURED |
+		(lg_ts->charger_type ? CHARGER_CONNECTED : 0)) < 0)) {
 		TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
 		return -EIO;
 	}
@@ -670,6 +673,8 @@
 {
 	struct synaptics_ts_data* ts =
 			(struct synaptics_ts_data*)get_touch_handle(client);
+	struct lge_touch_data *lg_ts =
+			(struct lge_touch_data *) i2c_get_clientdata(client);
 
 	if (touch_debug_mask & DEBUG_TRACE)
 		TOUCH_DEBUG_MSG("\n");
@@ -699,16 +704,18 @@
 		break;
 	case POWER_SLEEP:
 		if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
-					DEVICE_CONTROL_SLEEP |
-					DEVICE_CONTROL_CONFIGURED) < 0)) {
+				DEVICE_CONTROL_SLEEP |
+				(lg_ts->charger_type ? CHARGER_CONNECTED : 0) |
+				DEVICE_CONTROL_CONFIGURED) < 0)) {
 			TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
 			return -EIO;
 		}
 		break;
 	case POWER_WAKE:
 		if (unlikely(touch_i2c_write_byte(client, DEVICE_CONTROL_REG,
-					DEVICE_CONTROL_SPECIFIC |
-					DEVICE_CONTROL_CONFIGURED) < 0)) {
+				DEVICE_CONTROL_SPECIFIC |
+				(lg_ts->charger_type ? CHARGER_CONNECTED : 0) |
+				DEVICE_CONTROL_CONFIGURED) < 0)) {
 			TOUCH_ERR_MSG("DEVICE_CONTROL_REG write fail\n");
 			return -EIO;
 		}
@@ -845,6 +852,7 @@
 	struct synaptics_ts_data* ts =
 			(struct synaptics_ts_data*)get_touch_handle(client);
 	u8 buf = 0;
+	u8 new;
 
 	switch (code) {
 	case IC_CTRL_BASELINE:
@@ -1023,6 +1031,25 @@
 			return -EIO;
 		}
 		break;
+	case IC_CTRL_CHARGER:
+		if (touch_i2c_read(client, DEVICE_CONTROL_REG, 1, &buf) < 0) {
+			TOUCH_ERR_MSG("IC register read fail\n");
+			return -EIO;
+		}
+
+		new = buf & ~CHARGER_CONNECTED;
+		new |= value ? CHARGER_CONNECTED : 0;
+
+		if (new != buf) {
+			if (unlikely(touch_i2c_write_byte(client,
+					DEVICE_CONTROL_REG, new) < 0)) {
+				TOUCH_ERR_MSG("IC Reset command write fail\n");
+				return -EIO;
+			}
+			TOUCH_INFO_MSG("CHARGER = %d\n", !!value);
+		}
+
+		break;
 	default:
 		break;
 	}