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;
}