34
34
#include <linux/slab.h>
35
35
#include <linux/module.h>
36
36
#include <linux/init.h>
37
#include <linux/smp_lock.h>
38
37
#include <linux/fs.h>
39
38
#include <linux/miscdevice.h>
40
39
#include <linux/uinput.h>
40
#include <linux/input/mt.h>
41
41
#include "../input-compat.h"
43
43
static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
302
301
unsigned int cnt;
305
for (cnt = 0; cnt < ABS_MAX + 1; cnt++) {
304
for (cnt = 0; cnt < ABS_CNT; cnt++) {
306
305
if (!test_bit(cnt, dev->absbit))
309
if ((dev->absmax[cnt] <= dev->absmin[cnt])) {
308
if (input_abs_get_max(dev, cnt) <= input_abs_get_min(dev, cnt)) {
310
309
printk(KERN_DEBUG
311
310
"%s: invalid abs[%02x] min:%d max:%d\n",
312
311
UINPUT_NAME, cnt,
313
dev->absmin[cnt], dev->absmax[cnt]);
312
input_abs_get_min(dev, cnt),
313
input_abs_get_max(dev, cnt));
314
314
retval = -EINVAL;
318
if (dev->absflat[cnt] > (dev->absmax[cnt] - dev->absmin[cnt])) {
318
if (input_abs_get_flat(dev, cnt) >
319
input_abs_get_max(dev, cnt) - input_abs_get_min(dev, cnt)) {
319
320
printk(KERN_DEBUG
320
"%s: absflat[%02x] out of range: %d "
321
"%s: abs_flat #%02x out of range: %d "
321
322
"(min:%d/max:%d)\n",
322
UINPUT_NAME, cnt, dev->absflat[cnt],
323
dev->absmin[cnt], dev->absmax[cnt]);
324
input_abs_get_flat(dev, cnt),
325
input_abs_get_min(dev, cnt),
326
input_abs_get_max(dev, cnt));
324
327
retval = -EINVAL;
389
392
dev->id.product = user_dev->id.product;
390
393
dev->id.version = user_dev->id.version;
392
size = sizeof(int) * (ABS_MAX + 1);
393
memcpy(dev->absmax, user_dev->absmax, size);
394
memcpy(dev->absmin, user_dev->absmin, size);
395
memcpy(dev->absfuzz, user_dev->absfuzz, size);
396
memcpy(dev->absflat, user_dev->absflat, size);
395
for (i = 0; i < ABS_CNT; i++) {
396
input_abs_set_max(dev, i, user_dev->absmax[i]);
397
input_abs_set_min(dev, i, user_dev->absmin[i]);
398
input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]);
399
input_abs_set_flat(dev, i, user_dev->absflat[i]);
398
402
/* check if absmin/absmax/absfuzz/absflat are filled as
399
403
* told in Documentation/input/input-programming.txt */
401
405
retval = uinput_validate_absbits(dev);
408
if (test_bit(ABS_MT_SLOT, dev->absbit)) {
409
int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1;
410
input_mt_init_slots(dev, nslot);
411
} else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
412
input_set_events_per_packet(dev, 60);
406
416
udev->state = UIST_SETUP_COMPLETE;
670
680
retval = uinput_set_bit(arg, swbit, SW_MAX);
684
retval = uinput_set_bit(arg, propbit, INPUT_PROP_MAX);
673
687
case UI_SET_PHYS:
674
688
if (udev->state == UIST_CREATED) {
675
689
retval = -EINVAL;