]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/input/touchscreen/atmel_mxt_ts.c
Merge branch 'for-linus' of git://android.git.kernel.org/kernel/tegra
[karo-tx-linux.git] / drivers / input / touchscreen / atmel_mxt_ts.c
index 162a3bf019e42f05a41378f57cde715fdb2cf259..4012436633b18ef0d087b95ca4f6792c6c8e290b 100644 (file)
 #define MXT_PROCG_NOISE                22
 #define MXT_PROCI_ONETOUCH     24
 #define MXT_PROCI_TWOTOUCH     27
-#define MXT_SPT_COMMSCONFIG    18      /* firmware ver 21 over */
+#define MXT_PROCI_GRIP         40
+#define MXT_PROCI_PALM         41
+#define MXT_SPT_COMMSCONFIG    18
 #define MXT_SPT_GPIOPWM                19
 #define MXT_SPT_SELFTEST       25
 #define MXT_SPT_CTECONFIG      28
-#define MXT_SPT_USERDATA       38      /* firmware ver 21 over */
+#define MXT_SPT_USERDATA       38
+#define MXT_SPT_DIGITIZER      43
+#define MXT_SPT_MESSAGECOUNT   44
 
 /* MXT_GEN_COMMAND field */
 #define MXT_COMMAND_RESET      0
 #define MXT_TOUCH_XEDGEDIST    27
 #define MXT_TOUCH_YEDGECTRL    28
 #define MXT_TOUCH_YEDGEDIST    29
-#define MXT_TOUCH_JUMPLIMIT    30      /* firmware ver 22 over */
+#define MXT_TOUCH_JUMPLIMIT    30
 
 /* MXT_PROCI_GRIPFACE field */
 #define MXT_GRIPFACE_CTRL      0
 #define MXT_CTE_MODE           2
 #define MXT_CTE_IDLEGCAFDEPTH  3
 #define MXT_CTE_ACTVGCAFDEPTH  4
-#define MXT_CTE_VOLTAGE                5       /* firmware ver 21 over */
+#define MXT_CTE_VOLTAGE                5
 
 #define MXT_VOLTAGE_DEFAULT    2700000
 #define MXT_VOLTAGE_STEP       10000
 
 #define MXT_MAX_FINGER         10
 
-/* Initial register values recommended from chip vendor */
-static const u8 init_vals_ver_20[] = {
-       /* MXT_GEN_COMMAND(6) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_GEN_POWER(7) */
-       0x20, 0xff, 0x32,
-       /* MXT_GEN_ACQUIRE(8) */
-       0x08, 0x05, 0x05, 0x00, 0x00, 0x00, 0x05, 0x14,
-       /* MXT_TOUCH_MULTI(9) */
-       0x00, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00,
-       0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x64,
-       /* MXT_TOUCH_KEYARRAY(15) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00,
-       /* MXT_SPT_GPIOPWM(19) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00,
-       /* MXT_PROCI_GRIPFACE(20) */
-       0x00, 0x64, 0x64, 0x64, 0x64, 0x00, 0x00, 0x1e, 0x14, 0x04,
-       0x1e, 0x00,
-       /* MXT_PROCG_NOISE(22) */
-       0x05, 0x00, 0x00, 0x19, 0x00, 0xe7, 0xff, 0x04, 0x32, 0x00,
-       0x01, 0x0a, 0x0f, 0x14, 0x00, 0x00, 0xe8,
-       /* MXT_TOUCH_PROXIMITY(23) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00,
-       /* MXT_PROCI_ONETOUCH(24) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_SPT_SELFTEST(25) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00,
-       /* MXT_PROCI_TWOTOUCH(27) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_SPT_CTECONFIG(28) */
-       0x00, 0x00, 0x00, 0x04, 0x08,
-};
-
-static const u8 init_vals_ver_21[] = {
-       /* MXT_GEN_COMMAND(6) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_GEN_POWER(7) */
-       0x20, 0xff, 0x32,
-       /* MXT_GEN_ACQUIRE(8) */
-       0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
-       /* MXT_TOUCH_MULTI(9) */
-       0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
-       0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_TOUCH_KEYARRAY(15) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00,
-       /* MXT_SPT_GPIOPWM(19) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_PROCI_GRIPFACE(20) */
-       0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
-       0x0f, 0x0a,
-       /* MXT_PROCG_NOISE(22) */
-       0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
-       0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
-       /* MXT_TOUCH_PROXIMITY(23) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00,
-       /* MXT_PROCI_ONETOUCH(24) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_SPT_SELFTEST(25) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00,
-       /* MXT_PROCI_TWOTOUCH(27) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_SPT_CTECONFIG(28) */
-       0x00, 0x00, 0x00, 0x08, 0x10, 0x00,
-};
-
-static const u8 init_vals_ver_22[] = {
-       /* MXT_GEN_COMMAND(6) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_GEN_POWER(7) */
-       0x20, 0xff, 0x32,
-       /* MXT_GEN_ACQUIRE(8) */
-       0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
-       /* MXT_TOUCH_MULTI(9) */
-       0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
-       0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00,
-       /* MXT_TOUCH_KEYARRAY(15) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00,
-       /* MXT_SPT_GPIOPWM(19) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_PROCI_GRIPFACE(20) */
-       0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
-       0x0f, 0x0a,
-       /* MXT_PROCG_NOISE(22) */
-       0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
-       0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
-       /* MXT_TOUCH_PROXIMITY(23) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_PROCI_ONETOUCH(24) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_SPT_SELFTEST(25) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00,
-       /* MXT_PROCI_TWOTOUCH(27) */
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       /* MXT_SPT_CTECONFIG(28) */
-       0x00, 0x00, 0x00, 0x08, 0x10, 0x00,
-};
-
 struct mxt_info {
        u8 family_id;
        u8 variant_id;
@@ -374,6 +262,8 @@ static bool mxt_object_readable(unsigned int type)
        case MXT_PROCG_NOISE:
        case MXT_PROCI_ONETOUCH:
        case MXT_PROCI_TWOTOUCH:
+       case MXT_PROCI_GRIP:
+       case MXT_PROCI_PALM:
        case MXT_SPT_COMMSCONFIG:
        case MXT_SPT_GPIOPWM:
        case MXT_SPT_SELFTEST:
@@ -398,6 +288,8 @@ static bool mxt_object_writable(unsigned int type)
        case MXT_PROCG_NOISE:
        case MXT_PROCI_ONETOUCH:
        case MXT_PROCI_TWOTOUCH:
+       case MXT_PROCI_GRIP:
+       case MXT_PROCI_PALM:
        case MXT_SPT_GPIOPWM:
        case MXT_SPT_SELFTEST:
        case MXT_SPT_CTECONFIG:
@@ -714,26 +606,15 @@ end:
 
 static int mxt_check_reg_init(struct mxt_data *data)
 {
+       const struct mxt_platform_data *pdata = data->pdata;
        struct mxt_object *object;
        struct device *dev = &data->client->dev;
        int index = 0;
-       int i, j;
-       u8 version = data->info.version;
-       u8 *init_vals;
+       int i, j, config_offset;
 
-       switch (version) {
-       case MXT_VER_20:
-               init_vals = (u8 *)init_vals_ver_20;
-               break;
-       case MXT_VER_21:
-               init_vals = (u8 *)init_vals_ver_21;
-               break;
-       case MXT_VER_22:
-               init_vals = (u8 *)init_vals_ver_22;
-               break;
-       default:
-               dev_err(dev, "Firmware version %d doesn't support\n", version);
-               return -EINVAL;
+       if (!pdata->config) {
+               dev_dbg(dev, "No cfg data defined, skipping reg init\n");
+               return 0;
        }
 
        for (i = 0; i < data->info.object_num; i++) {
@@ -742,84 +623,21 @@ static int mxt_check_reg_init(struct mxt_data *data)
                if (!mxt_object_writable(object->type))
                        continue;
 
-               for (j = 0; j < object->size + 1; j++)
+               for (j = 0; j < object->size + 1; j++) {
+                       config_offset = index + j;
+                       if (config_offset > pdata->config_length) {
+                               dev_err(dev, "Not enough config data!\n");
+                               return -EINVAL;
+                       }
                        mxt_write_object(data, object->type, j,
-                                       init_vals[index + j]);
-
+                                        pdata->config[config_offset]);
+               }
                index += object->size + 1;
        }
 
        return 0;
 }
 
-static int mxt_check_matrix_size(struct mxt_data *data)
-{
-       const struct mxt_platform_data *pdata = data->pdata;
-       struct device *dev = &data->client->dev;
-       int mode = -1;
-       int error;
-       u8 val;
-
-       dev_dbg(dev, "Number of X lines: %d\n", pdata->x_line);
-       dev_dbg(dev, "Number of Y lines: %d\n", pdata->y_line);
-
-       switch (pdata->x_line) {
-       case 0 ... 15:
-               if (pdata->y_line <= 14)
-                       mode = 0;
-               break;
-       case 16:
-               if (pdata->y_line <= 12)
-                       mode = 1;
-               if (pdata->y_line == 13 || pdata->y_line == 14)
-                       mode = 0;
-               break;
-       case 17:
-               if (pdata->y_line <= 11)
-                       mode = 2;
-               if (pdata->y_line == 12 || pdata->y_line == 13)
-                       mode = 1;
-               break;
-       case 18:
-               if (pdata->y_line <= 10)
-                       mode = 3;
-               if (pdata->y_line == 11 || pdata->y_line == 12)
-                       mode = 2;
-               break;
-       case 19:
-               if (pdata->y_line <= 9)
-                       mode = 4;
-               if (pdata->y_line == 10 || pdata->y_line == 11)
-                       mode = 3;
-               break;
-       case 20:
-               mode = 4;
-       }
-
-       if (mode < 0) {
-               dev_err(dev, "Invalid X/Y lines\n");
-               return -EINVAL;
-       }
-
-       error = mxt_read_object(data, MXT_SPT_CTECONFIG,
-                               MXT_CTE_MODE, &val);
-       if (error)
-               return error;
-
-       if (mode == val)
-               return 0;
-
-       /* Change the CTE configuration */
-       mxt_write_object(data, MXT_SPT_CTECONFIG,
-                       MXT_CTE_CTRL, 1);
-       mxt_write_object(data, MXT_SPT_CTECONFIG,
-                       MXT_CTE_MODE, mode);
-       mxt_write_object(data, MXT_SPT_CTECONFIG,
-                       MXT_CTE_CTRL, 0);
-
-       return 0;
-}
-
 static int mxt_make_highchg(struct mxt_data *data)
 {
        struct device *dev = &data->client->dev;
@@ -876,7 +694,7 @@ static void mxt_handle_pdata(struct mxt_data *data)
                        MXT_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8);
 
        /* Set touchscreen voltage */
-       if (data->info.version >= MXT_VER_21 && pdata->voltage) {
+       if (pdata->voltage) {
                if (pdata->voltage < MXT_VOLTAGE_DEFAULT) {
                        voltage = (MXT_VOLTAGE_DEFAULT - pdata->voltage) /
                                MXT_VOLTAGE_STEP;
@@ -986,11 +804,6 @@ static int mxt_initialize(struct mxt_data *data)
        if (error)
                return error;
 
-       /* Check X/Y matrix size */
-       error = mxt_check_matrix_size(data);
-       if (error)
-               return error;
-
        error = mxt_make_highchg(data);
        if (error)
                return error;
@@ -1146,19 +959,8 @@ static ssize_t mxt_update_fw_store(struct device *dev,
                                        const char *buf, size_t count)
 {
        struct mxt_data *data = dev_get_drvdata(dev);
-       unsigned int version;
        int error;
 
-       if (sscanf(buf, "%u", &version) != 1) {
-               dev_err(dev, "Invalid values\n");
-               return -EINVAL;
-       }
-
-       if (data->info.version < MXT_VER_21 || version < MXT_VER_21) {
-               dev_err(dev, "FW update supported starting with version 21\n");
-               return -EINVAL;
-       }
-
        disable_irq(data->irq);
 
        error = mxt_load_fw(dev, MXT_FW_NAME);
@@ -1228,11 +1030,12 @@ static void mxt_input_close(struct input_dev *dev)
 static int __devinit mxt_probe(struct i2c_client *client,
                const struct i2c_device_id *id)
 {
+       const struct mxt_platform_data *pdata = client->dev.platform_data;
        struct mxt_data *data;
        struct input_dev *input_dev;
        int error;
 
-       if (!client->dev.platform_data)
+       if (!pdata)
                return -EINVAL;
 
        data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
@@ -1271,7 +1074,7 @@ static int __devinit mxt_probe(struct i2c_client *client,
 
        data->client = client;
        data->input_dev = input_dev;
-       data->pdata = client->dev.platform_data;
+       data->pdata = pdata;
        data->irq = client->irq;
 
        i2c_set_clientdata(client, data);
@@ -1281,7 +1084,7 @@ static int __devinit mxt_probe(struct i2c_client *client,
                goto err_free_object;
 
        error = request_threaded_irq(client->irq, NULL, mxt_interrupt,
-                       IRQF_TRIGGER_FALLING, client->dev.driver->name, data);
+                       pdata->irqflags, client->dev.driver->name, data);
        if (error) {
                dev_err(&client->dev, "Failed to register interrupt\n");
                goto err_free_object;
@@ -1371,6 +1174,7 @@ static const struct dev_pm_ops mxt_pm_ops = {
 static const struct i2c_device_id mxt_id[] = {
        { "qt602240_ts", 0 },
        { "atmel_mxt_ts", 0 },
+       { "mXT224", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, mxt_id);