Input: imagis - add supports for Imagis IST3038
authorRaymond Hackley <raymondhackley@protonmail.com>
Thu, 13 Jun 2024 02:57:11 +0000 (02:57 +0000)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 8 Jul 2024 23:22:48 +0000 (16:22 -0700)
Imagis IST3038 is another variant of Imagis IST3038 IC, which has
a different register interface from IST3038C (possibly firmware defined).

Unlike IST3038C/IST3032C, IST3038 has different registers for commands,
which means IST3038 doesn't use protocol B.
Similar to IST3032C and maybe the other variants, IST3038 has touch keys
support, which provides KEY_APPSELECT and KEY_BACK.

Add support for IST3038 with touch keys.

Signed-off-by: Raymond Hackley <raymondhackley@protonmail.com>
Link: https://lore.kernel.org/r/20240613025631.5425-4-raymondhackley@protonmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/imagis.c

index 886bcfc..aeabf8d 100644 (file)
 #include <linux/property.h>
 #include <linux/regulator/consumer.h>
 
+#define IST30XX_REG_STATUS             0x20
+#define IST30XX_REG_CHIPID             (0x40000000 | IST3038C_DIRECT_ACCESS)
+
+#define IST30XX_WHOAMI                 0x30003000
+#define IST30XXA_WHOAMI                        0x300a300a
+#define IST30XXB_WHOAMI                        0x300b300b
+#define IST3038_WHOAMI                 0x30383038
+
 #define IST3032C_WHOAMI                        0x32c
+#define IST3038C_WHOAMI                        0x38c
 
-#define IST3038B_REG_STATUS            0x20
 #define IST3038B_REG_CHIPID            0x30
 #define IST3038B_WHOAMI                        0x30380b
 
@@ -25,7 +33,6 @@
 #define IST3038C_REG_TOUCH_STATUS      (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS)
 #define IST3038C_REG_TOUCH_COORD       (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x8)
 #define IST3038C_REG_INTR_MESSAGE      (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x4)
-#define IST3038C_WHOAMI                        0x38c
 #define IST3038C_CHIP_ON_DELAY_MS      60
 #define IST3038C_I2C_RETRY_COUNT       3
 #define IST3038C_MAX_FINGER_NUM                10
@@ -397,9 +404,17 @@ static const struct imagis_properties imagis_3032c_data = {
        .protocol_b = true,
 };
 
+static const struct imagis_properties imagis_3038_data = {
+       .interrupt_msg_cmd = IST30XX_REG_STATUS,
+       .touch_coord_cmd = IST30XX_REG_STATUS,
+       .whoami_cmd = IST30XX_REG_CHIPID,
+       .whoami_val = IST3038_WHOAMI,
+       .touch_keys_supported = true,
+};
+
 static const struct imagis_properties imagis_3038b_data = {
-       .interrupt_msg_cmd = IST3038B_REG_STATUS,
-       .touch_coord_cmd = IST3038B_REG_STATUS,
+       .interrupt_msg_cmd = IST30XX_REG_STATUS,
+       .touch_coord_cmd = IST30XX_REG_STATUS,
        .whoami_cmd = IST3038B_REG_CHIPID,
        .whoami_val = IST3038B_WHOAMI,
 };
@@ -415,6 +430,7 @@ static const struct imagis_properties imagis_3038c_data = {
 #ifdef CONFIG_OF
 static const struct of_device_id imagis_of_match[] = {
        { .compatible = "imagis,ist3032c", .data = &imagis_3032c_data },
+       { .compatible = "imagis,ist3038", .data = &imagis_3038_data },
        { .compatible = "imagis,ist3038b", .data = &imagis_3038b_data },
        { .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
        { },