Lines Matching +full:abs +full:- +full:fuzz
1 // SPDX-License-Identifier: GPL-2.0-only
30 virtqueue_add_inbuf(vi->evt, sg, 1, evtbuf, GFP_ATOMIC); in virtinput_queue_evtbuf()
35 struct virtio_input *vi = vq->vdev->priv; in virtinput_recv_events()
40 spin_lock_irqsave(&vi->lock, flags); in virtinput_recv_events()
41 if (vi->ready) { in virtinput_recv_events()
42 while ((event = virtqueue_get_buf(vi->evt, &len)) != NULL) { in virtinput_recv_events()
43 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_recv_events()
44 input_event(vi->idev, in virtinput_recv_events()
45 le16_to_cpu(event->type), in virtinput_recv_events()
46 le16_to_cpu(event->code), in virtinput_recv_events()
47 le32_to_cpu(event->value)); in virtinput_recv_events()
48 spin_lock_irqsave(&vi->lock, flags); in virtinput_recv_events()
53 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_recv_events()
70 return -ENOMEM; in virtinput_send_status()
72 stsbuf->type = cpu_to_le16(type); in virtinput_send_status()
73 stsbuf->code = cpu_to_le16(code); in virtinput_send_status()
74 stsbuf->value = cpu_to_le32(value); in virtinput_send_status()
77 spin_lock_irqsave(&vi->lock, flags); in virtinput_send_status()
78 if (vi->ready) { in virtinput_send_status()
79 rc = virtqueue_add_outbuf(vi->sts, sg, 1, stsbuf, GFP_ATOMIC); in virtinput_send_status()
80 virtqueue_kick(vi->sts); in virtinput_send_status()
82 rc = -ENODEV; in virtinput_send_status()
84 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_send_status()
93 struct virtio_input *vi = vq->vdev->priv; in virtinput_recv_status()
98 spin_lock_irqsave(&vi->lock, flags); in virtinput_recv_status()
99 while ((stsbuf = virtqueue_get_buf(vi->sts, &len)) != NULL) in virtinput_recv_status()
101 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_recv_status()
117 virtio_cwrite_le(vi->vdev, struct virtio_input_config, select, &select); in virtinput_cfg_select()
118 virtio_cwrite_le(vi->vdev, struct virtio_input_config, subsel, &subsel); in virtinput_cfg_select()
119 virtio_cread_le(vi->vdev, struct virtio_input_config, size, &size); in virtinput_cfg_select()
138 * with the first byte carrying bits 0-7, second bits 8-15 and in virtinput_cfg_bits()
144 virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config, in virtinput_cfg_bits()
154 __set_bit(subsel, vi->idev->evbit); in virtinput_cfg_bits()
157 static void virtinput_cfg_abs(struct virtio_input *vi, int abs) in virtinput_cfg_abs() argument
161 virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ABS_INFO, abs); in virtinput_cfg_abs()
162 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.min, &mi); in virtinput_cfg_abs()
163 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.max, &ma); in virtinput_cfg_abs()
164 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.res, &re); in virtinput_cfg_abs()
165 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.fuzz, &fu); in virtinput_cfg_abs()
166 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.flat, &fl); in virtinput_cfg_abs()
167 input_set_abs_params(vi->idev, abs, mi, ma, fu, fl); in virtinput_cfg_abs()
168 input_abs_set_res(vi->idev, abs, re); in virtinput_cfg_abs()
169 if (abs == ABS_MT_TRACKING_ID) { in virtinput_cfg_abs()
171 test_bit(INPUT_PROP_DIRECT, vi->idev->propbit) ? in virtinput_cfg_abs()
174 input_mt_init_slots(vi->idev, in virtinput_cfg_abs()
188 err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL); in virtinput_init_vqs()
191 vi->evt = vqs[0]; in virtinput_init_vqs()
192 vi->sts = vqs[1]; in virtinput_init_vqs()
202 spin_lock_irqsave(&vi->lock, flags); in virtinput_fill_evt()
203 size = virtqueue_get_vring_size(vi->evt); in virtinput_fill_evt()
204 if (size > ARRAY_SIZE(vi->evts)) in virtinput_fill_evt()
205 size = ARRAY_SIZE(vi->evts); in virtinput_fill_evt()
207 virtinput_queue_evtbuf(vi, &vi->evts[i]); in virtinput_fill_evt()
208 virtqueue_kick(vi->evt); in virtinput_fill_evt()
209 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_fill_evt()
217 int abs, err; in virtinput_probe() local
220 return -ENODEV; in virtinput_probe()
224 return -ENOMEM; in virtinput_probe()
226 vdev->priv = vi; in virtinput_probe()
227 vi->vdev = vdev; in virtinput_probe()
228 spin_lock_init(&vi->lock); in virtinput_probe()
234 vi->idev = input_allocate_device(); in virtinput_probe()
235 if (!vi->idev) { in virtinput_probe()
236 err = -ENOMEM; in virtinput_probe()
239 input_set_drvdata(vi->idev, vi); in virtinput_probe()
242 virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config, in virtinput_probe()
244 vi->name, min(size, sizeof(vi->name))); in virtinput_probe()
246 virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config, in virtinput_probe()
248 vi->serial, min(size, sizeof(vi->serial))); in virtinput_probe()
249 snprintf(vi->phys, sizeof(vi->phys), in virtinput_probe()
250 "virtio%d/input0", vdev->index); in virtinput_probe()
251 vi->idev->name = vi->name; in virtinput_probe()
252 vi->idev->phys = vi->phys; in virtinput_probe()
253 vi->idev->uniq = vi->serial; in virtinput_probe()
257 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
258 u.ids.bustype, &vi->idev->id.bustype); in virtinput_probe()
259 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
260 u.ids.vendor, &vi->idev->id.vendor); in virtinput_probe()
261 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
262 u.ids.product, &vi->idev->id.product); in virtinput_probe()
263 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
264 u.ids.version, &vi->idev->id.version); in virtinput_probe()
266 vi->idev->id.bustype = BUS_VIRTUAL; in virtinput_probe()
270 vi->idev->propbit, INPUT_PROP_CNT); in virtinput_probe()
273 __set_bit(EV_REP, vi->idev->evbit); in virtinput_probe()
275 vi->idev->dev.parent = &vdev->dev; in virtinput_probe()
276 vi->idev->event = virtinput_status; in virtinput_probe()
278 /* device -> kernel */ in virtinput_probe()
280 vi->idev->keybit, KEY_CNT); in virtinput_probe()
282 vi->idev->relbit, REL_CNT); in virtinput_probe()
284 vi->idev->absbit, ABS_CNT); in virtinput_probe()
286 vi->idev->mscbit, MSC_CNT); in virtinput_probe()
288 vi->idev->swbit, SW_CNT); in virtinput_probe()
290 /* kernel -> device */ in virtinput_probe()
292 vi->idev->ledbit, LED_CNT); in virtinput_probe()
294 vi->idev->sndbit, SND_CNT); in virtinput_probe()
296 if (test_bit(EV_ABS, vi->idev->evbit)) { in virtinput_probe()
297 for (abs = 0; abs < ABS_CNT; abs++) { in virtinput_probe()
298 if (!test_bit(abs, vi->idev->absbit)) in virtinput_probe()
300 virtinput_cfg_abs(vi, abs); in virtinput_probe()
305 vi->ready = true; in virtinput_probe()
306 err = input_register_device(vi->idev); in virtinput_probe()
314 spin_lock_irqsave(&vi->lock, flags); in virtinput_probe()
315 vi->ready = false; in virtinput_probe()
316 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_probe()
317 input_free_device(vi->idev); in virtinput_probe()
319 vdev->config->del_vqs(vdev); in virtinput_probe()
327 struct virtio_input *vi = vdev->priv; in virtinput_remove()
331 spin_lock_irqsave(&vi->lock, flags); in virtinput_remove()
332 vi->ready = false; in virtinput_remove()
333 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_remove()
335 input_unregister_device(vi->idev); in virtinput_remove()
336 vdev->config->reset(vdev); in virtinput_remove()
337 while ((buf = virtqueue_detach_unused_buf(vi->sts)) != NULL) in virtinput_remove()
339 vdev->config->del_vqs(vdev); in virtinput_remove()
346 struct virtio_input *vi = vdev->priv; in virtinput_freeze()
349 spin_lock_irqsave(&vi->lock, flags); in virtinput_freeze()
350 vi->ready = false; in virtinput_freeze()
351 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_freeze()
353 vdev->config->del_vqs(vdev); in virtinput_freeze()
359 struct virtio_input *vi = vdev->priv; in virtinput_restore()
367 vi->ready = true; in virtinput_restore()