Lines Matching full:vi

24 static void virtinput_queue_evtbuf(struct virtio_input *vi,  in virtinput_queue_evtbuf()  argument
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() local
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()
48 spin_lock_irqsave(&vi->lock, flags); in virtinput_recv_events()
49 virtinput_queue_evtbuf(vi, event); in virtinput_recv_events()
53 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_recv_events()
60 static int virtinput_send_status(struct virtio_input *vi, in virtinput_send_status() argument
80 if (vi->idev->mt && type == EV_MSC && code == MSC_TIMESTAMP) in virtinput_send_status()
92 spin_lock_irqsave(&vi->lock, flags); in virtinput_send_status()
93 if (vi->ready) { in virtinput_send_status()
94 rc = virtqueue_add_outbuf(vi->sts, sg, 1, stsbuf, GFP_ATOMIC); in virtinput_send_status()
95 virtqueue_kick(vi->sts); in virtinput_send_status()
99 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_send_status()
108 struct virtio_input *vi = vq->vdev->priv; in virtinput_recv_status() local
113 spin_lock_irqsave(&vi->lock, flags); in virtinput_recv_status()
114 while ((stsbuf = virtqueue_get_buf(vi->sts, &len)) != NULL) in virtinput_recv_status()
116 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_recv_status()
122 struct virtio_input *vi = input_get_drvdata(idev); in virtinput_status() local
124 return virtinput_send_status(vi, type, code, value); in virtinput_status()
127 static u8 virtinput_cfg_select(struct virtio_input *vi, in virtinput_cfg_select() argument
132 virtio_cwrite_le(vi->vdev, struct virtio_input_config, select, &select); in virtinput_cfg_select()
133 virtio_cwrite_le(vi->vdev, struct virtio_input_config, subsel, &subsel); in virtinput_cfg_select()
134 virtio_cread_le(vi->vdev, struct virtio_input_config, size, &size); in virtinput_cfg_select()
138 static void virtinput_cfg_bits(struct virtio_input *vi, int select, int subsel, in virtinput_cfg_bits() argument
145 bytes = virtinput_cfg_select(vi, select, subsel); in virtinput_cfg_bits()
159 virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config, in virtinput_cfg_bits()
169 __set_bit(subsel, vi->idev->evbit); in virtinput_cfg_bits()
172 static void virtinput_cfg_abs(struct virtio_input *vi, int abs) in virtinput_cfg_abs() argument
176 virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ABS_INFO, abs); in virtinput_cfg_abs()
177 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.min, &mi); in virtinput_cfg_abs()
178 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.max, &ma); in virtinput_cfg_abs()
179 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.res, &re); in virtinput_cfg_abs()
180 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.fuzz, &fu); in virtinput_cfg_abs()
181 virtio_cread_le(vi->vdev, struct virtio_input_config, u.abs.flat, &fl); in virtinput_cfg_abs()
182 input_set_abs_params(vi->idev, abs, mi, ma, fu, fl); in virtinput_cfg_abs()
183 input_abs_set_res(vi->idev, abs, re); in virtinput_cfg_abs()
186 static int virtinput_init_vqs(struct virtio_input *vi) in virtinput_init_vqs() argument
194 err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL); in virtinput_init_vqs()
197 vi->evt = vqs[0]; in virtinput_init_vqs()
198 vi->sts = vqs[1]; in virtinput_init_vqs()
203 static void virtinput_fill_evt(struct virtio_input *vi) in virtinput_fill_evt() argument
208 spin_lock_irqsave(&vi->lock, flags); in virtinput_fill_evt()
209 size = virtqueue_get_vring_size(vi->evt); in virtinput_fill_evt()
210 if (size > ARRAY_SIZE(vi->evts)) in virtinput_fill_evt()
211 size = ARRAY_SIZE(vi->evts); in virtinput_fill_evt()
213 virtinput_queue_evtbuf(vi, &vi->evts[i]); in virtinput_fill_evt()
214 virtqueue_kick(vi->evt); in virtinput_fill_evt()
215 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_fill_evt()
220 struct virtio_input *vi; in virtinput_probe() local
228 vi = kzalloc(sizeof(*vi), GFP_KERNEL); in virtinput_probe()
229 if (!vi) in virtinput_probe()
232 vdev->priv = vi; in virtinput_probe()
233 vi->vdev = vdev; in virtinput_probe()
234 spin_lock_init(&vi->lock); in virtinput_probe()
236 err = virtinput_init_vqs(vi); in virtinput_probe()
240 vi->idev = input_allocate_device(); in virtinput_probe()
241 if (!vi->idev) { in virtinput_probe()
245 input_set_drvdata(vi->idev, vi); in virtinput_probe()
247 size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ID_NAME, 0); in virtinput_probe()
248 virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config, in virtinput_probe()
250 vi->name, min(size, sizeof(vi->name))); in virtinput_probe()
251 size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ID_SERIAL, 0); in virtinput_probe()
252 virtio_cread_bytes(vi->vdev, offsetof(struct virtio_input_config, in virtinput_probe()
254 vi->serial, min(size, sizeof(vi->serial))); in virtinput_probe()
255 snprintf(vi->phys, sizeof(vi->phys), in virtinput_probe()
257 vi->idev->name = vi->name; in virtinput_probe()
258 vi->idev->phys = vi->phys; in virtinput_probe()
259 vi->idev->uniq = vi->serial; in virtinput_probe()
261 size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_ID_DEVIDS, 0); in virtinput_probe()
263 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
264 u.ids.bustype, &vi->idev->id.bustype); in virtinput_probe()
265 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
266 u.ids.vendor, &vi->idev->id.vendor); in virtinput_probe()
267 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
268 u.ids.product, &vi->idev->id.product); in virtinput_probe()
269 virtio_cread_le(vi->vdev, struct virtio_input_config, in virtinput_probe()
270 u.ids.version, &vi->idev->id.version); in virtinput_probe()
272 vi->idev->id.bustype = BUS_VIRTUAL; in virtinput_probe()
275 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_PROP_BITS, 0, in virtinput_probe()
276 vi->idev->propbit, INPUT_PROP_CNT); in virtinput_probe()
277 size = virtinput_cfg_select(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_REP); in virtinput_probe()
279 __set_bit(EV_REP, vi->idev->evbit); in virtinput_probe()
281 vi->idev->dev.parent = &vdev->dev; in virtinput_probe()
282 vi->idev->event = virtinput_status; in virtinput_probe()
285 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_KEY, in virtinput_probe()
286 vi->idev->keybit, KEY_CNT); in virtinput_probe()
287 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_REL, in virtinput_probe()
288 vi->idev->relbit, REL_CNT); in virtinput_probe()
289 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_ABS, in virtinput_probe()
290 vi->idev->absbit, ABS_CNT); in virtinput_probe()
291 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_MSC, in virtinput_probe()
292 vi->idev->mscbit, MSC_CNT); in virtinput_probe()
293 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_SW, in virtinput_probe()
294 vi->idev->swbit, SW_CNT); in virtinput_probe()
297 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_LED, in virtinput_probe()
298 vi->idev->ledbit, LED_CNT); in virtinput_probe()
299 virtinput_cfg_bits(vi, VIRTIO_INPUT_CFG_EV_BITS, EV_SND, in virtinput_probe()
300 vi->idev->sndbit, SND_CNT); in virtinput_probe()
302 if (test_bit(EV_ABS, vi->idev->evbit)) { in virtinput_probe()
304 if (!test_bit(abs, vi->idev->absbit)) in virtinput_probe()
306 virtinput_cfg_abs(vi, abs); in virtinput_probe()
309 if (test_bit(ABS_MT_SLOT, vi->idev->absbit)) { in virtinput_probe()
310 nslots = input_abs_get_max(vi->idev, ABS_MT_SLOT) + 1; in virtinput_probe()
311 err = input_mt_init_slots(vi->idev, nslots, 0); in virtinput_probe()
318 vi->ready = true; in virtinput_probe()
319 err = input_register_device(vi->idev); in virtinput_probe()
323 virtinput_fill_evt(vi); in virtinput_probe()
327 spin_lock_irqsave(&vi->lock, flags); in virtinput_probe()
328 vi->ready = false; in virtinput_probe()
329 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_probe()
331 input_free_device(vi->idev); in virtinput_probe()
335 kfree(vi); in virtinput_probe()
341 struct virtio_input *vi = vdev->priv; in virtinput_remove() local
345 spin_lock_irqsave(&vi->lock, flags); in virtinput_remove()
346 vi->ready = false; in virtinput_remove()
347 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_remove()
349 input_unregister_device(vi->idev); in virtinput_remove()
351 while ((buf = virtqueue_detach_unused_buf(vi->sts)) != NULL) in virtinput_remove()
354 kfree(vi); in virtinput_remove()
360 struct virtio_input *vi = vdev->priv; in virtinput_freeze() local
363 spin_lock_irqsave(&vi->lock, flags); in virtinput_freeze()
364 vi->ready = false; in virtinput_freeze()
365 spin_unlock_irqrestore(&vi->lock, flags); in virtinput_freeze()
373 struct virtio_input *vi = vdev->priv; in virtinput_restore() local
376 err = virtinput_init_vqs(vi); in virtinput_restore()
381 vi->ready = true; in virtinput_restore()
382 virtinput_fill_evt(vi); in virtinput_restore()