Input: atmel_mxt_ts - improve T19 GPIO keys handling
authorNick Dyer <nick.dyer@itdev.co.uk>
Mon, 19 May 2014 06:00:15 +0000 (23:00 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 19 May 2014 06:27:22 +0000 (23:27 -0700)
 * 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>
drivers/input/touchscreen/atmel_mxt_ts.c
drivers/platform/chrome/chromeos_laptop.c
include/linux/i2c/atmel_mxt_ts.h

index 7eb515caf215ddc4187407dc78d2519f825c638f..65df362cf3278b69082b488e74a01cc66b398d32 100644 (file)
 
 #define MXT_FWRESET_TIME       175     /* msec */
 
-/* MXT_SPT_GPIOPWM_T19 field */
-#define MXT_GPIO0_MASK         0x04
-#define MXT_GPIO1_MASK         0x08
-#define MXT_GPIO2_MASK         0x10
-#define MXT_GPIO3_MASK         0x20
-
 /* Command to unlock bootloader */
 #define MXT_UNLOCK_CMD_MSB     0xaa
 #define MXT_UNLOCK_CMD_LSB     0xdc
@@ -250,7 +244,6 @@ struct mxt_data {
        const struct mxt_platform_data *pdata;
        struct mxt_object *object_table;
        struct mxt_info info;
-       bool is_tp;
 
        unsigned int irq;
        unsigned int max_x;
@@ -515,15 +508,16 @@ static int mxt_write_object(struct mxt_data *data,
 static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
 {
        struct input_dev *input = data->input_dev;
+       const struct mxt_platform_data *pdata = data->pdata;
        bool button;
        int i;
 
        /* Active-low switch */
-       for (i = 0; i < MXT_NUM_GPIO; i++) {
-               if (data->pdata->key_map[i] == KEY_RESERVED)
+       for (i = 0; i < pdata->t19_num_keys; i++) {
+               if (pdata->t19_keymap[i] == KEY_RESERVED)
                        continue;
-               button = !(message->message[0] & MXT_GPIO0_MASK << i);
-               input_report_key(input, data->pdata->key_map[i], button);
+               button = !(message->message[0] & (1 << i));
+               input_report_key(input, pdata->t19_keymap[i], button);
        }
 }
 
@@ -1084,6 +1078,8 @@ static int mxt_probe(struct i2c_client *client,
        struct input_dev *input_dev;
        int error;
        unsigned int num_mt_slots;
+       unsigned int mt_flags = 0;
+       int i;
 
        if (!pdata)
                return -EINVAL;
@@ -1096,10 +1092,7 @@ static int mxt_probe(struct i2c_client *client,
                goto err_free_mem;
        }
 
-       data->is_tp = pdata && pdata->is_tp;
-
-       input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" :
-                                         "Atmel maXTouch Touchscreen";
+       input_dev->name = "Atmel maXTouch Touchscreen";
        snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
                 client->adapter->nr, client->addr);
 
@@ -1125,20 +1118,15 @@ static int mxt_probe(struct i2c_client *client,
        __set_bit(EV_KEY, input_dev->evbit);
        __set_bit(BTN_TOUCH, input_dev->keybit);
 
-       if (data->is_tp) {
-               int i;
-               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+       if (pdata->t19_num_keys) {
                __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
 
-               for (i = 0; i < MXT_NUM_GPIO; i++)
-                       if (pdata->key_map[i] != KEY_RESERVED)
-                               __set_bit(pdata->key_map[i], input_dev->keybit);
+               for (i = 0; i < pdata->t19_num_keys; i++)
+                       if (pdata->t19_keymap[i] != KEY_RESERVED)
+                               input_set_capability(input_dev, EV_KEY,
+                                                    pdata->t19_keymap[i]);
 
-               __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
-               __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
-               __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
-               __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
-               __set_bit(BTN_TOOL_QUINTTAP, input_dev->keybit);
+               mt_flags |= INPUT_MT_POINTER;
 
                input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
                input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
@@ -1146,6 +1134,8 @@ static int mxt_probe(struct i2c_client *client,
                                  MXT_PIXELS_PER_MM);
                input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
                                  MXT_PIXELS_PER_MM);
+
+               input_dev->name = "Atmel maXTouch Touchpad";
        }
 
        /* For single touch */
@@ -1158,7 +1148,7 @@ static int mxt_probe(struct i2c_client *client,
 
        /* For multi touch */
        num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
-       error = input_mt_init_slots(input_dev, num_mt_slots, 0);
+       error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags);
        if (error)
                goto err_free_object;
        input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
index 2559a0407c58b15d635bea86fc819062ee303d96..8b7523ab62e5a694cf643c387fe3348571131f1a 100644 (file)
@@ -84,16 +84,22 @@ static struct i2c_board_info tsl2563_als_device = {
        I2C_BOARD_INFO("tsl2563", TAOS_ALS_I2C_ADDR),
 };
 
+static int mxt_t19_keys[] = {
+       KEY_RESERVED,
+       KEY_RESERVED,
+       KEY_RESERVED,
+       KEY_RESERVED,
+       KEY_RESERVED,
+       BTN_LEFT
+};
+
 static struct mxt_platform_data atmel_224s_tp_platform_data = {
        .x_size                 = 102*20,
        .y_size                 = 68*20,
        .orient                 = MXT_VERTICAL_FLIP,
        .irqflags               = IRQF_TRIGGER_FALLING,
-       .is_tp                  = true,
-       .key_map                = { KEY_RESERVED,
-                                   KEY_RESERVED,
-                                   KEY_RESERVED,
-                                   BTN_LEFT },
+       .t19_num_keys           = ARRAY_SIZE(mxt_t19_keys),
+       .t19_keymap             = mxt_t19_keys,
        .config                 = NULL,
        .config_length          = 0,
 };
@@ -109,7 +115,6 @@ static struct mxt_platform_data atmel_1664s_platform_data = {
        .y_size                 = 2560,
        .orient                 = MXT_ROTATED_90_COUNTER,
        .irqflags               = IRQF_TRIGGER_FALLING,
-       .is_tp                  = false,
        .config                 = NULL,
        .config_length          = 0,
 };
index eff0cdc088434aca92439a7bd3cff3be5f3243ca..d26080dc606cae74fc1dedae2f8c2c7dfe1ab4de 100644 (file)
@@ -15,9 +15,6 @@
 
 #include <linux/types.h>
 
-/* For key_map array */
-#define MXT_NUM_GPIO           4
-
 /* Orient */
 #define MXT_NORMAL             0x0
 #define MXT_DIAGONAL           0x1
@@ -38,8 +35,8 @@ struct mxt_platform_data {
        unsigned char orient;
 
        unsigned long irqflags;
-       bool is_tp;
-       const unsigned int key_map[MXT_NUM_GPIO];
+       u8 t19_num_keys;
+       const unsigned int *t19_keymap;
 };
 
 #endif /* __LINUX_ATMEL_MXT_TS_H */