~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to drivers/input/misc/uinput.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno, Martin Michlmayr
  • Date: 2011-04-06 13:53:30 UTC
  • mfrom: (43.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20110406135330-wjufxhd0tvn3zx4z
Tags: 2.6.38-3
[ Ben Hutchings ]
* [ppc64] Add to linux-tools package architectures (Closes: #620124)
* [amd64] Save cr4 to mmu_cr4_features at boot time (Closes: #620284)
* appletalk: Fix bugs introduced when removing use of BKL
* ALSA: Fix yet another race in disconnection
* cciss: Fix lost command issue
* ath9k: Fix kernel panic in AR2427
* ses: Avoid kernel panic when lun 0 is not mapped
* PCI/ACPI: Report ASPM support to BIOS if not disabled from command line

[ Aurelien Jarno ]
* rtlwifi: fix build when PCI is not enabled.

[ Martin Michlmayr ]
* rtlwifi: Eliminate udelay calls with too large values (Closes: #620204)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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"
42
42
 
43
43
static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
284
284
        if (!newdev)
285
285
                return -ENOMEM;
286
286
 
287
 
        lock_kernel();
288
287
        mutex_init(&newdev->mutex);
289
288
        spin_lock_init(&newdev->requests_lock);
290
289
        init_waitqueue_head(&newdev->requests_waitq);
292
291
        newdev->state = UIST_NEW_DEVICE;
293
292
 
294
293
        file->private_data = newdev;
295
 
        unlock_kernel();
 
294
        nonseekable_open(inode, file);
296
295
 
297
296
        return 0;
298
297
}
302
301
        unsigned int cnt;
303
302
        int retval = 0;
304
303
 
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))
307
306
                        continue;
308
307
 
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;
315
315
                        break;
316
316
                }
317
317
 
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]);
 
323
                                UINPUT_NAME, 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;
325
328
                        break;
326
329
                }
345
348
        struct uinput_user_dev  *user_dev;
346
349
        struct input_dev        *dev;
347
350
        char                    *name;
348
 
        int                     size;
 
351
        int                     i, size;
349
352
        int                     retval;
350
353
 
351
354
        if (count != sizeof(struct uinput_user_dev))
389
392
        dev->id.product = user_dev->id.product;
390
393
        dev->id.version = user_dev->id.version;
391
394
 
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]);
 
400
        }
397
401
 
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);
402
406
                if (retval < 0)
403
407
                        goto exit;
 
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);
 
413
                }
404
414
        }
405
415
 
406
416
        udev->state = UIST_SETUP_COMPLETE;
670
680
                        retval = uinput_set_bit(arg, swbit, SW_MAX);
671
681
                        break;
672
682
 
 
683
                case UI_SET_PROPBIT:
 
684
                        retval = uinput_set_bit(arg, propbit, INPUT_PROP_MAX);
 
685
                        break;
 
686
 
673
687
                case UI_SET_PHYS:
674
688
                        if (udev->state == UIST_CREATED) {
675
689
                                retval = -EINVAL;
801
815
#ifdef CONFIG_COMPAT
802
816
        .compat_ioctl   = uinput_compat_ioctl,
803
817
#endif
 
818
        .llseek         = no_llseek,
804
819
};
805
820
 
806
821
static struct miscdevice uinput_misc = {
808
823
        .minor          = UINPUT_MINOR,
809
824
        .name           = UINPUT_NAME,
810
825
};
 
826
MODULE_ALIAS_MISCDEV(UINPUT_MINOR);
 
827
MODULE_ALIAS("devname:" UINPUT_NAME);
811
828
 
812
829
static int __init uinput_init(void)
813
830
{