Lines Matching +full:abs +full:- +full:flat
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * - add UI_GET_SYSNAME ioctl
26 * - updated ff support for the changes in kernel interface
27 * - added MODULE_VERSION
29 * - added force feedback support
30 * - added UI_SET_PHYS
32 * - first public version
44 #include "../input-compat.h"
92 udev->buff[udev->head] = (struct input_event) { in uinput_dev_event()
100 udev->head = (udev->head + 1) % UINPUT_BUFFER_SIZE; in uinput_dev_event()
102 wake_up_interruptible(&udev->waitq); in uinput_dev_event()
114 spin_lock(&udev->requests_lock); in uinput_request_alloc_id()
117 if (!udev->requests[id]) { in uinput_request_alloc_id()
118 request->id = id; in uinput_request_alloc_id()
119 udev->requests[id] = request; in uinput_request_alloc_id()
125 spin_unlock(&udev->requests_lock); in uinput_request_alloc_id()
136 return udev->requests[id]; in uinput_request_find()
143 return wait_event_interruptible(udev->requests_waitq, in uinput_request_reserve_slot()
151 spin_lock(&udev->requests_lock); in uinput_request_release_slot()
152 udev->requests[id] = NULL; in uinput_request_release_slot()
153 spin_unlock(&udev->requests_lock); in uinput_request_release_slot()
155 wake_up(&udev->requests_waitq); in uinput_request_release_slot()
163 retval = mutex_lock_interruptible(&udev->mutex); in uinput_request_send()
167 if (udev->state != UIST_CREATED) { in uinput_request_send()
168 retval = -ENODEV; in uinput_request_send()
172 init_completion(&request->done); in uinput_request_send()
178 uinput_dev_event(udev->dev, EV_UINPUT, request->code, request->id); in uinput_request_send()
181 mutex_unlock(&udev->mutex); in uinput_request_send()
198 if (!wait_for_completion_timeout(&request->done, 30 * HZ)) { in uinput_request_submit()
199 retval = -ETIMEDOUT; in uinput_request_submit()
203 retval = request->retval; in uinput_request_submit()
206 uinput_request_release_slot(udev, request->id); in uinput_request_submit()
219 spin_lock(&udev->requests_lock); in uinput_flush_requests()
222 request = udev->requests[i]; in uinput_flush_requests()
224 request->retval = -ENODEV; in uinput_flush_requests()
225 complete(&request->done); in uinput_flush_requests()
229 spin_unlock(&udev->requests_lock); in uinput_flush_requests()
261 if (effect->type == FF_PERIODIC && in uinput_dev_upload_effect()
262 effect->u.periodic.waveform == FF_CUSTOM) in uinput_dev_upload_effect()
263 return -EINVAL; in uinput_dev_upload_effect()
277 if (!test_bit(EV_FF, dev->evbit)) in uinput_dev_erase_effect()
278 return -ENOSYS; in uinput_dev_erase_effect()
292 * the udev->mutex), or the file descriptor is closed and there is in uinput_dev_flush()
301 struct input_dev *dev = udev->dev; in uinput_destroy_device()
302 enum uinput_state old_state = udev->state; in uinput_destroy_device()
304 udev->state = UIST_NEW_DEVICE; in uinput_destroy_device()
307 name = dev->name; in uinput_destroy_device()
308 phys = dev->phys; in uinput_destroy_device()
317 udev->dev = NULL; in uinput_destroy_device()
323 struct input_dev *dev = udev->dev; in uinput_create_device()
326 if (udev->state != UIST_SETUP_COMPLETE) { in uinput_create_device()
328 return -EINVAL; in uinput_create_device()
331 if (test_bit(EV_ABS, dev->evbit)) { in uinput_create_device()
333 if (!dev->absinfo) { in uinput_create_device()
334 error = -EINVAL; in uinput_create_device()
338 if (test_bit(ABS_MT_SLOT, dev->absbit)) { in uinput_create_device()
343 } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { in uinput_create_device()
348 if (test_bit(EV_FF, dev->evbit) && !udev->ff_effects_max) { in uinput_create_device()
349 printk(KERN_DEBUG "%s: ff_effects_max should be non-zero when FF_BIT is set\n", in uinput_create_device()
351 error = -EINVAL; in uinput_create_device()
355 if (udev->ff_effects_max) { in uinput_create_device()
356 error = input_ff_create(dev, udev->ff_effects_max); in uinput_create_device()
360 dev->ff->upload = uinput_dev_upload_effect; in uinput_create_device()
361 dev->ff->erase = uinput_dev_erase_effect; in uinput_create_device()
362 dev->ff->playback = uinput_dev_playback; in uinput_create_device()
363 dev->ff->set_gain = uinput_dev_set_gain; in uinput_create_device()
364 dev->ff->set_autocenter = uinput_dev_set_autocenter; in uinput_create_device()
370 dev->flush = uinput_dev_flush; in uinput_create_device()
373 dev->event = uinput_dev_event; in uinput_create_device()
375 input_set_drvdata(udev->dev, udev); in uinput_create_device()
377 error = input_register_device(udev->dev); in uinput_create_device()
381 udev->state = UIST_CREATED; in uinput_create_device()
396 return -ENOMEM; in uinput_open()
398 mutex_init(&newdev->mutex); in uinput_open()
399 spin_lock_init(&newdev->requests_lock); in uinput_open()
400 init_waitqueue_head(&newdev->requests_waitq); in uinput_open()
401 init_waitqueue_head(&newdev->waitq); in uinput_open()
402 newdev->state = UIST_NEW_DEVICE; in uinput_open()
404 file->private_data = newdev; in uinput_open()
411 const struct input_absinfo *abs) in uinput_validate_absinfo() argument
415 min = abs->minimum; in uinput_validate_absinfo()
416 max = abs->maximum; in uinput_validate_absinfo()
420 "%s: invalid abs[%02x] min:%d max:%d\n", in uinput_validate_absinfo()
422 return -EINVAL; in uinput_validate_absinfo()
425 if (!check_sub_overflow(max, min, &range) && abs->flat > range) { in uinput_validate_absinfo()
428 UINPUT_NAME, code, abs->flat, min, max); in uinput_validate_absinfo()
429 return -EINVAL; in uinput_validate_absinfo()
440 if (!test_bit(EV_ABS, dev->evbit)) in uinput_validate_absbits()
447 for_each_set_bit(cnt, dev->absbit, ABS_CNT) { in uinput_validate_absbits()
448 if (!dev->absinfo) in uinput_validate_absbits()
449 return -EINVAL; in uinput_validate_absbits()
451 error = uinput_validate_absinfo(dev, cnt, &dev->absinfo[cnt]); in uinput_validate_absbits()
465 if (udev->state == UIST_CREATED) in uinput_dev_setup()
466 return -EINVAL; in uinput_dev_setup()
469 return -EFAULT; in uinput_dev_setup()
472 return -EINVAL; in uinput_dev_setup()
474 dev = udev->dev; in uinput_dev_setup()
475 dev->id = setup.id; in uinput_dev_setup()
476 udev->ff_effects_max = setup.ff_effects_max; in uinput_dev_setup()
478 kfree(dev->name); in uinput_dev_setup()
479 dev->name = kstrndup(setup.name, UINPUT_MAX_NAME_SIZE, GFP_KERNEL); in uinput_dev_setup()
480 if (!dev->name) in uinput_dev_setup()
481 return -ENOMEM; in uinput_dev_setup()
483 udev->state = UIST_SETUP_COMPLETE; in uinput_dev_setup()
495 return -E2BIG; in uinput_abs_setup()
497 if (udev->state == UIST_CREATED) in uinput_abs_setup()
498 return -EINVAL; in uinput_abs_setup()
501 return -EFAULT; in uinput_abs_setup()
504 return -ERANGE; in uinput_abs_setup()
506 dev = udev->dev; in uinput_abs_setup()
513 if (!dev->absinfo) in uinput_abs_setup()
514 return -ENOMEM; in uinput_abs_setup()
516 set_bit(setup.code, dev->absbit); in uinput_abs_setup()
517 dev->absinfo[setup.code] = setup.absinfo; in uinput_abs_setup()
531 return -EINVAL; in uinput_setup_device_legacy()
533 if (!udev->dev) { in uinput_setup_device_legacy()
534 udev->dev = input_allocate_device(); in uinput_setup_device_legacy()
535 if (!udev->dev) in uinput_setup_device_legacy()
536 return -ENOMEM; in uinput_setup_device_legacy()
539 dev = udev->dev; in uinput_setup_device_legacy()
545 udev->ff_effects_max = user_dev->ff_effects_max; in uinput_setup_device_legacy()
548 if (!user_dev->name[0]) { in uinput_setup_device_legacy()
549 retval = -EINVAL; in uinput_setup_device_legacy()
553 kfree(dev->name); in uinput_setup_device_legacy()
554 dev->name = kstrndup(user_dev->name, UINPUT_MAX_NAME_SIZE, in uinput_setup_device_legacy()
556 if (!dev->name) { in uinput_setup_device_legacy()
557 retval = -ENOMEM; in uinput_setup_device_legacy()
561 dev->id.bustype = user_dev->id.bustype; in uinput_setup_device_legacy()
562 dev->id.vendor = user_dev->id.vendor; in uinput_setup_device_legacy()
563 dev->id.product = user_dev->id.product; in uinput_setup_device_legacy()
564 dev->id.version = user_dev->id.version; in uinput_setup_device_legacy()
567 input_abs_set_max(dev, i, user_dev->absmax[i]); in uinput_setup_device_legacy()
568 input_abs_set_min(dev, i, user_dev->absmin[i]); in uinput_setup_device_legacy()
569 input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]); in uinput_setup_device_legacy()
570 input_abs_set_flat(dev, i, user_dev->absflat[i]); in uinput_setup_device_legacy()
577 udev->state = UIST_SETUP_COMPLETE; in uinput_setup_device_legacy()
592 return -EINVAL; in uinput_inject_events()
602 return -EFAULT; in uinput_inject_events()
604 input_event(udev->dev, ev.type, ev.code, ev.value); in uinput_inject_events()
615 struct uinput_device *udev = file->private_data; in uinput_write()
621 retval = mutex_lock_interruptible(&udev->mutex); in uinput_write()
625 retval = udev->state == UIST_CREATED ? in uinput_write()
629 mutex_unlock(&udev->mutex); in uinput_write()
639 spin_lock_irq(&udev->dev->event_lock); in uinput_fetch_next_event()
641 have_event = udev->head != udev->tail; in uinput_fetch_next_event()
643 *event = udev->buff[udev->tail]; in uinput_fetch_next_event()
644 udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE; in uinput_fetch_next_event()
647 spin_unlock_irq(&udev->dev->event_lock); in uinput_fetch_next_event()
662 return -EFAULT; in uinput_events_to_user()
673 struct uinput_device *udev = file->private_data; in uinput_read()
677 return -EINVAL; in uinput_read()
680 retval = mutex_lock_interruptible(&udev->mutex); in uinput_read()
684 if (udev->state != UIST_CREATED) in uinput_read()
685 retval = -ENODEV; in uinput_read()
686 else if (udev->head == udev->tail && in uinput_read()
687 (file->f_flags & O_NONBLOCK)) in uinput_read()
688 retval = -EAGAIN; in uinput_read()
692 mutex_unlock(&udev->mutex); in uinput_read()
697 if (!(file->f_flags & O_NONBLOCK)) in uinput_read()
698 retval = wait_event_interruptible(udev->waitq, in uinput_read()
699 udev->head != udev->tail || in uinput_read()
700 udev->state != UIST_CREATED); in uinput_read()
708 struct uinput_device *udev = file->private_data; in uinput_poll()
710 poll_wait(file, &udev->waitq, wait); in uinput_poll()
712 if (udev->head != udev->tail) in uinput_poll()
720 struct uinput_device *udev = file->private_data; in uinput_release()
742 ff_up_compat.request_id = ff_up->request_id; in uinput_ff_upload_to_user()
743 ff_up_compat.retval = ff_up->retval; in uinput_ff_upload_to_user()
750 memcpy(&ff_up_compat.effect, &ff_up->effect, in uinput_ff_upload_to_user()
752 memcpy(&ff_up_compat.old, &ff_up->old, in uinput_ff_upload_to_user()
757 return -EFAULT; in uinput_ff_upload_to_user()
761 return -EFAULT; in uinput_ff_upload_to_user()
775 return -EFAULT; in uinput_ff_upload_from_user()
777 ff_up->request_id = ff_up_compat.request_id; in uinput_ff_upload_from_user()
778 ff_up->retval = ff_up_compat.retval; in uinput_ff_upload_from_user()
779 memcpy(&ff_up->effect, &ff_up_compat.effect, in uinput_ff_upload_from_user()
781 memcpy(&ff_up->old, &ff_up_compat.old, in uinput_ff_upload_from_user()
787 return -EFAULT; in uinput_ff_upload_from_user()
799 return -EFAULT; in uinput_ff_upload_to_user()
808 return -EFAULT; in uinput_ff_upload_from_user()
818 if (udev->state == UIST_CREATED) \
819 __ret = -EINVAL; \
821 __ret = -EINVAL; \
822 else set_bit((_arg), udev->dev->_bit); \
833 return -ENOENT; in uinput_str_to_user()
836 return -EINVAL; in uinput_str_to_user()
844 return -EFAULT; in uinput_str_to_user()
847 ret = put_user(0, p + len - 1); in uinput_str_to_user()
848 return ret ? -EFAULT : len; in uinput_str_to_user()
855 struct uinput_device *udev = file->private_data; in uinput_ioctl_handler()
863 retval = mutex_lock_interruptible(&udev->mutex); in uinput_ioctl_handler()
867 if (!udev->dev) { in uinput_ioctl_handler()
868 udev->dev = input_allocate_device(); in uinput_ioctl_handler()
869 if (!udev->dev) { in uinput_ioctl_handler()
870 retval = -ENOMEM; in uinput_ioctl_handler()
878 retval = -EFAULT; in uinput_ioctl_handler()
936 if (udev->state == UIST_CREATED) { in uinput_ioctl_handler()
937 retval = -EINVAL; in uinput_ioctl_handler()
947 kfree(udev->dev->phys); in uinput_ioctl_handler()
948 udev->dev->phys = phys; in uinput_ioctl_handler()
957 if (!req || req->code != UI_FF_UPLOAD || in uinput_ioctl_handler()
958 !req->u.upload.effect) { in uinput_ioctl_handler()
959 retval = -EINVAL; in uinput_ioctl_handler()
964 ff_up.effect = *req->u.upload.effect; in uinput_ioctl_handler()
965 if (req->u.upload.old) in uinput_ioctl_handler()
966 ff_up.old = *req->u.upload.old; in uinput_ioctl_handler()
975 retval = -EFAULT; in uinput_ioctl_handler()
980 if (!req || req->code != UI_FF_ERASE) { in uinput_ioctl_handler()
981 retval = -EINVAL; in uinput_ioctl_handler()
986 ff_erase.effect_id = req->u.effect_id; in uinput_ioctl_handler()
988 retval = -EFAULT; in uinput_ioctl_handler()
1000 if (!req || req->code != UI_FF_UPLOAD || in uinput_ioctl_handler()
1001 !req->u.upload.effect) { in uinput_ioctl_handler()
1002 retval = -EINVAL; in uinput_ioctl_handler()
1006 req->retval = ff_up.retval; in uinput_ioctl_handler()
1007 complete(&req->done); in uinput_ioctl_handler()
1012 retval = -EFAULT; in uinput_ioctl_handler()
1017 if (!req || req->code != UI_FF_ERASE) { in uinput_ioctl_handler()
1018 retval = -EINVAL; in uinput_ioctl_handler()
1022 req->retval = ff_erase.retval; in uinput_ioctl_handler()
1023 complete(&req->done); in uinput_ioctl_handler()
1029 /* Now check variable-length commands */ in uinput_ioctl_handler()
1032 if (udev->state != UIST_CREATED) { in uinput_ioctl_handler()
1033 retval = -ENOENT; in uinput_ioctl_handler()
1036 name = dev_name(&udev->dev->dev); in uinput_ioctl_handler()
1045 retval = -EINVAL; in uinput_ioctl_handler()
1047 mutex_unlock(&udev->mutex); in uinput_ioctl_handler()