Input: mms114 - support MMS136
authorLinus Walleij <linus.walleij@linaro.org>
Sat, 10 Apr 2021 06:04:35 +0000 (23:04 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 10 Apr 2021 06:23:01 +0000 (23:23 -0700)
The Melfas MMS136 is similar to the other MMS variants but
has event packages of 6 bytes rather than 8 as the others.

The define is named FINGER_EVENT_SZ in the vendor drivers
so I renamed it from MMS*_PACKET_SZ to MMS*_EVENT_SZ.

After this patch, the touchscreen on the Samsung GT-I8530
works fine with PostmarketOS.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20210404232619.3092682-1-linus.walleij@linaro.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/mms114.c

index 7043f57..0efd1a1 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
-// Melfas MMS114/MMS152 touchscreen device driver
+// Melfas MMS114/MMS136/MMS152 touchscreen device driver
 //
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 // Author: Joonyoung Shim <jy0922.shim@samsung.com>
@@ -44,7 +44,8 @@
 #define MMS114_MAX_AREA                        0xff
 
 #define MMS114_MAX_TOUCH               10
-#define MMS114_PACKET_NUM              8
+#define MMS114_EVENT_SIZE              8
+#define MMS136_EVENT_SIZE              6
 
 /* Touch type */
 #define MMS114_TYPE_NONE               0
@@ -53,6 +54,7 @@
 
 enum mms_type {
        TYPE_MMS114     = 114,
+       TYPE_MMS136     = 136,
        TYPE_MMS152     = 152,
        TYPE_MMS345L    = 345,
 };
@@ -209,7 +211,11 @@ static irqreturn_t mms114_interrupt(int irq, void *dev_id)
        if (packet_size <= 0)
                goto out;
 
-       touch_size = packet_size / MMS114_PACKET_NUM;
+       /* MMS136 has slightly different event size */
+       if (data->type == TYPE_MMS136)
+               touch_size = packet_size / MMS136_EVENT_SIZE;
+       else
+               touch_size = packet_size / MMS114_EVENT_SIZE;
 
        error = __mms114_read_reg(data, MMS114_INFORMATION, packet_size,
                        (u8 *)touch);
@@ -275,6 +281,7 @@ static int mms114_get_version(struct mms114_data *data)
                break;
 
        case TYPE_MMS114:
+       case TYPE_MMS136:
                error = __mms114_read_reg(data, MMS114_TSP_REV, 6, buf);
                if (error)
                        return error;
@@ -297,8 +304,8 @@ static int mms114_setup_regs(struct mms114_data *data)
        if (error < 0)
                return error;
 
-       /* Only MMS114 has configuration and power on registers */
-       if (data->type != TYPE_MMS114)
+       /* Only MMS114 and MMS136 have configuration and power on registers */
+       if (data->type != TYPE_MMS114 && data->type != TYPE_MMS136)
                return 0;
 
        error = mms114_set_active(data, true);
@@ -480,7 +487,7 @@ static int mms114_probe(struct i2c_client *client,
                                     0, data->props.max_y, 0, 0);
        }
 
-       if (data->type == TYPE_MMS114) {
+       if (data->type == TYPE_MMS114 || data->type == TYPE_MMS136) {
                /*
                 * The firmware handles movement and pressure fuzz, so
                 * don't duplicate that in software.
@@ -604,6 +611,9 @@ static const struct of_device_id mms114_dt_match[] = {
        {
                .compatible = "melfas,mms114",
                .data = (void *)TYPE_MMS114,
+       }, {
+               .compatible = "melfas,mms136",
+               .data = (void *)TYPE_MMS136,
        }, {
                .compatible = "melfas,mms152",
                .data = (void *)TYPE_MMS152,