aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Dyer <nick.dyer@itdev.co.uk>2014-05-19 02:00:15 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-05-19 02:27:22 -0400
commitfb5e4c3ee140b29e1935b4bbb19c319177bed231 (patch)
tree8b633294e2d56e39f61dd88733dbbd9bd8a5e9c4
parent2cefdb1f0a27150755ef2730bafc58bf2ed16571 (diff)
Input: atmel_mxt_ts - improve T19 GPIO keys handling
* The mapping of the GPIO numbers into the T19 status byte varies between different maXTouch chips. Some have up to 7 GPIOs. Allowing a keycode array of up to 8 items is simpler and more generic. So replace #define with configurable number of keys which also allows the removal of is_tp. * Rename platform data parameters to include "t19" to prevent confusion with T15 key array. * Probe aborts early on when pdata is NULL, so no need to check. * Move "int i" to beginning of function (mixed declarations and code) * Use API calls rather than __set_bit() * Remove unused dev variable. Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Acked-by: Yufeng Shen <miletus@chromium.org> Reviewed-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c44
-rw-r--r--drivers/platform/chrome/chromeos_laptop.c17
-rw-r--r--include/linux/i2c/atmel_mxt_ts.h7
3 files changed, 30 insertions, 38 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 7eb515caf215..65df362cf327 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -180,12 +180,6 @@
180 180
181#define MXT_FWRESET_TIME 175 /* msec */ 181#define MXT_FWRESET_TIME 175 /* msec */
182 182
183/* MXT_SPT_GPIOPWM_T19 field */
184#define MXT_GPIO0_MASK 0x04
185#define MXT_GPIO1_MASK 0x08
186#define MXT_GPIO2_MASK 0x10
187#define MXT_GPIO3_MASK 0x20
188
189/* Command to unlock bootloader */ 183/* Command to unlock bootloader */
190#define MXT_UNLOCK_CMD_MSB 0xaa 184#define MXT_UNLOCK_CMD_MSB 0xaa
191#define MXT_UNLOCK_CMD_LSB 0xdc 185#define MXT_UNLOCK_CMD_LSB 0xdc
@@ -250,7 +244,6 @@ struct mxt_data {
250 const struct mxt_platform_data *pdata; 244 const struct mxt_platform_data *pdata;
251 struct mxt_object *object_table; 245 struct mxt_object *object_table;
252 struct mxt_info info; 246 struct mxt_info info;
253 bool is_tp;
254 247
255 unsigned int irq; 248 unsigned int irq;
256 unsigned int max_x; 249 unsigned int max_x;
@@ -515,15 +508,16 @@ static int mxt_write_object(struct mxt_data *data,
515static void mxt_input_button(struct mxt_data *data, struct mxt_message *message) 508static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
516{ 509{
517 struct input_dev *input = data->input_dev; 510 struct input_dev *input = data->input_dev;
511 const struct mxt_platform_data *pdata = data->pdata;
518 bool button; 512 bool button;
519 int i; 513 int i;
520 514
521 /* Active-low switch */ 515 /* Active-low switch */
522 for (i = 0; i < MXT_NUM_GPIO; i++) { 516 for (i = 0; i < pdata->t19_num_keys; i++) {
523 if (data->pdata->key_map[i] == KEY_RESERVED) 517 if (pdata->t19_keymap[i] == KEY_RESERVED)
524 continue; 518 continue;
525 button = !(message->message[0] & MXT_GPIO0_MASK << i); 519 button = !(message->message[0] & (1 << i));
526 input_report_key(input, data->pdata->key_map[i], button); 520 input_report_key(input, pdata->t19_keymap[i], button);
527 } 521 }
528} 522}
529 523
@@ -1084,6 +1078,8 @@ static int mxt_probe(struct i2c_client *client,
1084 struct input_dev *input_dev; 1078 struct input_dev *input_dev;
1085 int error; 1079 int error;
1086 unsigned int num_mt_slots; 1080 unsigned int num_mt_slots;
1081 unsigned int mt_flags = 0;
1082 int i;
1087 1083
1088 if (!pdata) 1084 if (!pdata)
1089 return -EINVAL; 1085 return -EINVAL;
@@ -1096,10 +1092,7 @@ static int mxt_probe(struct i2c_client *client,
1096 goto err_free_mem; 1092 goto err_free_mem;
1097 } 1093 }
1098 1094
1099 data->is_tp = pdata && pdata->is_tp; 1095 input_dev->name = "Atmel maXTouch Touchscreen";
1100
1101 input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" :
1102 "Atmel maXTouch Touchscreen";
1103 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", 1096 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
1104 client->adapter->nr, client->addr); 1097 client->adapter->nr, client->addr);
1105 1098
@@ -1125,20 +1118,15 @@ static int mxt_probe(struct i2c_client *client,
1125 __set_bit(EV_KEY, input_dev->evbit); 1118 __set_bit(EV_KEY, input_dev->evbit);
1126 __set_bit(BTN_TOUCH, input_dev->keybit); 1119 __set_bit(BTN_TOUCH, input_dev->keybit);
1127 1120
1128 if (data->is_tp) { 1121 if (pdata->t19_num_keys) {
1129 int i;
1130 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1131 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); 1122 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
1132 1123
1133 for (i = 0; i < MXT_NUM_GPIO; i++) 1124 for (i = 0; i < pdata->t19_num_keys; i++)
1134 if (pdata->key_map[i] != KEY_RESERVED) 1125 if (pdata->t19_keymap[i] != KEY_RESERVED)
1135 __set_bit(pdata->key_map[i], input_dev->keybit); 1126 input_set_capability(input_dev, EV_KEY,
1127 pdata->t19_keymap[i]);
1136 1128
1137 __set_bit(BTN_TOOL_FINGER, input_dev->keybit); 1129 mt_flags |= INPUT_MT_POINTER;
1138 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1139 __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
1140 __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
1141 __set_bit(BTN_TOOL_QUINTTAP, input_dev->keybit);
1142 1130
1143 input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM); 1131 input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
1144 input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM); 1132 input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
@@ -1146,6 +1134,8 @@ static int mxt_probe(struct i2c_client *client,
1146 MXT_PIXELS_PER_MM); 1134 MXT_PIXELS_PER_MM);
1147 input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 1135 input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
1148 MXT_PIXELS_PER_MM); 1136 MXT_PIXELS_PER_MM);
1137
1138 input_dev->name = "Atmel maXTouch Touchpad";
1149 } 1139 }
1150 1140
1151 /* For single touch */ 1141 /* For single touch */
@@ -1158,7 +1148,7 @@ static int mxt_probe(struct i2c_client *client,
1158 1148
1159 /* For multi touch */ 1149 /* For multi touch */
1160 num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1; 1150 num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
1161 error = input_mt_init_slots(input_dev, num_mt_slots, 0); 1151 error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags);
1162 if (error) 1152 if (error)
1163 goto err_free_object; 1153 goto err_free_object;
1164 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 1154 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c
index 2559a0407c58..8b7523ab62e5 100644
--- a/drivers/platform/chrome/chromeos_laptop.c
+++ b/drivers/platform/chrome/chromeos_laptop.c
@@ -84,16 +84,22 @@ static struct i2c_board_info tsl2563_als_device = {
84 I2C_BOARD_INFO("tsl2563", TAOS_ALS_I2C_ADDR), 84 I2C_BOARD_INFO("tsl2563", TAOS_ALS_I2C_ADDR),
85}; 85};
86 86
87static int mxt_t19_keys[] = {
88 KEY_RESERVED,
89 KEY_RESERVED,
90 KEY_RESERVED,
91 KEY_RESERVED,
92 KEY_RESERVED,
93 BTN_LEFT
94};
95
87static struct mxt_platform_data atmel_224s_tp_platform_data = { 96static struct mxt_platform_data atmel_224s_tp_platform_data = {
88 .x_size = 102*20, 97 .x_size = 102*20,
89 .y_size = 68*20, 98 .y_size = 68*20,
90 .orient = MXT_VERTICAL_FLIP, 99 .orient = MXT_VERTICAL_FLIP,
91 .irqflags = IRQF_TRIGGER_FALLING, 100 .irqflags = IRQF_TRIGGER_FALLING,
92 .is_tp = true, 101 .t19_num_keys = ARRAY_SIZE(mxt_t19_keys),
93 .key_map = { KEY_RESERVED, 102 .t19_keymap = mxt_t19_keys,
94 KEY_RESERVED,
95 KEY_RESERVED,
96 BTN_LEFT },
97 .config = NULL, 103 .config = NULL,
98 .config_length = 0, 104 .config_length = 0,
99}; 105};
@@ -109,7 +115,6 @@ static struct mxt_platform_data atmel_1664s_platform_data = {
109 .y_size = 2560, 115 .y_size = 2560,
110 .orient = MXT_ROTATED_90_COUNTER, 116 .orient = MXT_ROTATED_90_COUNTER,
111 .irqflags = IRQF_TRIGGER_FALLING, 117 .irqflags = IRQF_TRIGGER_FALLING,
112 .is_tp = false,
113 .config = NULL, 118 .config = NULL,
114 .config_length = 0, 119 .config_length = 0,
115}; 120};
diff --git a/include/linux/i2c/atmel_mxt_ts.h b/include/linux/i2c/atmel_mxt_ts.h
index eff0cdc08843..d26080dc606c 100644
--- a/include/linux/i2c/atmel_mxt_ts.h
+++ b/include/linux/i2c/atmel_mxt_ts.h
@@ -15,9 +15,6 @@
15 15
16#include <linux/types.h> 16#include <linux/types.h>
17 17
18/* For key_map array */
19#define MXT_NUM_GPIO 4
20
21/* Orient */ 18/* Orient */
22#define MXT_NORMAL 0x0 19#define MXT_NORMAL 0x0
23#define MXT_DIAGONAL 0x1 20#define MXT_DIAGONAL 0x1
@@ -38,8 +35,8 @@ struct mxt_platform_data {
38 unsigned char orient; 35 unsigned char orient;
39 36
40 unsigned long irqflags; 37 unsigned long irqflags;
41 bool is_tp; 38 u8 t19_num_keys;
42 const unsigned int key_map[MXT_NUM_GPIO]; 39 const unsigned int *t19_keymap;
43}; 40};
44 41
45#endif /* __LINUX_ATMEL_MXT_TS_H */ 42#endif /* __LINUX_ATMEL_MXT_TS_H */