Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[firefly-linux-kernel-4.4.55.git] / drivers / input / touchscreen / atmel_mxt_ts.c
index 0e743b3a691bdc87b080bb8dfa3a41030dd59a86..c5622058c22bba77b14ed336b764dc7b1ac6c617 100644 (file)
 #include <linux/slab.h>
 #include <asm/unaligned.h>
 
-/* Version */
-#define MXT_VER_20             20
-#define MXT_VER_21             21
-#define MXT_VER_22             22
-
 /* Firmware files */
 #define MXT_FW_NAME            "maxtouch.fw"
 #define MXT_CFG_NAME           "maxtouch.cfg"
 #define MXT_CFG_MAGIC          "OBP_RAW V1"
 
 /* Registers */
-#define MXT_INFO               0x00
-#define MXT_FAMILY_ID          0x00
-#define MXT_VARIANT_ID         0x01
-#define MXT_VERSION            0x02
-#define MXT_BUILD              0x03
-#define MXT_MATRIX_X_SIZE      0x04
-#define MXT_MATRIX_Y_SIZE      0x05
-#define MXT_OBJECT_NUM         0x06
 #define MXT_OBJECT_START       0x07
-
 #define MXT_OBJECT_SIZE                6
 #define MXT_INFO_CHECKSUM_SIZE 3
 #define MXT_MAX_BLOCK_WRITE    256
@@ -111,15 +97,6 @@ struct t7_config {
 #define MXT_POWER_CFG_RUN              0
 #define MXT_POWER_CFG_DEEPSLEEP                1
 
-/* MXT_GEN_ACQUIRE_T8 field */
-#define MXT_ACQUIRE_CHRGTIME   0
-#define MXT_ACQUIRE_TCHDRIFT   2
-#define MXT_ACQUIRE_DRIFTST    3
-#define MXT_ACQUIRE_TCHAUTOCAL 4
-#define MXT_ACQUIRE_SYNC       5
-#define MXT_ACQUIRE_ATCHCALST  6
-#define MXT_ACQUIRE_ATCHCALSTHR        7
-
 /* MXT_TOUCH_MULTI_T9 field */
 #define MXT_T9_CTRL            0
 #define MXT_T9_ORIENT          9
@@ -143,51 +120,10 @@ struct t9_range {
 /* MXT_TOUCH_MULTI_T9 orient */
 #define MXT_T9_ORIENT_SWITCH   (1 << 0)
 
-/* MXT_PROCI_GRIPFACE_T20 field */
-#define MXT_GRIPFACE_CTRL      0
-#define MXT_GRIPFACE_XLOGRIP   1
-#define MXT_GRIPFACE_XHIGRIP   2
-#define MXT_GRIPFACE_YLOGRIP   3
-#define MXT_GRIPFACE_YHIGRIP   4
-#define MXT_GRIPFACE_MAXTCHS   5
-#define MXT_GRIPFACE_SZTHR1    7
-#define MXT_GRIPFACE_SZTHR2    8
-#define MXT_GRIPFACE_SHPTHR1   9
-#define MXT_GRIPFACE_SHPTHR2   10
-#define MXT_GRIPFACE_SUPEXTTO  11
-
-/* MXT_PROCI_NOISE field */
-#define MXT_NOISE_CTRL         0
-#define MXT_NOISE_OUTFLEN      1
-#define MXT_NOISE_GCAFUL_LSB   3
-#define MXT_NOISE_GCAFUL_MSB   4
-#define MXT_NOISE_GCAFLL_LSB   5
-#define MXT_NOISE_GCAFLL_MSB   6
-#define MXT_NOISE_ACTVGCAFVALID        7
-#define MXT_NOISE_NOISETHR     8
-#define MXT_NOISE_FREQHOPSCALE 10
-#define MXT_NOISE_FREQ0                11
-#define MXT_NOISE_FREQ1                12
-#define MXT_NOISE_FREQ2                13
-#define MXT_NOISE_FREQ3                14
-#define MXT_NOISE_FREQ4                15
-#define MXT_NOISE_IDLEGCAFVALID        16
-
 /* MXT_SPT_COMMSCONFIG_T18 */
 #define MXT_COMMS_CTRL         0
 #define MXT_COMMS_CMD          1
 
-/* MXT_SPT_CTECONFIG_T28 field */
-#define MXT_CTE_CTRL           0
-#define MXT_CTE_CMD            1
-#define MXT_CTE_MODE           2
-#define MXT_CTE_IDLEGCAFDEPTH  3
-#define MXT_CTE_ACTVGCAFDEPTH  4
-#define MXT_CTE_VOLTAGE                5
-
-#define MXT_VOLTAGE_DEFAULT    2700000
-#define MXT_VOLTAGE_STEP       10000
-
 /* Define for MXT_GEN_COMMAND_T6 */
 #define MXT_BOOT_VALUE         0xa5
 #define MXT_RESET_VALUE                0x01
@@ -1002,16 +938,15 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
 
        count = data->msg_buf[0];
 
-       if (count == 0) {
-               /*
-                * This condition is caused by the CHG line being configured
-                * in Mode 0. It results in unnecessary I2C operations but it
-                * is benign.
-                */
-               dev_dbg(dev, "Interrupt triggered but zero messages\n");
+       /*
+        * This condition may be caused by the CHG line being configured in
+        * Mode 0. It results in unnecessary I2C operations but it is benign.
+        */
+       if (count == 0)
                return IRQ_NONE;
-       } else if (count > data->max_reportid) {
-               dev_err(dev, "T44 count %d exceeded max report id\n", count);
+
+       if (count > data->max_reportid) {
+               dev_warn(dev, "T44 count %d exceeded max report id\n", count);
                count = data->max_reportid;
        }
 
@@ -1162,7 +1097,9 @@ static int mxt_soft_reset(struct mxt_data *data)
        struct device *dev = &data->client->dev;
        int ret = 0;
 
-       dev_info(dev, "Resetting chip\n");
+       dev_info(dev, "Resetting device\n");
+
+       disable_irq(data->irq);
 
        reinit_completion(&data->reset_completion);
 
@@ -1170,6 +1107,11 @@ static int mxt_soft_reset(struct mxt_data *data)
        if (ret)
                return ret;
 
+       /* Ignore CHG line for 100ms after reset */
+       msleep(100);
+
+       enable_irq(data->irq);
+
        ret = mxt_wait_for_completion(data, &data->reset_completion,
                                      MXT_RESET_TIMEOUT);
        if (ret)
@@ -1543,7 +1485,7 @@ static int mxt_get_info(struct mxt_data *data)
        int error;
 
        /* Read 7-byte info block starting at address 0 */
-       error = __mxt_read_reg(client, MXT_INFO, sizeof(*info), info);
+       error = __mxt_read_reg(client, 0, sizeof(*info), info);
        if (error)
                return error;
 
@@ -1915,6 +1857,8 @@ static int mxt_initialize_input_device(struct mxt_data *data)
        if (pdata->t19_num_keys) {
                mxt_set_up_as_touchpad(input_dev, data);
                mt_flags |= INPUT_MT_POINTER;
+       } else {
+               mt_flags |= INPUT_MT_DIRECT;
        }
 
        /* For multi touch */
@@ -2473,19 +2417,18 @@ static void mxt_input_close(struct input_dev *dev)
 static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
 {
        struct mxt_platform_data *pdata;
+       struct device_node *np = client->dev.of_node;
        u32 *keymap;
-       u32 keycode;
-       int proplen, i, ret;
+       int proplen, ret;
 
-       if (!client->dev.of_node)
+       if (!np)
                return ERR_PTR(-ENOENT);
 
        pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
        if (!pdata)
                return ERR_PTR(-ENOMEM);
 
-       if (of_find_property(client->dev.of_node, "linux,gpio-keymap",
-                            &proplen)) {
+       if (of_find_property(np, "linux,gpio-keymap", &proplen)) {
                pdata->t19_num_keys = proplen / sizeof(u32);
 
                keymap = devm_kzalloc(&client->dev,
@@ -2494,14 +2437,11 @@ static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
                if (!keymap)
                        return ERR_PTR(-ENOMEM);
 
-               for (i = 0; i < pdata->t19_num_keys; i++) {
-                       ret = of_property_read_u32_index(client->dev.of_node,
-                                       "linux,gpio-keymap", i, &keycode);
-                       if (ret)
-                               keycode = KEY_RESERVED;
-
-                       keymap[i] = keycode;
-               }
+               ret = of_property_read_u32_array(np, "linux,gpio-keymap",
+                                                keymap, pdata->t19_num_keys);
+               if (ret)
+                       dev_warn(&client->dev,
+                                "Couldn't read linux,gpio-keymap: %d\n", ret);
 
                pdata->t19_keymap = keymap;
        }
@@ -2708,6 +2648,9 @@ static int __maybe_unused mxt_suspend(struct device *dev)
        struct mxt_data *data = i2c_get_clientdata(client);
        struct input_dev *input_dev = data->input_dev;
 
+       if (!input_dev)
+               return 0;
+
        mutex_lock(&input_dev->mutex);
 
        if (input_dev->users)
@@ -2724,6 +2667,9 @@ static int __maybe_unused mxt_resume(struct device *dev)
        struct mxt_data *data = i2c_get_clientdata(client);
        struct input_dev *input_dev = data->input_dev;
 
+       if (!input_dev)
+               return 0;
+
        mutex_lock(&input_dev->mutex);
 
        if (input_dev->users)