diff options
author | Nick Dyer <nick.dyer@itdev.co.uk> | 2014-05-19 02:00:15 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-05-19 02:27:22 -0400 |
commit | fb5e4c3ee140b29e1935b4bbb19c319177bed231 (patch) | |
tree | 8b633294e2d56e39f61dd88733dbbd9bd8a5e9c4 | |
parent | 2cefdb1f0a27150755ef2730bafc58bf2ed16571 (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.c | 44 | ||||
-rw-r--r-- | drivers/platform/chrome/chromeos_laptop.c | 17 | ||||
-rw-r--r-- | include/linux/i2c/atmel_mxt_ts.h | 7 |
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, | |||
515 | static void mxt_input_button(struct mxt_data *data, struct mxt_message *message) | 508 | static 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 | ||
87 | static int mxt_t19_keys[] = { | ||
88 | KEY_RESERVED, | ||
89 | KEY_RESERVED, | ||
90 | KEY_RESERVED, | ||
91 | KEY_RESERVED, | ||
92 | KEY_RESERVED, | ||
93 | BTN_LEFT | ||
94 | }; | ||
95 | |||
87 | static struct mxt_platform_data atmel_224s_tp_platform_data = { | 96 | static 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 */ |