Loading drivers/input/touchscreen/gt9xx/gt9xx.c +102 −2 Original line number Diff line number Diff line Loading @@ -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: Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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; } Loading drivers/input/touchscreen/gt9xx/gt9xx.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading
drivers/input/touchscreen/gt9xx/gt9xx.c +102 −2 Original line number Diff line number Diff line Loading @@ -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: Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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; } Loading
drivers/input/touchscreen/gt9xx/gt9xx.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading