Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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>");