Lines Matching +full:abs +full:- +full:flat
1 // SPDX-License-Identifier: GPL-2.0-or-later
11 * - add UI_GET_SYSNAME ioctl
13 * - updated ff support for the changes in kernel interface
14 * - added MODULE_VERSION
16 * - added force feedback support
17 * - added UI_SET_PHYS
19 * - first public version
31 #include "../input-compat.h"
80 udev->buff[udev->head] = (struct input_event) { in uinput_dev_event()
88 udev->head = (udev->head + 1) % UINPUT_BUFFER_SIZE; in uinput_dev_event()
90 wake_up_interruptible(&udev->waitq); in uinput_dev_event()
102 spin_lock(&udev->requests_lock); in uinput_request_alloc_id()
105 if (!udev->requests[id]) { in uinput_request_alloc_id()
106 request->id = id; in uinput_request_alloc_id()
107 udev->requests[id] = request; in uinput_request_alloc_id()
113 spin_unlock(&udev->requests_lock); in uinput_request_alloc_id()
124 return udev->requests[id]; in uinput_request_find()
131 return wait_event_interruptible(udev->requests_waitq, in uinput_request_reserve_slot()
139 spin_lock(&udev->requests_lock); in uinput_request_release_slot()
140 udev->requests[id] = NULL; in uinput_request_release_slot()
141 spin_unlock(&udev->requests_lock); in uinput_request_release_slot()
143 wake_up(&udev->requests_waitq); in uinput_request_release_slot()
151 retval = mutex_lock_interruptible(&udev->mutex); in uinput_request_send()
155 if (udev->state != UIST_CREATED) { in uinput_request_send()
156 retval = -ENODEV; in uinput_request_send()
160 init_completion(&request->done); in uinput_request_send()
166 uinput_dev_event(udev->dev, EV_UINPUT, request->code, request->id); in uinput_request_send()
169 mutex_unlock(&udev->mutex); in uinput_request_send()
186 if (!wait_for_completion_timeout(&request->done, 30 * HZ)) { in uinput_request_submit()
187 retval = -ETIMEDOUT; in uinput_request_submit()
191 retval = request->retval; in uinput_request_submit()
194 uinput_request_release_slot(udev, request->id); in uinput_request_submit()
207 spin_lock(&udev->requests_lock); in uinput_flush_requests()
210 request = udev->requests[i]; in uinput_flush_requests()
212 request->retval = -ENODEV; in uinput_flush_requests()
213 complete(&request->done); in uinput_flush_requests()
217 spin_unlock(&udev->requests_lock); in uinput_flush_requests()
249 if (effect->type == FF_PERIODIC && in uinput_dev_upload_effect()
250 effect->u.periodic.waveform == FF_CUSTOM) in uinput_dev_upload_effect()
251 return -EINVAL; in uinput_dev_upload_effect()
265 if (!test_bit(EV_FF, dev->evbit)) in uinput_dev_erase_effect()
266 return -ENOSYS; in uinput_dev_erase_effect()
280 * the udev->mutex), or the file descriptor is closed and there is in uinput_dev_flush()
289 struct input_dev *dev = udev->dev; in uinput_destroy_device()
290 enum uinput_state old_state = udev->state; in uinput_destroy_device()
292 udev->state = UIST_NEW_DEVICE; in uinput_destroy_device()
295 name = dev->name; in uinput_destroy_device()
296 phys = dev->phys; in uinput_destroy_device()
305 udev->dev = NULL; in uinput_destroy_device()
311 struct input_dev *dev = udev->dev; in uinput_create_device()
314 if (udev->state != UIST_SETUP_COMPLETE) { in uinput_create_device()
316 return -EINVAL; in uinput_create_device()
319 if (test_bit(EV_ABS, dev->evbit)) { in uinput_create_device()
321 if (!dev->absinfo) { in uinput_create_device()
322 error = -EINVAL; in uinput_create_device()
326 if (test_bit(ABS_MT_SLOT, dev->absbit)) { in uinput_create_device()
331 } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { in uinput_create_device()
336 if (test_bit(EV_FF, dev->evbit) && !udev->ff_effects_max) { in uinput_create_device()
337 printk(KERN_DEBUG "%s: ff_effects_max should be non-zero when FF_BIT is set\n", in uinput_create_device()
339 error = -EINVAL; in uinput_create_device()
343 if (udev->ff_effects_max) { in uinput_create_device()
344 error = input_ff_create(dev, udev->ff_effects_max); in uinput_create_device()
348 dev->ff->upload = uinput_dev_upload_effect; in uinput_create_device()
349 dev->ff->erase = uinput_dev_erase_effect; in uinput_create_device()
350 dev->ff->playback = uinput_dev_playback; in uinput_create_device()
351 dev->ff->set_gain = uinput_dev_set_gain; in uinput_create_device()
352 dev->ff->set_autocenter = uinput_dev_set_autocenter; in uinput_create_device()
358 dev->flush = uinput_dev_flush; in uinput_create_device()
361 dev->event = uinput_dev_event; in uinput_create_device()
363 input_set_drvdata(udev->dev, udev); in uinput_create_device()
365 error = input_register_device(udev->dev); in uinput_create_device()
369 udev->state = UIST_CREATED; in uinput_create_device()
384 return -ENOMEM; in uinput_open()
386 mutex_init(&newdev->mutex); in uinput_open()
387 spin_lock_init(&newdev->requests_lock); in uinput_open()
388 init_waitqueue_head(&newdev->requests_waitq); in uinput_open()
389 init_waitqueue_head(&newdev->waitq); in uinput_open()
390 newdev->state = UIST_NEW_DEVICE; in uinput_open()
392 file->private_data = newdev; in uinput_open()
399 const struct input_absinfo *abs) in uinput_validate_absinfo() argument
403 min = abs->minimum; in uinput_validate_absinfo()
404 max = abs->maximum; in uinput_validate_absinfo()
408 "%s: invalid abs[%02x] min:%d max:%d\n", in uinput_validate_absinfo()
410 return -EINVAL; in uinput_validate_absinfo()
413 if (!check_sub_overflow(max, min, &range) && abs->flat > range) { in uinput_validate_absinfo()
416 UINPUT_NAME, code, abs->flat, min, max); in uinput_validate_absinfo()
417 return -EINVAL; in uinput_validate_absinfo()
428 if (!test_bit(EV_ABS, dev->evbit)) in uinput_validate_absbits()
435 for_each_set_bit(cnt, dev->absbit, ABS_CNT) { in uinput_validate_absbits()
436 if (!dev->absinfo) in uinput_validate_absbits()
437 return -EINVAL; in uinput_validate_absbits()
439 error = uinput_validate_absinfo(dev, cnt, &dev->absinfo[cnt]); in uinput_validate_absbits()
453 if (udev->state == UIST_CREATED) in uinput_dev_setup()
454 return -EINVAL; in uinput_dev_setup()
457 return -EFAULT; in uinput_dev_setup()
460 return -EINVAL; in uinput_dev_setup()
462 dev = udev->dev; in uinput_dev_setup()
463 dev->id = setup.id; in uinput_dev_setup()
464 udev->ff_effects_max = setup.ff_effects_max; in uinput_dev_setup()
466 kfree(dev->name); in uinput_dev_setup()
467 dev->name = kstrndup(setup.name, UINPUT_MAX_NAME_SIZE, GFP_KERNEL); in uinput_dev_setup()
468 if (!dev->name) in uinput_dev_setup()
469 return -ENOMEM; in uinput_dev_setup()
471 udev->state = UIST_SETUP_COMPLETE; in uinput_dev_setup()
483 return -E2BIG; in uinput_abs_setup()
485 if (udev->state == UIST_CREATED) in uinput_abs_setup()
486 return -EINVAL; in uinput_abs_setup()
489 return -EFAULT; in uinput_abs_setup()
492 return -ERANGE; in uinput_abs_setup()
494 dev = udev->dev; in uinput_abs_setup()
501 if (!dev->absinfo) in uinput_abs_setup()
502 return -ENOMEM; in uinput_abs_setup()
504 set_bit(setup.code, dev->absbit); in uinput_abs_setup()
505 dev->absinfo[setup.code] = setup.absinfo; in uinput_abs_setup()
519 return -EINVAL; in uinput_setup_device_legacy()
521 if (!udev->dev) { in uinput_setup_device_legacy()
522 udev->dev = input_allocate_device(); in uinput_setup_device_legacy()
523 if (!udev->dev) in uinput_setup_device_legacy()
524 return -ENOMEM; in uinput_setup_device_legacy()
527 dev = udev->dev; in uinput_setup_device_legacy()
533 udev->ff_effects_max = user_dev->ff_effects_max; in uinput_setup_device_legacy()
536 if (!user_dev->name[0]) { in uinput_setup_device_legacy()
537 retval = -EINVAL; in uinput_setup_device_legacy()
541 kfree(dev->name); in uinput_setup_device_legacy()
542 dev->name = kstrndup(user_dev->name, UINPUT_MAX_NAME_SIZE, in uinput_setup_device_legacy()
544 if (!dev->name) { in uinput_setup_device_legacy()
545 retval = -ENOMEM; in uinput_setup_device_legacy()
549 dev->id.bustype = user_dev->id.bustype; in uinput_setup_device_legacy()
550 dev->id.vendor = user_dev->id.vendor; in uinput_setup_device_legacy()
551 dev->id.product = user_dev->id.product; in uinput_setup_device_legacy()
552 dev->id.version = user_dev->id.version; in uinput_setup_device_legacy()
555 input_abs_set_max(dev, i, user_dev->absmax[i]); in uinput_setup_device_legacy()
556 input_abs_set_min(dev, i, user_dev->absmin[i]); in uinput_setup_device_legacy()
557 input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]); in uinput_setup_device_legacy()
558 input_abs_set_flat(dev, i, user_dev->absflat[i]); in uinput_setup_device_legacy()
565 udev->state = UIST_SETUP_COMPLETE; in uinput_setup_device_legacy()
609 return -EINVAL; in uinput_inject_events()
619 return -EFAULT; in uinput_inject_events()
623 input_set_timestamp(udev->dev, timestamp); in uinput_inject_events()
625 input_event(udev->dev, ev.type, ev.code, ev.value); in uinput_inject_events()
636 struct uinput_device *udev = file->private_data; in uinput_write()
642 retval = mutex_lock_interruptible(&udev->mutex); in uinput_write()
646 retval = udev->state == UIST_CREATED ? in uinput_write()
650 mutex_unlock(&udev->mutex); in uinput_write()
660 spin_lock_irq(&udev->dev->event_lock); in uinput_fetch_next_event()
662 have_event = udev->head != udev->tail; in uinput_fetch_next_event()
664 *event = udev->buff[udev->tail]; in uinput_fetch_next_event()
665 udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE; in uinput_fetch_next_event()
668 spin_unlock_irq(&udev->dev->event_lock); in uinput_fetch_next_event()
683 return -EFAULT; in uinput_events_to_user()
694 struct uinput_device *udev = file->private_data; in uinput_read()
698 return -EINVAL; in uinput_read()
701 retval = mutex_lock_interruptible(&udev->mutex); in uinput_read()
705 if (udev->state != UIST_CREATED) in uinput_read()
706 retval = -ENODEV; in uinput_read()
707 else if (udev->head == udev->tail && in uinput_read()
708 (file->f_flags & O_NONBLOCK)) in uinput_read()
709 retval = -EAGAIN; in uinput_read()
713 mutex_unlock(&udev->mutex); in uinput_read()
718 if (!(file->f_flags & O_NONBLOCK)) in uinput_read()
719 retval = wait_event_interruptible(udev->waitq, in uinput_read()
720 udev->head != udev->tail || in uinput_read()
721 udev->state != UIST_CREATED); in uinput_read()
729 struct uinput_device *udev = file->private_data; in uinput_poll()
732 poll_wait(file, &udev->waitq, wait); in uinput_poll()
734 if (udev->head != udev->tail) in uinput_poll()
742 struct uinput_device *udev = file->private_data; in uinput_release()
764 ff_up_compat.request_id = ff_up->request_id; in uinput_ff_upload_to_user()
765 ff_up_compat.retval = ff_up->retval; in uinput_ff_upload_to_user()
772 memcpy(&ff_up_compat.effect, &ff_up->effect, in uinput_ff_upload_to_user()
774 memcpy(&ff_up_compat.old, &ff_up->old, in uinput_ff_upload_to_user()
779 return -EFAULT; in uinput_ff_upload_to_user()
783 return -EFAULT; in uinput_ff_upload_to_user()
797 return -EFAULT; in uinput_ff_upload_from_user()
799 ff_up->request_id = ff_up_compat.request_id; in uinput_ff_upload_from_user()
800 ff_up->retval = ff_up_compat.retval; in uinput_ff_upload_from_user()
801 memcpy(&ff_up->effect, &ff_up_compat.effect, in uinput_ff_upload_from_user()
803 memcpy(&ff_up->old, &ff_up_compat.old, in uinput_ff_upload_from_user()
809 return -EFAULT; in uinput_ff_upload_from_user()
821 return -EFAULT; in uinput_ff_upload_to_user()
830 return -EFAULT; in uinput_ff_upload_from_user()
840 if (udev->state == UIST_CREATED) \
841 __ret = -EINVAL; \
843 __ret = -EINVAL; \
844 else set_bit((_arg), udev->dev->_bit); \
855 return -ENOENT; in uinput_str_to_user()
858 return -EINVAL; in uinput_str_to_user()
866 return -EFAULT; in uinput_str_to_user()
869 ret = put_user(0, p + len - 1); in uinput_str_to_user()
870 return ret ? -EFAULT : len; in uinput_str_to_user()
877 struct uinput_device *udev = file->private_data; in uinput_ioctl_handler()
885 retval = mutex_lock_interruptible(&udev->mutex); in uinput_ioctl_handler()
889 if (!udev->dev) { in uinput_ioctl_handler()
890 udev->dev = input_allocate_device(); in uinput_ioctl_handler()
891 if (!udev->dev) { in uinput_ioctl_handler()
892 retval = -ENOMEM; in uinput_ioctl_handler()
900 retval = -EFAULT; in uinput_ioctl_handler()
958 if (udev->state == UIST_CREATED) { in uinput_ioctl_handler()
959 retval = -EINVAL; in uinput_ioctl_handler()
969 kfree(udev->dev->phys); in uinput_ioctl_handler()
970 udev->dev->phys = phys; in uinput_ioctl_handler()
979 if (!req || req->code != UI_FF_UPLOAD || in uinput_ioctl_handler()
980 !req->u.upload.effect) { in uinput_ioctl_handler()
981 retval = -EINVAL; in uinput_ioctl_handler()
986 ff_up.effect = *req->u.upload.effect; in uinput_ioctl_handler()
987 if (req->u.upload.old) in uinput_ioctl_handler()
988 ff_up.old = *req->u.upload.old; in uinput_ioctl_handler()
997 retval = -EFAULT; in uinput_ioctl_handler()
1002 if (!req || req->code != UI_FF_ERASE) { in uinput_ioctl_handler()
1003 retval = -EINVAL; in uinput_ioctl_handler()
1008 ff_erase.effect_id = req->u.effect_id; in uinput_ioctl_handler()
1010 retval = -EFAULT; in uinput_ioctl_handler()
1022 if (!req || req->code != UI_FF_UPLOAD || in uinput_ioctl_handler()
1023 !req->u.upload.effect) { in uinput_ioctl_handler()
1024 retval = -EINVAL; in uinput_ioctl_handler()
1028 req->retval = ff_up.retval; in uinput_ioctl_handler()
1029 complete(&req->done); in uinput_ioctl_handler()
1034 retval = -EFAULT; in uinput_ioctl_handler()
1039 if (!req || req->code != UI_FF_ERASE) { in uinput_ioctl_handler()
1040 retval = -EINVAL; in uinput_ioctl_handler()
1044 req->retval = ff_erase.retval; in uinput_ioctl_handler()
1045 complete(&req->done); in uinput_ioctl_handler()
1051 /* Now check variable-length commands */ in uinput_ioctl_handler()
1054 if (udev->state != UIST_CREATED) { in uinput_ioctl_handler()
1055 retval = -ENOENT; in uinput_ioctl_handler()
1058 name = dev_name(&udev->dev->dev); in uinput_ioctl_handler()
1067 retval = -EINVAL; in uinput_ioctl_handler()
1069 mutex_unlock(&udev->mutex); in uinput_ioctl_handler()