History

Input: atmel_mxt_ts - Support for touchpad variant

This same driver can be used by atmel based touchscreens and touchpads (buttonpads). Platform data may specify a device is a touchpad using the is_tp flag. This will cause the driver to perform some touchpad specific initializations, such as: * register input device name "Atmel maXTouch Touchpad" instead of Touchscreen. * register BTN_LEFT & BTN_TOOL_* event types. * register axis resolution (as a fixed constant, for now) * register BUTTONPAD property * process GPIO buttons using reportid T19 Input event GPIO mapping is done by the platform data key_map array. key_map[x] should contain the KEY or BTN code to send when processing GPIOx from T19. To specify a GPIO as not an input source, populate with KEY_RESERVED, or 0.

Daniel Kurtz committed 13 years ago

Commit 22dfab71 parent 67a865a2 files · +67 −2Browse files

Unified · Split

2 files
  1. drivers/input/touchscreen/atmel_mxt_ts.c +62 −2
  2. include/linux/i2c/atmel_mxt_ts.h +5 −0
drivers/input/touchscreen/atmel_mxt_ts.c+62−2
@@ -181,6 +181,12 @@ · 180 unmodified lines
181181
182182 #define MXT_FWRESET_TIME 175 /* msec */
183183
184+/* MXT_SPT_GPIOPWM_T19 field */
185+#define MXT_GPIO0_MASK 0x04
186+#define MXT_GPIO1_MASK 0x08
187+#define MXT_GPIO2_MASK 0x10
188+#define MXT_GPIO3_MASK 0x20
189+
184190 /* Command to unlock bootloader */
185191 #define MXT_UNLOCK_CMD_MSB 0xaa
186192 #define MXT_UNLOCK_CMD_LSB 0xdc
@@ -212,6 +218,8 @@ · 25 unmodified lines
212218 /* Touchscreen absolute values */
213219 #define MXT_MAX_AREA 0xff
214220
221+#define MXT_PIXELS_PER_MM 20
222+
215223 struct mxt_info {
216224 u8 family_id;
217225 u8 variant_id;
@@ -243,6 +251,8 @@ struct mxt_data { · 25 unmodified lines
243251 const struct mxt_platform_data *pdata;
244252 struct mxt_object *object_table;
245253 struct mxt_info info;
254+ bool is_tp;
255+
246256 unsigned int irq;
247257 unsigned int max_x;
248258 unsigned int max_y;
@@ -251,6 +261,7 @@ struct mxt_data { · 2 unmodified lines
251261 u8 T6_reportid;
252262 u8 T9_reportid_min;
253263 u8 T9_reportid_max;
264+ u8 T19_reportid;
254265 };
255266
256267 static bool mxt_object_readable(unsigned int type)
@@ -502,6 +513,21 @@ static int mxt_write_object(struct mxt_data *data, · 245 unmodified lines
502513 return mxt_write_reg(data->client, reg + offset, val);
503514 }
504515
516+static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
517+{
518+ struct input_dev *input = data->input_dev;
519+ bool button;
520+ int i;
521+
522+ /* Active-low switch */
523+ for (i = 0; i < MXT_NUM_GPIO; i++) {
524+ if (data->pdata->key_map[i] == KEY_RESERVED)
525+ continue;
526+ button = !(message->message[0] & MXT_GPIO0_MASK << i);
527+ input_report_key(input, data->pdata->key_map[i], button);
528+ }
529+}
530+
505531 static void mxt_input_touchevent(struct mxt_data *data,
506532 struct mxt_message *message, int id)
507533 {
@@ -585,6 +611,9 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id) · 77 unmodified lines
585611 int id = reportid - data->T9_reportid_min;
586612 mxt_input_touchevent(data, &message, id);
587613 update_input = true;
614+ } else if (message.reportid == data->T19_reportid) {
615+ mxt_input_button(data, &message);
616+ update_input = true;
588617 } else {
589618 mxt_dump_message(dev, &message);
590619 }
@@ -764,6 +793,9 @@ static int mxt_get_object_table(struct mxt_data *data) · 173 unmodified lines
764793 data->T9_reportid_min = min_id;
765794 data->T9_reportid_max = max_id;
766795 break;
796+ case MXT_SPT_GPIOPWM_T19:
797+ data->T19_reportid = min_id;
798+ break;
767799 }
768800 }
769801
@@ -777,7 +809,7 @@ static void mxt_free_object_table(struct mxt_data *data) · 7 unmodified lines
777809 data->T6_reportid = 0;
778810 data->T9_reportid_min = 0;
779811 data->T9_reportid_max = 0;
780−
812+ data->T19_reportid = 0;
781813 }
782814
783815 static int mxt_initialize(struct mxt_data *data)
@@ -1115,9 +1147,13 @@ static int mxt_probe(struct i2c_client *client, · 331 unmodified lines
11151147 goto err_free_mem;
11161148 }
11171149
1118− input_dev->name = "Atmel maXTouch Touchscreen";
1150+ data->is_tp = pdata && pdata->is_tp;
1151+
1152+ input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" :
1153+ "Atmel maXTouch Touchscreen";
11191154 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
11201155 client->adapter->nr, client->addr);
1156+
11211157 input_dev->phys = data->phys;
11221158
11231159 input_dev->id.bustype = BUS_I2C;
@@ -1140,6 +1176,29 @@ static int mxt_probe(struct i2c_client *client, · 16 unmodified lines
11401176 __set_bit(EV_KEY, input_dev->evbit);
11411177 __set_bit(BTN_TOUCH, input_dev->keybit);
11421178
1179+ if (data->is_tp) {
1180+ int i;
1181+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1182+ __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
1183+
1184+ for (i = 0; i < MXT_NUM_GPIO; i++)
1185+ if (pdata->key_map[i] != KEY_RESERVED)
1186+ __set_bit(pdata->key_map[i], input_dev->keybit);
1187+
1188+ __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
1189+ __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1190+ __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
1191+ __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
1192+ __set_bit(BTN_TOOL_QUINTTAP, input_dev->keybit);
1193+
1194+ input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
1195+ input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
1196+ input_abs_set_res(input_dev, ABS_MT_POSITION_X,
1197+ MXT_PIXELS_PER_MM);
1198+ input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
1199+ MXT_PIXELS_PER_MM);
1200+ }
1201+
11431202 /* For single touch */
11441203 input_set_abs_params(input_dev, ABS_X,
11451204 0, data->max_x, 0, 0);
@@ -1258,6 +1317,7 @@ static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume); · 112 unmodified lines
12581317 static const struct i2c_device_id mxt_id[] = {
12591318 { "qt602240_ts", 0 },
12601319 { "atmel_mxt_ts", 0 },
1320+ { "atmel_mxt_tp", 0 },
12611321 { "mXT224", 0 },
12621322 { }
12631323 };
include/linux/i2c/atmel_mxt_ts.h+5−0
@@ -15,6 +15,9 @@ · 14 unmodified lines
1515
1616 #include <linux/types.h>
1717
18+/* For key_map array */
19+#define MXT_NUM_GPIO 4
20+
1821 /* Orient */
1922 #define MXT_NORMAL 0x0
2023 #define MXT_DIAGONAL 0x1
@@ -39,6 +42,8 @@ struct mxt_platform_data { · 18 unmodified lines
3942 unsigned int voltage;
4043 unsigned char orient;
4144 unsigned long irqflags;
45+ bool is_tp;
46+ const unsigned int key_map[MXT_NUM_GPIO];
4247 };
4348
4449 #endif /* __LINUX_ATMEL_MXT_TS_H */