^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <linux/virtio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/virtio_config.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/input/mt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <uapi/linux/virtio_ids.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <uapi/linux/virtio_input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct virtio_input {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) struct virtio_device *vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) struct input_dev *idev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) char name[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) char serial[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) char phys[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct virtqueue *evt, *sts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct virtio_input_event evts[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) bool ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static void virtinput_queue_evtbuf(struct virtio_input *vi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct virtio_input_event *evtbuf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct scatterlist sg[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) sg_init_one(sg, evtbuf, sizeof(*evtbuf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) virtqueue_add_inbuf(vi->evt, sg, 1, evtbuf, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static void virtinput_recv_events(struct virtqueue *vq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct virtio_input *vi = vq->vdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct virtio_input_event *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) unsigned int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if (vi->ready) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) while ((event = virtqueue_get_buf(vi->evt, &len)) != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) input_event(vi->idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) le16_to_cpu(event->type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) le16_to_cpu(event->code),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) le32_to_cpu(event->value));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) virtinput_queue_evtbuf(vi, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) virtqueue_kick(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * On error we are losing the status update, which isn't critical as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * this is typically used for stuff like keyboard leds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static int virtinput_send_status(struct virtio_input *vi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) u16 type, u16 code, s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct virtio_input_event *stsbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct scatterlist sg[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) stsbuf = kzalloc(sizeof(*stsbuf), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (!stsbuf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) stsbuf->type = cpu_to_le16(type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) stsbuf->code = cpu_to_le16(code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) stsbuf->value = cpu_to_le32(value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) sg_init_one(sg, stsbuf, sizeof(*stsbuf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (vi->ready) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) rc = virtqueue_add_outbuf(vi->sts, sg, 1, stsbuf, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) virtqueue_kick(vi->sts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) rc = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (rc != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) kfree(stsbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static void virtinput_recv_status(struct virtqueue *vq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct virtio_input *vi = vq->vdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct virtio_input_event *stsbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) unsigned int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) while ((stsbuf = virtqueue_get_buf(vi->sts, &len)) != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) kfree(stsbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static int virtinput_status(struct input_dev *idev, unsigned int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) unsigned int code, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct virtio_input *vi = input_get_drvdata(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) return virtinput_send_status(vi, type, code, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) static u8 virtinput_cfg_select(struct virtio_input *vi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) u8 select, u8 subsel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u8 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) virtio_cwrite_le(vi->vdev, struct virtio_input_config, select, &select);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) virtio_cwrite_le(vi->vdev, struct virtio_input_config, subsel, &subsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) virtio_cread_le(vi->vdev, struct virtio_input_config, size, &size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) return size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static void virtinput_cfg_bits(struct virtio_input *vi, int select, int subsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) unsigned long *bits, unsigned int bitcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) unsigned int bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u8 *virtio_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) u8 bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) bytes = virtinput_cfg_select(vi, select, subsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (!bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (bitcount > bytes * 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) bitcount = bytes * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * Bitmap in virtio config space is a simple stream of bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * with the first byte carrying bits 0-7, second bits 8-15 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * so on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) virtio_bits = kzalloc(bytes, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) if (!virtio_bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) u.bitmap),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) virtio_bits, bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) for (bit = 0; bit < bitcount; bit++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if (virtio_bits[bit / 8] & (1 << (bit % 8)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) __set_bit(bit, bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) kfree(virtio_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) if (select == VIRTIO_INPUT_CFG_EV_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) __set_bit(subsel, vi->idev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) u32 mi, ma, re, fu, fl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ABS_INFO, abs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.min, &mi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.max, &ma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.res, &re);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.fuzz, &fu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.flat, &fl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) input_set_abs_params(vi->idev, abs, mi, ma, fu, fl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) input_abs_set_res(vi->idev, abs, re);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (abs == ABS_MT_TRACKING_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) unsigned int slot_flags =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) test_bit(INPUT_PROP_DIRECT, vi->idev->propbit) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) INPUT_MT_DIRECT : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) input_mt_init_slots(vi->idev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ma, /* input max finger */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) slot_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static int virtinput_init_vqs(struct virtio_input *vi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct virtqueue *vqs[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) vq_callback_t *cbs[] = { virtinput_recv_events,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) virtinput_recv_status };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) static const char * const names[] = { "events", "status" };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) vi->evt = vqs[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) vi->sts = vqs[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) static void virtinput_fill_evt(struct virtio_input *vi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int i, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) size = virtqueue_get_vring_size(vi->evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (size > ARRAY_SIZE(vi->evts))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) size = ARRAY_SIZE(vi->evts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) for (i = 0; i < size; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) virtinput_queue_evtbuf(vi, &vi->evts[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) virtqueue_kick(vi->evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static int virtinput_probe(struct virtio_device *vdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct virtio_input *vi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) int abs, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) vi = kzalloc(sizeof(*vi), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if (!vi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) vdev->priv = vi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) vi->vdev = vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) spin_lock_init(&vi->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) err = virtinput_init_vqs(vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) goto err_init_vq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) vi->idev = input_allocate_device();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (!vi->idev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) goto err_input_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) input_set_drvdata(vi->idev, vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ID_NAME, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) u.string),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) vi->name, min(size, sizeof(vi->name)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ID_SERIAL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) u.string),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) vi->serial, min(size, sizeof(vi->serial)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) snprintf(vi->phys, sizeof(vi->phys),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) "virtio%d/input0", vdev->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) vi->idev->name = vi->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) vi->idev->phys = vi->phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) vi->idev->uniq = vi->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ID_DEVIDS, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (size >= sizeof(struct virtio_input_devids)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) virtio_cread_le(vi->vdev, struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) u.ids.bustype, &vi->idev->id.bustype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) virtio_cread_le(vi->vdev, struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) u.ids.vendor, &vi->idev->id.vendor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) virtio_cread_le(vi->vdev, struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) u.ids.product, &vi->idev->id.product);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) virtio_cread_le(vi->vdev, struct virtio_input_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) u.ids.version, &vi->idev->id.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) vi->idev->id.bustype = BUS_VIRTUAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_PROP_BITS, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) vi->idev->propbit, INPUT_PROP_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_REP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) __set_bit(EV_REP, vi->idev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) vi->idev->dev.parent = &vdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) vi->idev->event = virtinput_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* device -> kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) vi->idev->keybit, KEY_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_REL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) vi->idev->relbit, REL_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_ABS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) vi->idev->absbit, ABS_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_MSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) vi->idev->mscbit, MSC_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_SW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) vi->idev->swbit, SW_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /* kernel -> device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_LED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) vi->idev->ledbit, LED_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_SND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) vi->idev->sndbit, SND_CNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) if (test_bit(EV_ABS, vi->idev->evbit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) for (abs = 0; abs < ABS_CNT; abs++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (!test_bit(abs, vi->idev->absbit))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) virtinput_cfg_abs(vi, abs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) virtio_device_ready(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) vi->ready = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) err = input_register_device(vi->idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) goto err_input_register;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) virtinput_fill_evt(vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) err_input_register:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) vi->ready = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) input_free_device(vi->idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) err_input_alloc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) vdev->config->del_vqs(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) err_init_vq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) kfree(vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) static void virtinput_remove(struct virtio_device *vdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) struct virtio_input *vi = vdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) vi->ready = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) input_unregister_device(vi->idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) vdev->config->reset(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) while ((buf = virtqueue_detach_unused_buf(vi->sts)) != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) vdev->config->del_vqs(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) kfree(vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #ifdef CONFIG_PM_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) static int virtinput_freeze(struct virtio_device *vdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) struct virtio_input *vi = vdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) spin_lock_irqsave(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) vi->ready = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) spin_unlock_irqrestore(&vi->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) vdev->config->del_vqs(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) static int virtinput_restore(struct virtio_device *vdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) struct virtio_input *vi = vdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) err = virtinput_init_vqs(vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) virtio_device_ready(vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) vi->ready = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) virtinput_fill_evt(vi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) static unsigned int features[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) static const struct virtio_device_id id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) { VIRTIO_ID_INPUT, VIRTIO_DEV_ANY_ID },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) { 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) static struct virtio_driver virtio_input_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) .driver.name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .driver.owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) .feature_table = features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) .feature_table_size = ARRAY_SIZE(features),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) .id_table = id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) .probe = virtinput_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) .remove = virtinput_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #ifdef CONFIG_PM_SLEEP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .freeze = virtinput_freeze,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) .restore = virtinput_restore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) module_virtio_driver(virtio_input_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) MODULE_DEVICE_TABLE(virtio, id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) MODULE_DESCRIPTION("Virtio input device driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>");