Enable usrmerge
[AGL/meta-agl.git] / meta-agl-bsp / virtualization-layer / recipes-kernel / linux / linux-yocto / virtio-kmeta / bsp / virtio / virtio-input-add-multi-touch-support.patch
1 From 16c10bede8b3d8594279752bf53153491f3f944f Mon Sep 17 00:00:00 2001
2 From: Mathias Crombez <mathias.crombez@faurecia.com>
3 Date: Fri, 15 Jan 2021 02:26:23 +0200
4 Subject: [PATCH] virtio-input: add multi-touch support
5
6 Without multi-touch slots allocated, ABS_MT_SLOT events will be lost by
7 input_handle_abs_event.
8
9 Implementation is based on uinput_create_device.
10
11 Signed-off-by: Mathias Crombez <mathias.crombez@faurecia.com>
12 Co-developed-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com>
13 Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com>
14 Link: https://lore.kernel.org/r/20210115002623.8576-1-vasyl.vavrychuk@opensynergy.com
15 Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
16 Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
17 ---
18  drivers/virtio/virtio_input.c | 11 ++++++++++-
19  1 file changed, 10 insertions(+), 1 deletion(-)
20
21 diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
22 index 244965c20d9b..ce51ae165943 100644
23 --- a/drivers/virtio/virtio_input.c
24 +++ b/drivers/virtio/virtio_input.c
25 @@ -7,6 +7,7 @@
26  
27  #include <uapi/linux/virtio_ids.h>
28  #include <uapi/linux/virtio_input.h>
29 +#include <linux/input/mt.h>
30  
31  struct virtio_input {
32         struct virtio_device       *vdev;
33 @@ -219,7 +220,7 @@ static int virtinput_probe(struct virtio_device *vdev)
34         struct virtio_input *vi;
35         unsigned long flags;
36         size_t size;
37 -       int abs, err;
38 +       int abs, err, nslots;
39  
40         if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
41                 return -ENODEV;
42 @@ -304,6 +305,13 @@ static int virtinput_probe(struct virtio_device *vdev)
43                                 continue;
44                         virtinput_cfg_abs(vi, abs);
45                 }
46 +
47 +               if (test_bit(ABS_MT_SLOT, vi->idev->absbit)) {
48 +                       nslots = input_abs_get_max(vi->idev, ABS_MT_SLOT) + 1;
49 +                       err = input_mt_init_slots(vi->idev, nslots, 0);
50 +                       if (err)
51 +                               goto err_mt_init_slots;
52 +               }
53         }
54  
55         virtio_device_ready(vdev);
56 @@ -319,6 +327,7 @@ static int virtinput_probe(struct virtio_device *vdev)
57         spin_lock_irqsave(&vi->lock, flags);
58         vi->ready = false;
59         spin_unlock_irqrestore(&vi->lock, flags);
60 +err_mt_init_slots:
61         input_free_device(vi->idev);
62  err_input_alloc:
63         vdev->config->del_vqs(vdev);
64 -- 
65 2.31.1
66