OSDN Git Service

input: touchscreen: Add debugfs entries for GTP controller
authorShantanu Jain <shjain@codeaurora.org>
Wed, 22 Jan 2014 16:43:45 +0000 (22:13 +0530)
committerShantanu Jain <shjain@codeaurora.org>
Thu, 20 Oct 2016 11:41:18 +0000 (17:11 +0530)
Add debugfs entries for address and data to read the registers
of Goodix controller.

Change-Id: I6543d523e39771615d0e1b684780141e108a2aa4
Signed-off-by: Shantanu Jain <shjain@codeaurora.org>
drivers/input/touchscreen/gt9xx/gt9xx.c
drivers/input/touchscreen/gt9xx/gt9xx.h

index a9d7666..c870df3 100644 (file)
@@ -115,6 +115,8 @@ struct i2c_client  *i2c_connect_client;
 
 #define GTP_DEBUGFS_DIR                        "ts_debug"
 #define GTP_DEBUGFS_FILE_SUSPEND       "suspend"
+#define GTP_DEBUGFS_FILE_DATA          "data"
+#define GTP_DEBUGFS_FILE_ADDR          "addr"
 
 /*******************************************************
 Function:
@@ -1534,6 +1536,84 @@ static const struct attribute_group gtp_attr_grp = {
        .attrs = gtp_attrs,
 };
 
+static int gtp_debug_addr_is_valid(u16 addr)
+{
+       if (addr < GTP_VALID_ADDR_START || addr > GTP_VALID_ADDR_END) {
+               pr_err("GTP reg address is invalid: 0x%x\n", addr);
+               return false;
+       }
+
+       return true;
+}
+
+static int gtp_debug_data_set(void *_data, u64 val)
+{
+       struct goodix_ts_data *ts = _data;
+
+       mutex_lock(&ts->input_dev->mutex);
+       if (gtp_debug_addr_is_valid(ts->addr))
+               dev_err(&ts->client->dev,
+                       "Writing to GTP registers not supported\n");
+       mutex_unlock(&ts->input_dev->mutex);
+
+       return 0;
+}
+
+static int gtp_debug_data_get(void *_data, u64 *val)
+{
+       struct goodix_ts_data *ts = _data;
+       int ret;
+       u8 buf[3] = {0};
+
+       mutex_lock(&ts->input_dev->mutex);
+       buf[0] = ts->addr >> 8;
+       buf[1] = ts->addr & 0x00ff;
+
+       if (gtp_debug_addr_is_valid(ts->addr)) {
+               ret = gtp_i2c_read(ts->client, buf, 3);
+               if (ret < 0)
+                       dev_err(&ts->client->dev,
+                               "GTP read register 0x%x failed (%d)\n",
+                               ts->addr, ret);
+               else
+                       *val = buf[2];
+       }
+       mutex_unlock(&ts->input_dev->mutex);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(debug_data_fops, gtp_debug_data_get,
+                               gtp_debug_data_set, "%llx\n");
+
+static int gtp_debug_addr_set(void *_data, u64 val)
+{
+       struct goodix_ts_data *ts = _data;
+
+       if (gtp_debug_addr_is_valid(val)) {
+               mutex_lock(&ts->input_dev->mutex);
+                       ts->addr = val;
+               mutex_unlock(&ts->input_dev->mutex);
+       }
+
+       return 0;
+}
+
+static int gtp_debug_addr_get(void *_data, u64 *val)
+{
+       struct goodix_ts_data *ts = _data;
+
+       mutex_lock(&ts->input_dev->mutex);
+       if (gtp_debug_addr_is_valid(ts->addr))
+               *val = ts->addr;
+       mutex_unlock(&ts->input_dev->mutex);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(debug_addr_fops, gtp_debug_addr_get,
+                               gtp_debug_addr_set, "%llx\n");
+
 static int gtp_debug_suspend_set(void *_data, u64 val)
 {
        struct goodix_ts_data *ts = _data;
@@ -1567,7 +1647,7 @@ static int gtp_debugfs_init(struct goodix_ts_data *data)
        data->debug_base = debugfs_create_dir(GTP_DEBUGFS_DIR, NULL);
 
        if (IS_ERR_OR_NULL(data->debug_base)) {
-               pr_err("Failed to create debugfs dir\n");
+               dev_err(&data->client->dev, "Failed to create debugfs dir\n");
                        return -EINVAL;
        }
 
@@ -1576,7 +1656,27 @@ static int gtp_debugfs_init(struct goodix_ts_data *data)
                                        data->debug_base,
                                        data,
                                        &debug_suspend_fops)))) {
-               pr_err("Failed to create suspend file\n");
+               dev_err(&data->client->dev, "Failed to create suspend file\n");
+               debugfs_remove_recursive(data->debug_base);
+               return -EINVAL;
+       }
+
+       if ((IS_ERR_OR_NULL(debugfs_create_file(GTP_DEBUGFS_FILE_DATA,
+                                       S_IWUSR | S_IWGRP | S_IRUSR | S_IRGRP,
+                                       data->debug_base,
+                                       data,
+                                       &debug_data_fops)))) {
+               dev_err(&data->client->dev, "Failed to create data file\n");
+               debugfs_remove_recursive(data->debug_base);
+               return -EINVAL;
+       }
+
+       if ((IS_ERR_OR_NULL(debugfs_create_file(GTP_DEBUGFS_FILE_ADDR,
+                                       S_IWUSR | S_IWGRP | S_IRUSR | S_IRGRP,
+                                       data->debug_base,
+                                       data,
+                                       &debug_addr_fops)))) {
+               dev_err(&data->client->dev, "Failed to create addr file\n");
                debugfs_remove_recursive(data->debug_base);
                return -EINVAL;
        }
index 38487ee..31b078b 100644 (file)
@@ -74,6 +74,7 @@ struct goodix_ts_data {
        s32 use_irq;
        u16 abs_x_max;
        u16 abs_y_max;
+       u16 addr;
        u8  max_touch_num;
        u8  int_trigger_type;
        u8  green_wake_mode;
@@ -172,6 +173,8 @@ extern u16 total_len;
 /* HIGH: 0x28/0x29, LOW: 0xBA/0xBB */
 #define GTP_I2C_ADDRESS_HIGH   0x14
 #define GTP_I2C_ADDRESS_LOW    0x5D
+#define GTP_VALID_ADDR_START   0x8040
+#define GTP_VALID_ADDR_END     0x8177
 
 /* GTP CM_HEAD RW flags */
 #define GTP_RW_READ                    0