diff options
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r-- | drivers/input/touchscreen/ads7846.c | 7 | ||||
-rw-r--r-- | drivers/input/touchscreen/atmel_mxt_ts.c | 68 | ||||
-rw-r--r-- | drivers/input/touchscreen/mms114.c | 34 |
3 files changed, 95 insertions, 14 deletions
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 4f702b3ec1a3..434c3df250ca 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -236,7 +236,12 @@ static void __ads7846_disable(struct ads7846 *ts) | |||
236 | /* Must be called with ts->lock held */ | 236 | /* Must be called with ts->lock held */ |
237 | static void __ads7846_enable(struct ads7846 *ts) | 237 | static void __ads7846_enable(struct ads7846 *ts) |
238 | { | 238 | { |
239 | regulator_enable(ts->reg); | 239 | int error; |
240 | |||
241 | error = regulator_enable(ts->reg); | ||
242 | if (error != 0) | ||
243 | dev_err(&ts->spi->dev, "Failed to enable supply: %d\n", error); | ||
244 | |||
240 | ads7846_restart(ts); | 245 | ads7846_restart(ts); |
241 | } | 246 | } |
242 | 247 | ||
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index d04f810cb1dd..59aa24002c7b 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c | |||
@@ -176,11 +176,17 @@ | |||
176 | /* Define for MXT_GEN_COMMAND_T6 */ | 176 | /* Define for MXT_GEN_COMMAND_T6 */ |
177 | #define MXT_BOOT_VALUE 0xa5 | 177 | #define MXT_BOOT_VALUE 0xa5 |
178 | #define MXT_BACKUP_VALUE 0x55 | 178 | #define MXT_BACKUP_VALUE 0x55 |
179 | #define MXT_BACKUP_TIME 25 /* msec */ | 179 | #define MXT_BACKUP_TIME 50 /* msec */ |
180 | #define MXT_RESET_TIME 65 /* msec */ | 180 | #define MXT_RESET_TIME 200 /* msec */ |
181 | 181 | ||
182 | #define MXT_FWRESET_TIME 175 /* msec */ | 182 | #define MXT_FWRESET_TIME 175 /* msec */ |
183 | 183 | ||
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 | |||
184 | /* Command to unlock bootloader */ | 190 | /* Command to unlock bootloader */ |
185 | #define MXT_UNLOCK_CMD_MSB 0xaa | 191 | #define MXT_UNLOCK_CMD_MSB 0xaa |
186 | #define MXT_UNLOCK_CMD_LSB 0xdc | 192 | #define MXT_UNLOCK_CMD_LSB 0xdc |
@@ -212,6 +218,8 @@ | |||
212 | /* Touchscreen absolute values */ | 218 | /* Touchscreen absolute values */ |
213 | #define MXT_MAX_AREA 0xff | 219 | #define MXT_MAX_AREA 0xff |
214 | 220 | ||
221 | #define MXT_PIXELS_PER_MM 20 | ||
222 | |||
215 | struct mxt_info { | 223 | struct mxt_info { |
216 | u8 family_id; | 224 | u8 family_id; |
217 | u8 variant_id; | 225 | u8 variant_id; |
@@ -243,6 +251,8 @@ struct mxt_data { | |||
243 | const struct mxt_platform_data *pdata; | 251 | const struct mxt_platform_data *pdata; |
244 | struct mxt_object *object_table; | 252 | struct mxt_object *object_table; |
245 | struct mxt_info info; | 253 | struct mxt_info info; |
254 | bool is_tp; | ||
255 | |||
246 | unsigned int irq; | 256 | unsigned int irq; |
247 | unsigned int max_x; | 257 | unsigned int max_x; |
248 | unsigned int max_y; | 258 | unsigned int max_y; |
@@ -251,6 +261,7 @@ struct mxt_data { | |||
251 | u8 T6_reportid; | 261 | u8 T6_reportid; |
252 | u8 T9_reportid_min; | 262 | u8 T9_reportid_min; |
253 | u8 T9_reportid_max; | 263 | u8 T9_reportid_max; |
264 | u8 T19_reportid; | ||
254 | }; | 265 | }; |
255 | 266 | ||
256 | static bool mxt_object_readable(unsigned int type) | 267 | static bool mxt_object_readable(unsigned int type) |
@@ -502,6 +513,21 @@ static int mxt_write_object(struct mxt_data *data, | |||
502 | return mxt_write_reg(data->client, reg + offset, val); | 513 | return mxt_write_reg(data->client, reg + offset, val); |
503 | } | 514 | } |
504 | 515 | ||
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 | |||
505 | static void mxt_input_touchevent(struct mxt_data *data, | 531 | static void mxt_input_touchevent(struct mxt_data *data, |
506 | struct mxt_message *message, int id) | 532 | struct mxt_message *message, int id) |
507 | { | 533 | { |
@@ -585,6 +611,9 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id) | |||
585 | int id = reportid - data->T9_reportid_min; | 611 | int id = reportid - data->T9_reportid_min; |
586 | mxt_input_touchevent(data, &message, id); | 612 | mxt_input_touchevent(data, &message, id); |
587 | update_input = true; | 613 | update_input = true; |
614 | } else if (message.reportid == data->T19_reportid) { | ||
615 | mxt_input_button(data, &message); | ||
616 | update_input = true; | ||
588 | } else { | 617 | } else { |
589 | mxt_dump_message(dev, &message); | 618 | mxt_dump_message(dev, &message); |
590 | } | 619 | } |
@@ -764,6 +793,9 @@ static int mxt_get_object_table(struct mxt_data *data) | |||
764 | data->T9_reportid_min = min_id; | 793 | data->T9_reportid_min = min_id; |
765 | data->T9_reportid_max = max_id; | 794 | data->T9_reportid_max = max_id; |
766 | break; | 795 | break; |
796 | case MXT_SPT_GPIOPWM_T19: | ||
797 | data->T19_reportid = min_id; | ||
798 | break; | ||
767 | } | 799 | } |
768 | } | 800 | } |
769 | 801 | ||
@@ -777,7 +809,7 @@ static void mxt_free_object_table(struct mxt_data *data) | |||
777 | data->T6_reportid = 0; | 809 | data->T6_reportid = 0; |
778 | data->T9_reportid_min = 0; | 810 | data->T9_reportid_min = 0; |
779 | data->T9_reportid_max = 0; | 811 | data->T9_reportid_max = 0; |
780 | 812 | data->T19_reportid = 0; | |
781 | } | 813 | } |
782 | 814 | ||
783 | static int mxt_initialize(struct mxt_data *data) | 815 | static int mxt_initialize(struct mxt_data *data) |
@@ -1115,9 +1147,13 @@ static int mxt_probe(struct i2c_client *client, | |||
1115 | goto err_free_mem; | 1147 | goto err_free_mem; |
1116 | } | 1148 | } |
1117 | 1149 | ||
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"; | ||
1119 | snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", | 1154 | snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", |
1120 | client->adapter->nr, client->addr); | 1155 | client->adapter->nr, client->addr); |
1156 | |||
1121 | input_dev->phys = data->phys; | 1157 | input_dev->phys = data->phys; |
1122 | 1158 | ||
1123 | input_dev->id.bustype = BUS_I2C; | 1159 | input_dev->id.bustype = BUS_I2C; |
@@ -1140,6 +1176,29 @@ static int mxt_probe(struct i2c_client *client, | |||
1140 | __set_bit(EV_KEY, input_dev->evbit); | 1176 | __set_bit(EV_KEY, input_dev->evbit); |
1141 | __set_bit(BTN_TOUCH, input_dev->keybit); | 1177 | __set_bit(BTN_TOUCH, input_dev->keybit); |
1142 | 1178 | ||
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 | |||
1143 | /* For single touch */ | 1202 | /* For single touch */ |
1144 | input_set_abs_params(input_dev, ABS_X, | 1203 | input_set_abs_params(input_dev, ABS_X, |
1145 | 0, data->max_x, 0, 0); | 1204 | 0, data->max_x, 0, 0); |
@@ -1258,6 +1317,7 @@ static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume); | |||
1258 | static const struct i2c_device_id mxt_id[] = { | 1317 | static const struct i2c_device_id mxt_id[] = { |
1259 | { "qt602240_ts", 0 }, | 1318 | { "qt602240_ts", 0 }, |
1260 | { "atmel_mxt_ts", 0 }, | 1319 | { "atmel_mxt_ts", 0 }, |
1320 | { "atmel_mxt_tp", 0 }, | ||
1261 | { "mXT224", 0 }, | 1321 | { "mXT224", 0 }, |
1262 | { } | 1322 | { } |
1263 | }; | 1323 | }; |
diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c index 4a29ddf6bf1e..1443532fe6c4 100644 --- a/drivers/input/touchscreen/mms114.c +++ b/drivers/input/touchscreen/mms114.c | |||
@@ -314,15 +314,27 @@ static int mms114_start(struct mms114_data *data) | |||
314 | struct i2c_client *client = data->client; | 314 | struct i2c_client *client = data->client; |
315 | int error; | 315 | int error; |
316 | 316 | ||
317 | if (data->core_reg) | 317 | error = regulator_enable(data->core_reg); |
318 | regulator_enable(data->core_reg); | 318 | if (error) { |
319 | if (data->io_reg) | 319 | dev_err(&client->dev, "Failed to enable avdd: %d\n", error); |
320 | regulator_enable(data->io_reg); | 320 | return error; |
321 | } | ||
322 | |||
323 | error = regulator_enable(data->io_reg); | ||
324 | if (error) { | ||
325 | dev_err(&client->dev, "Failed to enable vdd: %d\n", error); | ||
326 | regulator_disable(data->core_reg); | ||
327 | return error; | ||
328 | } | ||
329 | |||
321 | mdelay(MMS114_POWERON_DELAY); | 330 | mdelay(MMS114_POWERON_DELAY); |
322 | 331 | ||
323 | error = mms114_setup_regs(data); | 332 | error = mms114_setup_regs(data); |
324 | if (error < 0) | 333 | if (error < 0) { |
334 | regulator_disable(data->io_reg); | ||
335 | regulator_disable(data->core_reg); | ||
325 | return error; | 336 | return error; |
337 | } | ||
326 | 338 | ||
327 | if (data->pdata->cfg_pin) | 339 | if (data->pdata->cfg_pin) |
328 | data->pdata->cfg_pin(true); | 340 | data->pdata->cfg_pin(true); |
@@ -335,16 +347,20 @@ static int mms114_start(struct mms114_data *data) | |||
335 | static void mms114_stop(struct mms114_data *data) | 347 | static void mms114_stop(struct mms114_data *data) |
336 | { | 348 | { |
337 | struct i2c_client *client = data->client; | 349 | struct i2c_client *client = data->client; |
350 | int error; | ||
338 | 351 | ||
339 | disable_irq(client->irq); | 352 | disable_irq(client->irq); |
340 | 353 | ||
341 | if (data->pdata->cfg_pin) | 354 | if (data->pdata->cfg_pin) |
342 | data->pdata->cfg_pin(false); | 355 | data->pdata->cfg_pin(false); |
343 | 356 | ||
344 | if (data->io_reg) | 357 | error = regulator_disable(data->io_reg); |
345 | regulator_disable(data->io_reg); | 358 | if (error) |
346 | if (data->core_reg) | 359 | dev_warn(&client->dev, "Failed to disable vdd: %d\n", error); |
347 | regulator_disable(data->core_reg); | 360 | |
361 | error = regulator_disable(data->core_reg); | ||
362 | if (error) | ||
363 | dev_warn(&client->dev, "Failed to disable avdd: %d\n", error); | ||
348 | } | 364 | } |
349 | 365 | ||
350 | static int mms114_input_open(struct input_dev *dev) | 366 | static int mms114_input_open(struct input_dev *dev) |