]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Input: st1232 - add touch-overlay handling
authorJavier Carrasco <javier.carrasco@wolfvision.net>
Wed, 16 Oct 2024 04:02:43 +0000 (06:02 +0200)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 27 Jul 2025 08:41:21 +0000 (01:41 -0700)
Use touch-overlay to support overlay objects such as buttons and a
resized frame defined in the device tree.

A key event will be generated if the coordinates of a touch event are
within the area defined by the button properties.

Reviewed-by: Jeff LaBundy <jeff@labundy.com>
Signed-off-by: Javier Carrasco <javier.carrasco@wolfvision.net>
Link: https://lore.kernel.org/r/20241016-feature-ts_virtobj_patch-v11-4-b292a1bbb0a1@wolfvision.net
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/st1232.c

index 6475084aee1bb7d1f9f7901d94bd48b53f5ddfc8..9b3901eec0a5ea29152ed1546b8199d787f3ec87 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/pm_qos.h>
 #include <linux/slab.h>
 #include <linux/types.h>
+#include <linux/input/touch-overlay.h>
 
 #define ST1232_TS_NAME "st1232-ts"
 #define ST1633_TS_NAME "st1633-ts"
@@ -57,6 +58,7 @@ struct st1232_ts_data {
        struct dev_pm_qos_request low_latency_req;
        struct gpio_desc *reset_gpio;
        const struct st_chip_info *chip_info;
+       struct list_head touch_overlay_list;
        int read_buf_len;
        u8 *read_buf;
 };
@@ -156,6 +158,10 @@ static int st1232_ts_parse_and_report(struct st1232_ts_data *ts)
 
        input_mt_assign_slots(input, slots, pos, n_contacts, 0);
        for (i = 0; i < n_contacts; i++) {
+               if (touch_overlay_process_contact(&ts->touch_overlay_list,
+                                                 input, &pos[i], slots[i]))
+                       continue;
+
                input_mt_slot(input, slots[i]);
                input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
                input_report_abs(input, ABS_MT_POSITION_X, pos[i].x);
@@ -164,6 +170,7 @@ static int st1232_ts_parse_and_report(struct st1232_ts_data *ts)
                        input_report_abs(input, ABS_MT_TOUCH_MAJOR, z[i]);
        }
 
+       touch_overlay_sync_frame(&ts->touch_overlay_list, input);
        input_mt_sync_frame(input);
        input_sync(input);
 
@@ -292,18 +299,30 @@ static int st1232_ts_probe(struct i2c_client *client)
        if (error)
                return error;
 
-       /* Read resolution from the chip */
-       error = st1232_ts_read_resolution(ts, &max_x, &max_y);
-       if (error) {
-               dev_err(&client->dev,
-                       "Failed to read resolution: %d\n", error);
-               return error;
-       }
-
        if (ts->chip_info->have_z)
                input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0,
                                     ts->chip_info->max_area, 0, 0);
 
+       /* map overlay objects if defined in the device tree */
+       INIT_LIST_HEAD(&ts->touch_overlay_list);
+       error = touch_overlay_map(&ts->touch_overlay_list, input_dev);
+       if (error)
+               return error;
+
+       if (touch_overlay_mapped_touchscreen(&ts->touch_overlay_list)) {
+               /* Read resolution from the overlay touchscreen if defined */
+               touch_overlay_get_touchscreen_abs(&ts->touch_overlay_list,
+                                                 &max_x, &max_y);
+       } else {
+               /* Read resolution from the chip */
+               error = st1232_ts_read_resolution(ts, &max_x, &max_y);
+               if (error) {
+                       dev_err(&client->dev,
+                               "Failed to read resolution: %d\n", error);
+                       return error;
+               }
+       }
+
        input_set_abs_params(input_dev, ABS_MT_POSITION_X,
                             0, max_x, 0, 0);
        input_set_abs_params(input_dev, ABS_MT_POSITION_Y,