diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-14 14:13:54 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-14 14:13:54 -0400 |
| commit | a818d8e43147f40864363456b37a00b819439307 (patch) | |
| tree | c0a5139116747c2240f94c024e247a4efd1791c6 | |
| parent | f901e753923192a7793e5d7591e2c03dcb252d68 (diff) | |
| parent | 31968ecf584330b51a25b7bf881c2b632a02a3fb (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
Input: i8042 - add ALDI/MEDION netbook E1222 to qurik reset table
Input: ALPS - fix stuck buttons on some touchpads
Input: wm831x-on - convert to use genirq
Input: ads7846 - add wakeup support
Input: appletouch - fix integer overflow issue
Input: ad7877 - increase pen up imeout
Input: ads7846 - add support for AD7843 parts
Input: bf54x-keys - fix system hang when pressing a key
Input: alps - add support for the touchpad on Toshiba Tecra A11-11L
Input: remove BKL, fix input_open_file() locking
Input: serio_raw - remove BKL
Input: mousedev - remove BKL
Input: add driver for TWL4030 vibrator device
Input: enable remote wakeup for PNP i8042 keyboard ports
Input: scancode in get/set_keycodes should be unsigned
Input: i8042 - use platfrom_create_bundle() helper
Input: wacom - merge out and in prox events
Input: gamecon - fix off by one range check
Input: wacom - replace WACOM_PKGLEN_PENABLED
33 files changed, 549 insertions, 283 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 79d9edd0bdfa..7a0d2e4661a1 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
| @@ -68,22 +68,25 @@ static const struct { | |||
| 68 | #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \ | 68 | #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \ |
| 69 | &max, EV_KEY, (c)) | 69 | &max, EV_KEY, (c)) |
| 70 | 70 | ||
| 71 | static inline int match_scancode(int code, int scancode) | 71 | static inline int match_scancode(unsigned int code, unsigned int scancode) |
| 72 | { | 72 | { |
| 73 | if (scancode == 0) | 73 | if (scancode == 0) |
| 74 | return 1; | 74 | return 1; |
| 75 | return ((code & (HID_USAGE_PAGE | HID_USAGE)) == scancode); | 75 | |
| 76 | return (code & (HID_USAGE_PAGE | HID_USAGE)) == scancode; | ||
| 76 | } | 77 | } |
| 77 | 78 | ||
| 78 | static inline int match_keycode(int code, int keycode) | 79 | static inline int match_keycode(unsigned int code, unsigned int keycode) |
| 79 | { | 80 | { |
| 80 | if (keycode == 0) | 81 | if (keycode == 0) |
| 81 | return 1; | 82 | return 1; |
| 82 | return (code == keycode); | 83 | |
| 84 | return code == keycode; | ||
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | static struct hid_usage *hidinput_find_key(struct hid_device *hid, | 87 | static struct hid_usage *hidinput_find_key(struct hid_device *hid, |
| 86 | int scancode, int keycode) | 88 | unsigned int scancode, |
| 89 | unsigned int keycode) | ||
| 87 | { | 90 | { |
| 88 | int i, j, k; | 91 | int i, j, k; |
| 89 | struct hid_report *report; | 92 | struct hid_report *report; |
| @@ -105,8 +108,8 @@ static struct hid_usage *hidinput_find_key(struct hid_device *hid, | |||
| 105 | return NULL; | 108 | return NULL; |
| 106 | } | 109 | } |
| 107 | 110 | ||
| 108 | static int hidinput_getkeycode(struct input_dev *dev, int scancode, | 111 | static int hidinput_getkeycode(struct input_dev *dev, |
| 109 | int *keycode) | 112 | unsigned int scancode, unsigned int *keycode) |
| 110 | { | 113 | { |
| 111 | struct hid_device *hid = input_get_drvdata(dev); | 114 | struct hid_device *hid = input_get_drvdata(dev); |
| 112 | struct hid_usage *usage; | 115 | struct hid_usage *usage; |
| @@ -119,16 +122,13 @@ static int hidinput_getkeycode(struct input_dev *dev, int scancode, | |||
| 119 | return -EINVAL; | 122 | return -EINVAL; |
| 120 | } | 123 | } |
| 121 | 124 | ||
| 122 | static int hidinput_setkeycode(struct input_dev *dev, int scancode, | 125 | static int hidinput_setkeycode(struct input_dev *dev, |
| 123 | int keycode) | 126 | unsigned int scancode, unsigned int keycode) |
| 124 | { | 127 | { |
| 125 | struct hid_device *hid = input_get_drvdata(dev); | 128 | struct hid_device *hid = input_get_drvdata(dev); |
| 126 | struct hid_usage *usage; | 129 | struct hid_usage *usage; |
| 127 | int old_keycode; | 130 | int old_keycode; |
| 128 | 131 | ||
| 129 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 130 | return -EINVAL; | ||
| 131 | |||
| 132 | usage = hidinput_find_key(hid, scancode, 0); | 132 | usage = hidinput_find_key(hid, scancode, 0); |
| 133 | if (usage) { | 133 | if (usage) { |
| 134 | old_keycode = usage->code; | 134 | old_keycode = usage->code; |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 9f9816baeb97..2ee6c7a68bdc 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
| @@ -515,7 +515,7 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
| 515 | struct input_absinfo abs; | 515 | struct input_absinfo abs; |
| 516 | struct ff_effect effect; | 516 | struct ff_effect effect; |
| 517 | int __user *ip = (int __user *)p; | 517 | int __user *ip = (int __user *)p; |
| 518 | int i, t, u, v; | 518 | unsigned int i, t, u, v; |
| 519 | int error; | 519 | int error; |
| 520 | 520 | ||
| 521 | switch (cmd) { | 521 | switch (cmd) { |
diff --git a/drivers/input/input.c b/drivers/input/input.c index 41168d5f8c17..e2aad0a51826 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
| @@ -582,7 +582,8 @@ static int input_fetch_keycode(struct input_dev *dev, int scancode) | |||
| 582 | } | 582 | } |
| 583 | 583 | ||
| 584 | static int input_default_getkeycode(struct input_dev *dev, | 584 | static int input_default_getkeycode(struct input_dev *dev, |
| 585 | int scancode, int *keycode) | 585 | unsigned int scancode, |
| 586 | unsigned int *keycode) | ||
| 586 | { | 587 | { |
| 587 | if (!dev->keycodesize) | 588 | if (!dev->keycodesize) |
| 588 | return -EINVAL; | 589 | return -EINVAL; |
| @@ -596,7 +597,8 @@ static int input_default_getkeycode(struct input_dev *dev, | |||
| 596 | } | 597 | } |
| 597 | 598 | ||
| 598 | static int input_default_setkeycode(struct input_dev *dev, | 599 | static int input_default_setkeycode(struct input_dev *dev, |
| 599 | int scancode, int keycode) | 600 | unsigned int scancode, |
| 601 | unsigned int keycode) | ||
| 600 | { | 602 | { |
| 601 | int old_keycode; | 603 | int old_keycode; |
| 602 | int i; | 604 | int i; |
| @@ -654,11 +656,9 @@ static int input_default_setkeycode(struct input_dev *dev, | |||
| 654 | * This function should be called by anyone interested in retrieving current | 656 | * This function should be called by anyone interested in retrieving current |
| 655 | * keymap. Presently keyboard and evdev handlers use it. | 657 | * keymap. Presently keyboard and evdev handlers use it. |
| 656 | */ | 658 | */ |
| 657 | int input_get_keycode(struct input_dev *dev, int scancode, int *keycode) | 659 | int input_get_keycode(struct input_dev *dev, |
| 660 | unsigned int scancode, unsigned int *keycode) | ||
| 658 | { | 661 | { |
| 659 | if (scancode < 0) | ||
| 660 | return -EINVAL; | ||
| 661 | |||
| 662 | return dev->getkeycode(dev, scancode, keycode); | 662 | return dev->getkeycode(dev, scancode, keycode); |
| 663 | } | 663 | } |
| 664 | EXPORT_SYMBOL(input_get_keycode); | 664 | EXPORT_SYMBOL(input_get_keycode); |
| @@ -672,16 +672,14 @@ EXPORT_SYMBOL(input_get_keycode); | |||
| 672 | * This function should be called by anyone needing to update current | 672 | * This function should be called by anyone needing to update current |
| 673 | * keymap. Presently keyboard and evdev handlers use it. | 673 | * keymap. Presently keyboard and evdev handlers use it. |
| 674 | */ | 674 | */ |
| 675 | int input_set_keycode(struct input_dev *dev, int scancode, int keycode) | 675 | int input_set_keycode(struct input_dev *dev, |
| 676 | unsigned int scancode, unsigned int keycode) | ||
| 676 | { | 677 | { |
| 677 | unsigned long flags; | 678 | unsigned long flags; |
| 678 | int old_keycode; | 679 | int old_keycode; |
| 679 | int retval; | 680 | int retval; |
| 680 | 681 | ||
| 681 | if (scancode < 0) | 682 | if (keycode > KEY_MAX) |
| 682 | return -EINVAL; | ||
| 683 | |||
| 684 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 685 | return -EINVAL; | 683 | return -EINVAL; |
| 686 | 684 | ||
| 687 | spin_lock_irqsave(&dev->event_lock, flags); | 685 | spin_lock_irqsave(&dev->event_lock, flags); |
| @@ -1881,35 +1879,37 @@ static int input_open_file(struct inode *inode, struct file *file) | |||
| 1881 | const struct file_operations *old_fops, *new_fops = NULL; | 1879 | const struct file_operations *old_fops, *new_fops = NULL; |
| 1882 | int err; | 1880 | int err; |
| 1883 | 1881 | ||
| 1884 | lock_kernel(); | 1882 | err = mutex_lock_interruptible(&input_mutex); |
| 1883 | if (err) | ||
| 1884 | return err; | ||
| 1885 | |||
| 1885 | /* No load-on-demand here? */ | 1886 | /* No load-on-demand here? */ |
| 1886 | handler = input_table[iminor(inode) >> 5]; | 1887 | handler = input_table[iminor(inode) >> 5]; |
| 1887 | if (!handler || !(new_fops = fops_get(handler->fops))) { | 1888 | if (handler) |
| 1888 | err = -ENODEV; | 1889 | new_fops = fops_get(handler->fops); |
| 1889 | goto out; | 1890 | |
| 1890 | } | 1891 | mutex_unlock(&input_mutex); |
| 1891 | 1892 | ||
| 1892 | /* | 1893 | /* |
| 1893 | * That's _really_ odd. Usually NULL ->open means "nothing special", | 1894 | * That's _really_ odd. Usually NULL ->open means "nothing special", |
| 1894 | * not "no device". Oh, well... | 1895 | * not "no device". Oh, well... |
| 1895 | */ | 1896 | */ |
| 1896 | if (!new_fops->open) { | 1897 | if (!new_fops || !new_fops->open) { |
| 1897 | fops_put(new_fops); | 1898 | fops_put(new_fops); |
| 1898 | err = -ENODEV; | 1899 | err = -ENODEV; |
| 1899 | goto out; | 1900 | goto out; |
| 1900 | } | 1901 | } |
| 1902 | |||
| 1901 | old_fops = file->f_op; | 1903 | old_fops = file->f_op; |
| 1902 | file->f_op = new_fops; | 1904 | file->f_op = new_fops; |
| 1903 | 1905 | ||
| 1904 | err = new_fops->open(inode, file); | 1906 | err = new_fops->open(inode, file); |
| 1905 | |||
| 1906 | if (err) { | 1907 | if (err) { |
| 1907 | fops_put(file->f_op); | 1908 | fops_put(file->f_op); |
| 1908 | file->f_op = fops_get(old_fops); | 1909 | file->f_op = fops_get(old_fops); |
| 1909 | } | 1910 | } |
| 1910 | fops_put(old_fops); | 1911 | fops_put(old_fops); |
| 1911 | out: | 1912 | out: |
| 1912 | unlock_kernel(); | ||
| 1913 | return err; | 1913 | return err; |
| 1914 | } | 1914 | } |
| 1915 | 1915 | ||
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index ae998d99a5ae..7a55714a1486 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c | |||
| @@ -819,7 +819,7 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | |||
| 819 | int i; | 819 | int i; |
| 820 | int err; | 820 | int err; |
| 821 | 821 | ||
| 822 | if (pad_type < 1 || pad_type > GC_MAX) { | 822 | if (pad_type < 1 || pad_type >= GC_MAX) { |
| 823 | pr_err("Pad type %d unknown\n", pad_type); | 823 | pr_err("Pad type %d unknown\n", pad_type); |
| 824 | return -EINVAL; | 824 | return -EINVAL; |
| 825 | } | 825 | } |
diff --git a/drivers/input/keyboard/bf54x-keys.c b/drivers/input/keyboard/bf54x-keys.c index fe376a27fe57..593c052416b9 100644 --- a/drivers/input/keyboard/bf54x-keys.c +++ b/drivers/input/keyboard/bf54x-keys.c | |||
| @@ -162,7 +162,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id) | |||
| 162 | input_sync(input); | 162 | input_sync(input); |
| 163 | 163 | ||
| 164 | if (bfin_kpad_get_keypressed(bf54x_kpad)) { | 164 | if (bfin_kpad_get_keypressed(bf54x_kpad)) { |
| 165 | disable_irq(bf54x_kpad->irq); | 165 | disable_irq_nosync(bf54x_kpad->irq); |
| 166 | bf54x_kpad->lastkey = key; | 166 | bf54x_kpad->lastkey = key; |
| 167 | mod_timer(&bf54x_kpad->timer, | 167 | mod_timer(&bf54x_kpad->timer, |
| 168 | jiffies + bf54x_kpad->keyup_test_jiffies); | 168 | jiffies + bf54x_kpad->keyup_test_jiffies); |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 7097bfe581d7..23140a3bb8e0 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
| @@ -214,6 +214,17 @@ config INPUT_TWL4030_PWRBUTTON | |||
| 214 | To compile this driver as a module, choose M here. The module will | 214 | To compile this driver as a module, choose M here. The module will |
| 215 | be called twl4030_pwrbutton. | 215 | be called twl4030_pwrbutton. |
| 216 | 216 | ||
| 217 | config INPUT_TWL4030_VIBRA | ||
| 218 | tristate "Support for TWL4030 Vibrator" | ||
| 219 | depends on TWL4030_CORE | ||
| 220 | select TWL4030_CODEC | ||
| 221 | select INPUT_FF_MEMLESS | ||
| 222 | help | ||
| 223 | This option enables support for TWL4030 Vibrator Driver. | ||
| 224 | |||
| 225 | To compile this driver as a module, choose M here. The module will | ||
| 226 | be called twl4030_vibra. | ||
| 227 | |||
| 217 | config INPUT_UINPUT | 228 | config INPUT_UINPUT |
| 218 | tristate "User level driver support" | 229 | tristate "User level driver support" |
| 219 | help | 230 | help |
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index b611615e24ad..7e95a5d474dc 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile | |||
| @@ -26,6 +26,7 @@ obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o | |||
| 26 | obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o | 26 | obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o |
| 27 | obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o | 27 | obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o |
| 28 | obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) += twl4030-pwrbutton.o | 28 | obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) += twl4030-pwrbutton.o |
| 29 | obj-$(CONFIG_INPUT_TWL4030_VIBRA) += twl4030-vibra.o | ||
| 29 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o | 30 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o |
| 30 | obj-$(CONFIG_INPUT_WINBOND_CIR) += winbond-cir.o | 31 | obj-$(CONFIG_INPUT_WINBOND_CIR) += winbond-cir.o |
| 31 | obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o | 32 | obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o |
diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index 0501f0e65157..15be5430bc6d 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c | |||
| @@ -474,10 +474,11 @@ static void ati_remote2_complete_key(struct urb *urb) | |||
| 474 | } | 474 | } |
| 475 | 475 | ||
| 476 | static int ati_remote2_getkeycode(struct input_dev *idev, | 476 | static int ati_remote2_getkeycode(struct input_dev *idev, |
| 477 | int scancode, int *keycode) | 477 | unsigned int scancode, unsigned int *keycode) |
| 478 | { | 478 | { |
| 479 | struct ati_remote2 *ar2 = input_get_drvdata(idev); | 479 | struct ati_remote2 *ar2 = input_get_drvdata(idev); |
| 480 | int index, mode; | 480 | unsigned int mode; |
| 481 | int index; | ||
| 481 | 482 | ||
| 482 | mode = scancode >> 8; | 483 | mode = scancode >> 8; |
| 483 | if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) | 484 | if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) |
| @@ -491,10 +492,12 @@ static int ati_remote2_getkeycode(struct input_dev *idev, | |||
| 491 | return 0; | 492 | return 0; |
| 492 | } | 493 | } |
| 493 | 494 | ||
| 494 | static int ati_remote2_setkeycode(struct input_dev *idev, int scancode, int keycode) | 495 | static int ati_remote2_setkeycode(struct input_dev *idev, |
| 496 | unsigned int scancode, unsigned int keycode) | ||
| 495 | { | 497 | { |
| 496 | struct ati_remote2 *ar2 = input_get_drvdata(idev); | 498 | struct ati_remote2 *ar2 = input_get_drvdata(idev); |
| 497 | int index, mode, old_keycode; | 499 | unsigned int mode, old_keycode; |
| 500 | int index; | ||
| 498 | 501 | ||
| 499 | mode = scancode >> 8; | 502 | mode = scancode >> 8; |
| 500 | if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) | 503 | if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) |
| @@ -504,9 +507,6 @@ static int ati_remote2_setkeycode(struct input_dev *idev, int scancode, int keyc | |||
| 504 | if (index < 0) | 507 | if (index < 0) |
| 505 | return -EINVAL; | 508 | return -EINVAL; |
| 506 | 509 | ||
| 507 | if (keycode < KEY_RESERVED || keycode > KEY_MAX) | ||
| 508 | return -EINVAL; | ||
| 509 | |||
| 510 | old_keycode = ar2->keycode[mode][index]; | 510 | old_keycode = ar2->keycode[mode][index]; |
| 511 | ar2->keycode[mode][index] = keycode; | 511 | ar2->keycode[mode][index] = keycode; |
| 512 | __set_bit(keycode, idev->keybit); | 512 | __set_bit(keycode, idev->keybit); |
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c new file mode 100644 index 000000000000..2fb79e064da3 --- /dev/null +++ b/drivers/input/misc/twl4030-vibra.c | |||
| @@ -0,0 +1,297 @@ | |||
| 1 | /* | ||
| 2 | * twl4030-vibra.c - TWL4030 Vibrator driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2010 Nokia Corporation | ||
| 5 | * | ||
| 6 | * Written by Henrik Saari <henrik.saari@nokia.com> | ||
| 7 | * Updates by Felipe Balbi <felipe.balbi@nokia.com> | ||
| 8 | * Input by Jari Vanhala <ext-jari.vanhala@nokia.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, but | ||
| 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 22 | * 02110-1301 USA | ||
| 23 | * | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/module.h> | ||
| 27 | #include <linux/jiffies.h> | ||
| 28 | #include <linux/platform_device.h> | ||
| 29 | #include <linux/workqueue.h> | ||
| 30 | #include <linux/i2c/twl.h> | ||
| 31 | #include <linux/mfd/twl4030-codec.h> | ||
| 32 | #include <linux/input.h> | ||
| 33 | |||
| 34 | /* MODULE ID2 */ | ||
| 35 | #define LEDEN 0x00 | ||
| 36 | |||
| 37 | /* ForceFeedback */ | ||
| 38 | #define EFFECT_DIR_180_DEG 0x8000 /* range is 0 - 0xFFFF */ | ||
| 39 | |||
| 40 | struct vibra_info { | ||
| 41 | struct device *dev; | ||
| 42 | struct input_dev *input_dev; | ||
| 43 | |||
| 44 | struct workqueue_struct *workqueue; | ||
| 45 | struct work_struct play_work; | ||
| 46 | |||
| 47 | bool enabled; | ||
| 48 | int speed; | ||
| 49 | int direction; | ||
| 50 | |||
| 51 | bool coexist; | ||
| 52 | }; | ||
| 53 | |||
| 54 | static void vibra_disable_leds(void) | ||
| 55 | { | ||
| 56 | u8 reg; | ||
| 57 | |||
| 58 | /* Disable LEDA & LEDB, cannot be used with vibra (PWM) */ | ||
| 59 | twl_i2c_read_u8(TWL4030_MODULE_LED, ®, LEDEN); | ||
| 60 | reg &= ~0x03; | ||
| 61 | twl_i2c_write_u8(TWL4030_MODULE_LED, LEDEN, reg); | ||
| 62 | } | ||
| 63 | |||
| 64 | /* Powers H-Bridge and enables audio clk */ | ||
| 65 | static void vibra_enable(struct vibra_info *info) | ||
| 66 | { | ||
| 67 | u8 reg; | ||
| 68 | |||
| 69 | twl4030_codec_enable_resource(TWL4030_CODEC_RES_POWER); | ||
| 70 | |||
| 71 | /* turn H-Bridge on */ | ||
| 72 | twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 73 | ®, TWL4030_REG_VIBRA_CTL); | ||
| 74 | twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 75 | (reg | TWL4030_VIBRA_EN), TWL4030_REG_VIBRA_CTL); | ||
| 76 | |||
| 77 | twl4030_codec_enable_resource(TWL4030_CODEC_RES_APLL); | ||
| 78 | |||
| 79 | info->enabled = true; | ||
| 80 | } | ||
| 81 | |||
| 82 | static void vibra_disable(struct vibra_info *info) | ||
| 83 | { | ||
| 84 | u8 reg; | ||
| 85 | |||
| 86 | /* Power down H-Bridge */ | ||
| 87 | twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 88 | ®, TWL4030_REG_VIBRA_CTL); | ||
| 89 | twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 90 | (reg & ~TWL4030_VIBRA_EN), TWL4030_REG_VIBRA_CTL); | ||
| 91 | |||
| 92 | twl4030_codec_disable_resource(TWL4030_CODEC_RES_POWER); | ||
| 93 | twl4030_codec_disable_resource(TWL4030_CODEC_RES_APLL); | ||
| 94 | |||
| 95 | info->enabled = false; | ||
| 96 | } | ||
| 97 | |||
| 98 | static void vibra_play_work(struct work_struct *work) | ||
| 99 | { | ||
| 100 | struct vibra_info *info = container_of(work, | ||
| 101 | struct vibra_info, play_work); | ||
| 102 | int dir; | ||
| 103 | int pwm; | ||
| 104 | u8 reg; | ||
| 105 | |||
| 106 | dir = info->direction; | ||
| 107 | pwm = info->speed; | ||
| 108 | |||
| 109 | twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 110 | ®, TWL4030_REG_VIBRA_CTL); | ||
| 111 | if (pwm && (!info->coexist || !(reg & TWL4030_VIBRA_SEL))) { | ||
| 112 | |||
| 113 | if (!info->enabled) | ||
| 114 | vibra_enable(info); | ||
| 115 | |||
| 116 | /* set vibra rotation direction */ | ||
| 117 | twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 118 | ®, TWL4030_REG_VIBRA_CTL); | ||
| 119 | reg = (dir) ? (reg | TWL4030_VIBRA_DIR) : | ||
| 120 | (reg & ~TWL4030_VIBRA_DIR); | ||
| 121 | twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 122 | reg, TWL4030_REG_VIBRA_CTL); | ||
| 123 | |||
| 124 | /* set PWM, 1 = max, 255 = min */ | ||
| 125 | twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, | ||
| 126 | 256 - pwm, TWL4030_REG_VIBRA_SET); | ||
| 127 | } else { | ||
| 128 | if (info->enabled) | ||
| 129 | vibra_disable(info); | ||
| 130 | } | ||
| 131 | } | ||
| 132 | |||
| 133 | /*** Input/ForceFeedback ***/ | ||
| 134 | |||
| 135 | static int vibra_play(struct input_dev *input, void *data, | ||
| 136 | struct ff_effect *effect) | ||
| 137 | { | ||
| 138 | struct vibra_info *info = input_get_drvdata(input); | ||
| 139 | |||
| 140 | info->speed = effect->u.rumble.strong_magnitude >> 8; | ||
| 141 | if (!info->speed) | ||
| 142 | info->speed = effect->u.rumble.weak_magnitude >> 9; | ||
| 143 | info->direction = effect->direction < EFFECT_DIR_180_DEG ? 0 : 1; | ||
| 144 | queue_work(info->workqueue, &info->play_work); | ||
| 145 | return 0; | ||
| 146 | } | ||
| 147 | |||
| 148 | static int twl4030_vibra_open(struct input_dev *input) | ||
| 149 | { | ||
| 150 | struct vibra_info *info = input_get_drvdata(input); | ||
| 151 | |||
| 152 | info->workqueue = create_singlethread_workqueue("vibra"); | ||
| 153 | if (info->workqueue == NULL) { | ||
| 154 | dev_err(&input->dev, "couldn't create workqueue\n"); | ||
| 155 | return -ENOMEM; | ||
| 156 | } | ||
| 157 | return 0; | ||
| 158 | } | ||
| 159 | |||
| 160 | static void twl4030_vibra_close(struct input_dev *input) | ||
| 161 | { | ||
| 162 | struct vibra_info *info = input_get_drvdata(input); | ||
| 163 | |||
| 164 | cancel_work_sync(&info->play_work); | ||
| 165 | INIT_WORK(&info->play_work, vibra_play_work); /* cleanup */ | ||
| 166 | destroy_workqueue(info->workqueue); | ||
| 167 | info->workqueue = NULL; | ||
| 168 | |||
| 169 | if (info->enabled) | ||
| 170 | vibra_disable(info); | ||
| 171 | } | ||
| 172 | |||
| 173 | /*** Module ***/ | ||
| 174 | #if CONFIG_PM | ||
| 175 | static int twl4030_vibra_suspend(struct device *dev) | ||
| 176 | { | ||
| 177 | struct platform_device *pdev = to_platform_device(dev); | ||
| 178 | struct vibra_info *info = platform_get_drvdata(pdev); | ||
| 179 | |||
| 180 | if (info->enabled) | ||
| 181 | vibra_disable(info); | ||
| 182 | |||
| 183 | return 0; | ||
| 184 | } | ||
| 185 | |||
| 186 | static int twl4030_vibra_resume(struct device *dev) | ||
| 187 | { | ||
| 188 | vibra_disable_leds(); | ||
| 189 | return 0; | ||
| 190 | } | ||
| 191 | |||
| 192 | static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, | ||
| 193 | twl4030_vibra_suspend, twl4030_vibra_resume); | ||
| 194 | #endif | ||
| 195 | |||
| 196 | static int __devinit twl4030_vibra_probe(struct platform_device *pdev) | ||
| 197 | { | ||
| 198 | struct twl4030_codec_vibra_data *pdata = pdev->dev.platform_data; | ||
| 199 | struct vibra_info *info; | ||
| 200 | int ret; | ||
| 201 | |||
| 202 | if (!pdata) { | ||
| 203 | dev_dbg(&pdev->dev, "platform_data not available\n"); | ||
| 204 | return -EINVAL; | ||
| 205 | } | ||
| 206 | |||
| 207 | info = kzalloc(sizeof(*info), GFP_KERNEL); | ||
| 208 | if (!info) | ||
| 209 | return -ENOMEM; | ||
| 210 | |||
| 211 | info->dev = &pdev->dev; | ||
| 212 | info->coexist = pdata->coexist; | ||
| 213 | INIT_WORK(&info->play_work, vibra_play_work); | ||
| 214 | |||
| 215 | info->input_dev = input_allocate_device(); | ||
| 216 | if (info->input_dev == NULL) { | ||
| 217 | dev_err(&pdev->dev, "couldn't allocate input device\n"); | ||
| 218 | ret = -ENOMEM; | ||
| 219 | goto err_kzalloc; | ||
| 220 | } | ||
| 221 | |||
| 222 | input_set_drvdata(info->input_dev, info); | ||
| 223 | |||
| 224 | info->input_dev->name = "twl4030:vibrator"; | ||
| 225 | info->input_dev->id.version = 1; | ||
| 226 | info->input_dev->dev.parent = pdev->dev.parent; | ||
| 227 | info->input_dev->open = twl4030_vibra_open; | ||
| 228 | info->input_dev->close = twl4030_vibra_close; | ||
| 229 | __set_bit(FF_RUMBLE, info->input_dev->ffbit); | ||
| 230 | |||
| 231 | ret = input_ff_create_memless(info->input_dev, NULL, vibra_play); | ||
| 232 | if (ret < 0) { | ||
| 233 | dev_dbg(&pdev->dev, "couldn't register vibrator to FF\n"); | ||
| 234 | goto err_ialloc; | ||
| 235 | } | ||
| 236 | |||
| 237 | ret = input_register_device(info->input_dev); | ||
| 238 | if (ret < 0) { | ||
| 239 | dev_dbg(&pdev->dev, "couldn't register input device\n"); | ||
| 240 | goto err_iff; | ||
| 241 | } | ||
| 242 | |||
| 243 | vibra_disable_leds(); | ||
| 244 | |||
| 245 | platform_set_drvdata(pdev, info); | ||
| 246 | return 0; | ||
| 247 | |||
| 248 | err_iff: | ||
| 249 | input_ff_destroy(info->input_dev); | ||
| 250 | err_ialloc: | ||
| 251 | input_free_device(info->input_dev); | ||
| 252 | err_kzalloc: | ||
| 253 | kfree(info); | ||
| 254 | return ret; | ||
| 255 | } | ||
| 256 | |||
| 257 | static int __devexit twl4030_vibra_remove(struct platform_device *pdev) | ||
| 258 | { | ||
| 259 | struct vibra_info *info = platform_get_drvdata(pdev); | ||
| 260 | |||
| 261 | /* this also free ff-memless and calls close if needed */ | ||
| 262 | input_unregister_device(info->input_dev); | ||
| 263 | kfree(info); | ||
| 264 | platform_set_drvdata(pdev, NULL); | ||
| 265 | |||
| 266 | return 0; | ||
| 267 | } | ||
| 268 | |||
| 269 | static struct platform_driver twl4030_vibra_driver = { | ||
| 270 | .probe = twl4030_vibra_probe, | ||
| 271 | .remove = __devexit_p(twl4030_vibra_remove), | ||
| 272 | .driver = { | ||
| 273 | .name = "twl4030_codec_vibra", | ||
| 274 | .owner = THIS_MODULE, | ||
| 275 | #ifdef CONFIG_PM | ||
| 276 | .pm = &twl4030_vibra_pm_ops, | ||
| 277 | #endif | ||
| 278 | }, | ||
| 279 | }; | ||
| 280 | |||
| 281 | static int __init twl4030_vibra_init(void) | ||
| 282 | { | ||
| 283 | return platform_driver_register(&twl4030_vibra_driver); | ||
| 284 | } | ||
| 285 | module_init(twl4030_vibra_init); | ||
| 286 | |||
| 287 | static void __exit twl4030_vibra_exit(void) | ||
| 288 | { | ||
| 289 | platform_driver_unregister(&twl4030_vibra_driver); | ||
| 290 | } | ||
| 291 | module_exit(twl4030_vibra_exit); | ||
| 292 | |||
| 293 | MODULE_ALIAS("platform:twl4030_codec_vibra"); | ||
| 294 | |||
| 295 | MODULE_DESCRIPTION("TWL4030 Vibra driver"); | ||
| 296 | MODULE_LICENSE("GPL"); | ||
| 297 | MODULE_AUTHOR("Nokia Corporation"); | ||
diff --git a/drivers/input/misc/winbond-cir.c b/drivers/input/misc/winbond-cir.c index cbec3dfdd42b..9c155a43abc2 100644 --- a/drivers/input/misc/winbond-cir.c +++ b/drivers/input/misc/winbond-cir.c | |||
| @@ -385,26 +385,24 @@ wbcir_do_getkeycode(struct wbcir_data *data, u32 scancode) | |||
| 385 | } | 385 | } |
| 386 | 386 | ||
| 387 | static int | 387 | static int |
| 388 | wbcir_getkeycode(struct input_dev *dev, int scancode, int *keycode) | 388 | wbcir_getkeycode(struct input_dev *dev, |
| 389 | unsigned int scancode, unsigned int *keycode) | ||
| 389 | { | 390 | { |
| 390 | struct wbcir_data *data = input_get_drvdata(dev); | 391 | struct wbcir_data *data = input_get_drvdata(dev); |
| 391 | 392 | ||
| 392 | *keycode = (int)wbcir_do_getkeycode(data, (u32)scancode); | 393 | *keycode = wbcir_do_getkeycode(data, scancode); |
| 393 | return 0; | 394 | return 0; |
| 394 | } | 395 | } |
| 395 | 396 | ||
| 396 | static int | 397 | static int |
| 397 | wbcir_setkeycode(struct input_dev *dev, int sscancode, int keycode) | 398 | wbcir_setkeycode(struct input_dev *dev, |
| 399 | unsigned int scancode, unsigned int keycode) | ||
| 398 | { | 400 | { |
| 399 | struct wbcir_data *data = input_get_drvdata(dev); | 401 | struct wbcir_data *data = input_get_drvdata(dev); |
| 400 | struct wbcir_keyentry *keyentry; | 402 | struct wbcir_keyentry *keyentry; |
| 401 | struct wbcir_keyentry *new_keyentry; | 403 | struct wbcir_keyentry *new_keyentry; |
| 402 | unsigned long flags; | 404 | unsigned long flags; |
| 403 | unsigned int old_keycode = KEY_RESERVED; | 405 | unsigned int old_keycode = KEY_RESERVED; |
| 404 | u32 scancode = (u32)sscancode; | ||
| 405 | |||
| 406 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 407 | return -EINVAL; | ||
| 408 | 406 | ||
| 409 | new_keyentry = kmalloc(sizeof(*new_keyentry), GFP_KERNEL); | 407 | new_keyentry = kmalloc(sizeof(*new_keyentry), GFP_KERNEL); |
| 410 | if (!new_keyentry) | 408 | if (!new_keyentry) |
diff --git a/drivers/input/misc/wm831x-on.c b/drivers/input/misc/wm831x-on.c index ba4f5dd7c60e..1e54bce72db5 100644 --- a/drivers/input/misc/wm831x-on.c +++ b/drivers/input/misc/wm831x-on.c | |||
| @@ -97,8 +97,9 @@ static int __devinit wm831x_on_probe(struct platform_device *pdev) | |||
| 97 | wm831x_on->dev->phys = "wm831x_on/input0"; | 97 | wm831x_on->dev->phys = "wm831x_on/input0"; |
| 98 | wm831x_on->dev->dev.parent = &pdev->dev; | 98 | wm831x_on->dev->dev.parent = &pdev->dev; |
| 99 | 99 | ||
| 100 | ret = wm831x_request_irq(wm831x, irq, wm831x_on_irq, | 100 | ret = request_threaded_irq(irq, NULL, wm831x_on_irq, |
| 101 | IRQF_TRIGGER_RISING, "wm831x_on", wm831x_on); | 101 | IRQF_TRIGGER_RISING, "wm831x_on", |
| 102 | wm831x_on); | ||
| 102 | if (ret < 0) { | 103 | if (ret < 0) { |
| 103 | dev_err(&pdev->dev, "Unable to request IRQ: %d\n", ret); | 104 | dev_err(&pdev->dev, "Unable to request IRQ: %d\n", ret); |
| 104 | goto err_input_dev; | 105 | goto err_input_dev; |
| @@ -114,7 +115,7 @@ static int __devinit wm831x_on_probe(struct platform_device *pdev) | |||
| 114 | return 0; | 115 | return 0; |
| 115 | 116 | ||
| 116 | err_irq: | 117 | err_irq: |
| 117 | wm831x_free_irq(wm831x, irq, NULL); | 118 | free_irq(irq, wm831x_on); |
| 118 | err_input_dev: | 119 | err_input_dev: |
| 119 | input_free_device(wm831x_on->dev); | 120 | input_free_device(wm831x_on->dev); |
| 120 | err: | 121 | err: |
| @@ -127,7 +128,7 @@ static int __devexit wm831x_on_remove(struct platform_device *pdev) | |||
| 127 | struct wm831x_on *wm831x_on = platform_get_drvdata(pdev); | 128 | struct wm831x_on *wm831x_on = platform_get_drvdata(pdev); |
| 128 | int irq = platform_get_irq(pdev, 0); | 129 | int irq = platform_get_irq(pdev, 0); |
| 129 | 130 | ||
| 130 | wm831x_free_irq(wm831x_on->wm831x, irq, wm831x_on); | 131 | free_irq(irq, wm831x_on); |
| 131 | cancel_delayed_work_sync(&wm831x_on->work); | 132 | cancel_delayed_work_sync(&wm831x_on->work); |
| 132 | input_unregister_device(wm831x_on->dev); | 133 | input_unregister_device(wm831x_on->dev); |
| 133 | kfree(wm831x_on); | 134 | kfree(wm831x_on); |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index f93c2c0daf1f..7490f1da4a53 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
| @@ -63,6 +63,8 @@ static const struct alps_model_info alps_model_data[] = { | |||
| 63 | { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, | 63 | { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, |
| 64 | ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, | 64 | ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, |
| 65 | { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */ | 65 | { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */ |
| 66 | { { 0x52, 0x01, 0x14 }, 0xff, 0xff, | ||
| 67 | ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */ | ||
| 66 | }; | 68 | }; |
| 67 | 69 | ||
| 68 | /* | 70 | /* |
| @@ -118,40 +120,27 @@ static void alps_report_buttons(struct psmouse *psmouse, | |||
| 118 | struct input_dev *dev1, struct input_dev *dev2, | 120 | struct input_dev *dev1, struct input_dev *dev2, |
| 119 | int left, int right, int middle) | 121 | int left, int right, int middle) |
| 120 | { | 122 | { |
| 121 | struct alps_data *priv = psmouse->private; | 123 | struct input_dev *dev; |
| 122 | const struct alps_model_info *model = priv->i; | ||
| 123 | |||
| 124 | if (model->flags & ALPS_PS2_INTERLEAVED) { | ||
| 125 | struct input_dev *dev; | ||
| 126 | 124 | ||
| 127 | /* | 125 | /* |
| 128 | * If shared button has already been reported on the | 126 | * If shared button has already been reported on the |
| 129 | * other device (dev2) then this event should be also | 127 | * other device (dev2) then this event should be also |
| 130 | * sent through that device. | 128 | * sent through that device. |
| 131 | */ | 129 | */ |
| 132 | dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1; | 130 | dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1; |
| 133 | input_report_key(dev, BTN_LEFT, left); | 131 | input_report_key(dev, BTN_LEFT, left); |
| 134 | 132 | ||
| 135 | dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1; | 133 | dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1; |
| 136 | input_report_key(dev, BTN_RIGHT, right); | 134 | input_report_key(dev, BTN_RIGHT, right); |
| 137 | 135 | ||
| 138 | dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1; | 136 | dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1; |
| 139 | input_report_key(dev, BTN_MIDDLE, middle); | 137 | input_report_key(dev, BTN_MIDDLE, middle); |
| 140 | 138 | ||
| 141 | /* | 139 | /* |
| 142 | * Sync the _other_ device now, we'll do the first | 140 | * Sync the _other_ device now, we'll do the first |
| 143 | * device later once we report the rest of the events. | 141 | * device later once we report the rest of the events. |
| 144 | */ | 142 | */ |
| 145 | input_sync(dev2); | 143 | input_sync(dev2); |
| 146 | } else { | ||
| 147 | /* | ||
| 148 | * For devices with non-interleaved packets we know what | ||
| 149 | * device buttons belong to so we can simply report them. | ||
| 150 | */ | ||
| 151 | input_report_key(dev1, BTN_LEFT, left); | ||
| 152 | input_report_key(dev1, BTN_RIGHT, right); | ||
| 153 | input_report_key(dev1, BTN_MIDDLE, middle); | ||
| 154 | } | ||
| 155 | } | 144 | } |
| 156 | 145 | ||
| 157 | static void alps_process_packet(struct psmouse *psmouse) | 146 | static void alps_process_packet(struct psmouse *psmouse) |
diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c index 908b5b44052f..53ec7ddd1826 100644 --- a/drivers/input/mouse/appletouch.c +++ b/drivers/input/mouse/appletouch.c | |||
| @@ -205,8 +205,8 @@ struct atp { | |||
| 205 | bool overflow_warned; | 205 | bool overflow_warned; |
| 206 | int x_old; /* last reported x/y, */ | 206 | int x_old; /* last reported x/y, */ |
| 207 | int y_old; /* used for smoothing */ | 207 | int y_old; /* used for smoothing */ |
| 208 | signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; | 208 | u8 xy_cur[ATP_XSENSORS + ATP_YSENSORS]; |
| 209 | signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; | 209 | u8 xy_old[ATP_XSENSORS + ATP_YSENSORS]; |
| 210 | int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; | 210 | int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; |
| 211 | int idlecount; /* number of empty packets */ | 211 | int idlecount; /* number of empty packets */ |
| 212 | struct work_struct work; | 212 | struct work_struct work; |
| @@ -531,7 +531,7 @@ static void atp_complete_geyser_1_2(struct urb *urb) | |||
| 531 | 531 | ||
| 532 | for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) { | 532 | for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) { |
| 533 | /* accumulate the change */ | 533 | /* accumulate the change */ |
| 534 | signed char change = dev->xy_old[i] - dev->xy_cur[i]; | 534 | int change = dev->xy_old[i] - dev->xy_cur[i]; |
| 535 | dev->xy_acc[i] -= change; | 535 | dev->xy_acc[i] -= change; |
| 536 | 536 | ||
| 537 | /* prevent down drifting */ | 537 | /* prevent down drifting */ |
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c index a13d80f7da17..f34b22bce4ff 100644 --- a/drivers/input/mousedev.c +++ b/drivers/input/mousedev.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
| 17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
| 18 | #include <linux/smp_lock.h> | ||
| 19 | #include <linux/poll.h> | 18 | #include <linux/poll.h> |
| 20 | #include <linux/module.h> | 19 | #include <linux/module.h> |
| 21 | #include <linux/init.h> | 20 | #include <linux/init.h> |
| @@ -542,10 +541,8 @@ static int mousedev_open(struct inode *inode, struct file *file) | |||
| 542 | if (i >= MOUSEDEV_MINORS) | 541 | if (i >= MOUSEDEV_MINORS) |
| 543 | return -ENODEV; | 542 | return -ENODEV; |
| 544 | 543 | ||
| 545 | lock_kernel(); | ||
| 546 | error = mutex_lock_interruptible(&mousedev_table_mutex); | 544 | error = mutex_lock_interruptible(&mousedev_table_mutex); |
| 547 | if (error) { | 545 | if (error) { |
| 548 | unlock_kernel(); | ||
| 549 | return error; | 546 | return error; |
| 550 | } | 547 | } |
| 551 | mousedev = mousedev_table[i]; | 548 | mousedev = mousedev_table[i]; |
| @@ -554,7 +551,6 @@ static int mousedev_open(struct inode *inode, struct file *file) | |||
| 554 | mutex_unlock(&mousedev_table_mutex); | 551 | mutex_unlock(&mousedev_table_mutex); |
| 555 | 552 | ||
| 556 | if (!mousedev) { | 553 | if (!mousedev) { |
| 557 | unlock_kernel(); | ||
| 558 | return -ENODEV; | 554 | return -ENODEV; |
| 559 | } | 555 | } |
| 560 | 556 | ||
| @@ -575,7 +571,6 @@ static int mousedev_open(struct inode *inode, struct file *file) | |||
| 575 | goto err_free_client; | 571 | goto err_free_client; |
| 576 | 572 | ||
| 577 | file->private_data = client; | 573 | file->private_data = client; |
| 578 | unlock_kernel(); | ||
| 579 | return 0; | 574 | return 0; |
| 580 | 575 | ||
| 581 | err_free_client: | 576 | err_free_client: |
| @@ -583,7 +578,6 @@ static int mousedev_open(struct inode *inode, struct file *file) | |||
| 583 | kfree(client); | 578 | kfree(client); |
| 584 | err_put_mousedev: | 579 | err_put_mousedev: |
| 585 | put_device(&mousedev->dev); | 580 | put_device(&mousedev->dev); |
| 586 | unlock_kernel(); | ||
| 587 | return error; | 581 | return error; |
| 588 | } | 582 | } |
| 589 | 583 | ||
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 2a5982e532f8..ead0494721d0 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -442,6 +442,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { | |||
| 442 | }, | 442 | }, |
| 443 | }, | 443 | }, |
| 444 | { | 444 | { |
| 445 | /* Medion Akoya E1222 */ | ||
| 446 | .matches = { | ||
| 447 | DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), | ||
| 448 | DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), | ||
| 449 | }, | ||
| 450 | }, | ||
| 451 | { | ||
| 445 | /* Mivvy M310 */ | 452 | /* Mivvy M310 */ |
| 446 | .matches = { | 453 | .matches = { |
| 447 | DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), | 454 | DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), |
| @@ -624,6 +631,9 @@ static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id * | |||
| 624 | strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); | 631 | strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); |
| 625 | } | 632 | } |
| 626 | 633 | ||
| 634 | /* Keyboard ports are always supposed to be wakeup-enabled */ | ||
| 635 | device_set_wakeup_enable(&dev->dev, true); | ||
| 636 | |||
| 627 | i8042_pnp_kbd_devices++; | 637 | i8042_pnp_kbd_devices++; |
| 628 | return 0; | 638 | return 0; |
| 629 | } | 639 | } |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index ff4d77c4de11..9302ba0e48f8 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
| @@ -1386,6 +1386,8 @@ static int __init i8042_probe(struct platform_device *dev) | |||
| 1386 | { | 1386 | { |
| 1387 | int error; | 1387 | int error; |
| 1388 | 1388 | ||
| 1389 | i8042_platform_device = dev; | ||
| 1390 | |||
| 1389 | error = i8042_controller_selftest(); | 1391 | error = i8042_controller_selftest(); |
| 1390 | if (error) | 1392 | if (error) |
| 1391 | return error; | 1393 | return error; |
| @@ -1421,6 +1423,7 @@ static int __init i8042_probe(struct platform_device *dev) | |||
| 1421 | i8042_free_aux_ports(); /* in case KBD failed but AUX not */ | 1423 | i8042_free_aux_ports(); /* in case KBD failed but AUX not */ |
| 1422 | i8042_free_irqs(); | 1424 | i8042_free_irqs(); |
| 1423 | i8042_controller_reset(); | 1425 | i8042_controller_reset(); |
| 1426 | i8042_platform_device = NULL; | ||
| 1424 | 1427 | ||
| 1425 | return error; | 1428 | return error; |
| 1426 | } | 1429 | } |
| @@ -1430,6 +1433,7 @@ static int __devexit i8042_remove(struct platform_device *dev) | |||
| 1430 | i8042_unregister_ports(); | 1433 | i8042_unregister_ports(); |
| 1431 | i8042_free_irqs(); | 1434 | i8042_free_irqs(); |
| 1432 | i8042_controller_reset(); | 1435 | i8042_controller_reset(); |
| 1436 | i8042_platform_device = NULL; | ||
| 1433 | 1437 | ||
| 1434 | return 0; | 1438 | return 0; |
| 1435 | } | 1439 | } |
| @@ -1448,6 +1452,7 @@ static struct platform_driver i8042_driver = { | |||
| 1448 | 1452 | ||
| 1449 | static int __init i8042_init(void) | 1453 | static int __init i8042_init(void) |
| 1450 | { | 1454 | { |
| 1455 | struct platform_device *pdev; | ||
| 1451 | int err; | 1456 | int err; |
| 1452 | 1457 | ||
| 1453 | dbg_init(); | 1458 | dbg_init(); |
| @@ -1460,31 +1465,18 @@ static int __init i8042_init(void) | |||
| 1460 | if (err) | 1465 | if (err) |
| 1461 | goto err_platform_exit; | 1466 | goto err_platform_exit; |
| 1462 | 1467 | ||
| 1463 | i8042_platform_device = platform_device_alloc("i8042", -1); | 1468 | pdev = platform_create_bundle(&i8042_driver, i8042_probe, NULL, 0, NULL, 0); |
| 1464 | if (!i8042_platform_device) { | 1469 | if (IS_ERR(pdev)) { |
| 1465 | err = -ENOMEM; | 1470 | err = PTR_ERR(pdev); |
| 1466 | goto err_platform_exit; | 1471 | goto err_platform_exit; |
| 1467 | } | 1472 | } |
| 1468 | 1473 | ||
| 1469 | err = platform_device_add(i8042_platform_device); | ||
| 1470 | if (err) | ||
| 1471 | goto err_free_device; | ||
| 1472 | |||
| 1473 | err = platform_driver_probe(&i8042_driver, i8042_probe); | ||
| 1474 | if (err) | ||
| 1475 | goto err_del_device; | ||
| 1476 | |||
| 1477 | panic_blink = i8042_panic_blink; | 1474 | panic_blink = i8042_panic_blink; |
| 1478 | 1475 | ||
| 1479 | return 0; | 1476 | return 0; |
| 1480 | 1477 | ||
| 1481 | err_del_device: | ||
| 1482 | platform_device_del(i8042_platform_device); | ||
| 1483 | err_free_device: | ||
| 1484 | platform_device_put(i8042_platform_device); | ||
| 1485 | err_platform_exit: | 1478 | err_platform_exit: |
| 1486 | i8042_platform_exit(); | 1479 | i8042_platform_exit(); |
| 1487 | |||
| 1488 | return err; | 1480 | return err; |
| 1489 | } | 1481 | } |
| 1490 | 1482 | ||
diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index 27fdaaffbb40..998664854440 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c | |||
| @@ -81,12 +81,12 @@ static int serio_raw_open(struct inode *inode, struct file *file) | |||
| 81 | struct serio_raw_list *list; | 81 | struct serio_raw_list *list; |
| 82 | int retval = 0; | 82 | int retval = 0; |
| 83 | 83 | ||
| 84 | lock_kernel(); | ||
| 85 | retval = mutex_lock_interruptible(&serio_raw_mutex); | 84 | retval = mutex_lock_interruptible(&serio_raw_mutex); |
| 86 | if (retval) | 85 | if (retval) |
| 87 | goto out_bkl; | 86 | return retval; |
| 88 | 87 | ||
| 89 | if (!(serio_raw = serio_raw_locate(iminor(inode)))) { | 88 | serio_raw = serio_raw_locate(iminor(inode)); |
| 89 | if (!serio_raw) { | ||
| 90 | retval = -ENODEV; | 90 | retval = -ENODEV; |
| 91 | goto out; | 91 | goto out; |
| 92 | } | 92 | } |
| @@ -96,7 +96,8 @@ static int serio_raw_open(struct inode *inode, struct file *file) | |||
| 96 | goto out; | 96 | goto out; |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | if (!(list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) { | 99 | list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL); |
| 100 | if (!list) { | ||
| 100 | retval = -ENOMEM; | 101 | retval = -ENOMEM; |
| 101 | goto out; | 102 | goto out; |
| 102 | } | 103 | } |
| @@ -109,8 +110,6 @@ static int serio_raw_open(struct inode *inode, struct file *file) | |||
| 109 | 110 | ||
| 110 | out: | 111 | out: |
| 111 | mutex_unlock(&serio_raw_mutex); | 112 | mutex_unlock(&serio_raw_mutex); |
| 112 | out_bkl: | ||
| 113 | unlock_kernel(); | ||
| 114 | return retval; | 113 | return retval; |
| 115 | } | 114 | } |
| 116 | 115 | ||
diff --git a/drivers/input/sparse-keymap.c b/drivers/input/sparse-keymap.c index fbd3987af57f..e6bde55e5203 100644 --- a/drivers/input/sparse-keymap.c +++ b/drivers/input/sparse-keymap.c | |||
| @@ -64,7 +64,8 @@ struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev, | |||
| 64 | EXPORT_SYMBOL(sparse_keymap_entry_from_keycode); | 64 | EXPORT_SYMBOL(sparse_keymap_entry_from_keycode); |
| 65 | 65 | ||
| 66 | static int sparse_keymap_getkeycode(struct input_dev *dev, | 66 | static int sparse_keymap_getkeycode(struct input_dev *dev, |
| 67 | int scancode, int *keycode) | 67 | unsigned int scancode, |
| 68 | unsigned int *keycode) | ||
| 68 | { | 69 | { |
| 69 | const struct key_entry *key = | 70 | const struct key_entry *key = |
| 70 | sparse_keymap_entry_from_scancode(dev, scancode); | 71 | sparse_keymap_entry_from_scancode(dev, scancode); |
| @@ -78,7 +79,8 @@ static int sparse_keymap_getkeycode(struct input_dev *dev, | |||
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | static int sparse_keymap_setkeycode(struct input_dev *dev, | 81 | static int sparse_keymap_setkeycode(struct input_dev *dev, |
| 81 | int scancode, int keycode) | 82 | unsigned int scancode, |
| 83 | unsigned int keycode) | ||
| 82 | { | 84 | { |
| 83 | struct key_entry *key; | 85 | struct key_entry *key; |
| 84 | int old_keycode; | 86 | int old_keycode; |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index a1770e6feeec..8b5d2873f0c4 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -371,7 +371,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi | |||
| 371 | } else if (pen) { | 371 | } else if (pen) { |
| 372 | /* penabled only accepts exact bytes of data */ | 372 | /* penabled only accepts exact bytes of data */ |
| 373 | if (features->type == TABLETPC2FG) | 373 | if (features->type == TABLETPC2FG) |
| 374 | features->pktlen = WACOM_PKGLEN_PENABLED; | 374 | features->pktlen = WACOM_PKGLEN_GRAPHIRE; |
| 375 | features->device_type = BTN_TOOL_PEN; | 375 | features->device_type = BTN_TOOL_PEN; |
| 376 | features->x_max = | 376 | features->x_max = |
| 377 | wacom_le16_to_cpu(&report[i + 3]); | 377 | wacom_le16_to_cpu(&report[i + 3]); |
| @@ -410,7 +410,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi | |||
| 410 | } else if (pen) { | 410 | } else if (pen) { |
| 411 | /* penabled only accepts exact bytes of data */ | 411 | /* penabled only accepts exact bytes of data */ |
| 412 | if (features->type == TABLETPC2FG) | 412 | if (features->type == TABLETPC2FG) |
| 413 | features->pktlen = WACOM_PKGLEN_PENABLED; | 413 | features->pktlen = WACOM_PKGLEN_GRAPHIRE; |
| 414 | features->device_type = BTN_TOOL_PEN; | 414 | features->device_type = BTN_TOOL_PEN; |
| 415 | features->y_max = | 415 | features->y_max = |
| 416 | wacom_le16_to_cpu(&report[i + 3]); | 416 | wacom_le16_to_cpu(&report[i + 3]); |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 3d81443e683a..b3ba3437a2eb 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -155,19 +155,19 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 155 | { | 155 | { |
| 156 | struct wacom_features *features = &wacom->features; | 156 | struct wacom_features *features = &wacom->features; |
| 157 | unsigned char *data = wacom->data; | 157 | unsigned char *data = wacom->data; |
| 158 | int x, y, rw; | 158 | int x, y, prox; |
| 159 | static int penData = 0; | 159 | int rw = 0; |
| 160 | int retval = 0; | ||
| 160 | 161 | ||
| 161 | if (data[0] != WACOM_REPORT_PENABLED) { | 162 | if (data[0] != WACOM_REPORT_PENABLED) { |
| 162 | dbg("wacom_graphire_irq: received unknown report #%d", data[0]); | 163 | dbg("wacom_graphire_irq: received unknown report #%d", data[0]); |
| 163 | return 0; | 164 | goto exit; |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 166 | if (data[1] & 0x80) { | 167 | prox = data[1] & 0x80; |
| 167 | /* in prox and not a pad data */ | 168 | if (prox || wacom->id[0]) { |
| 168 | penData = 1; | 169 | if (prox) { |
| 169 | 170 | switch ((data[1] >> 5) & 3) { | |
| 170 | switch ((data[1] >> 5) & 3) { | ||
| 171 | 171 | ||
| 172 | case 0: /* Pen */ | 172 | case 0: /* Pen */ |
| 173 | wacom->tool[0] = BTN_TOOL_PEN; | 173 | wacom->tool[0] = BTN_TOOL_PEN; |
| @@ -181,23 +181,13 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 181 | 181 | ||
| 182 | case 2: /* Mouse with wheel */ | 182 | case 2: /* Mouse with wheel */ |
| 183 | wacom_report_key(wcombo, BTN_MIDDLE, data[1] & 0x04); | 183 | wacom_report_key(wcombo, BTN_MIDDLE, data[1] & 0x04); |
| 184 | if (features->type == WACOM_G4 || features->type == WACOM_MO) { | ||
| 185 | rw = data[7] & 0x04 ? (data[7] & 0x03)-4 : (data[7] & 0x03); | ||
| 186 | wacom_report_rel(wcombo, REL_WHEEL, -rw); | ||
| 187 | } else | ||
| 188 | wacom_report_rel(wcombo, REL_WHEEL, -(signed char) data[6]); | ||
| 189 | /* fall through */ | 184 | /* fall through */ |
| 190 | 185 | ||
| 191 | case 3: /* Mouse without wheel */ | 186 | case 3: /* Mouse without wheel */ |
| 192 | wacom->tool[0] = BTN_TOOL_MOUSE; | 187 | wacom->tool[0] = BTN_TOOL_MOUSE; |
| 193 | wacom->id[0] = CURSOR_DEVICE_ID; | 188 | wacom->id[0] = CURSOR_DEVICE_ID; |
| 194 | wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); | ||
| 195 | wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); | ||
| 196 | if (features->type == WACOM_G4 || features->type == WACOM_MO) | ||
| 197 | wacom_report_abs(wcombo, ABS_DISTANCE, data[6] & 0x3f); | ||
| 198 | else | ||
| 199 | wacom_report_abs(wcombo, ABS_DISTANCE, data[7] & 0x3f); | ||
| 200 | break; | 189 | break; |
| 190 | } | ||
| 201 | } | 191 | } |
| 202 | x = wacom_le16_to_cpu(&data[2]); | 192 | x = wacom_le16_to_cpu(&data[2]); |
| 203 | y = wacom_le16_to_cpu(&data[4]); | 193 | y = wacom_le16_to_cpu(&data[4]); |
| @@ -208,36 +198,32 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 208 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01); | 198 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01); |
| 209 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); | 199 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); |
| 210 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04); | 200 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04); |
| 211 | } | ||
| 212 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */ | ||
| 213 | wacom_report_key(wcombo, wacom->tool[0], 1); | ||
| 214 | } else if (wacom->id[0]) { | ||
| 215 | wacom_report_abs(wcombo, ABS_X, 0); | ||
| 216 | wacom_report_abs(wcombo, ABS_Y, 0); | ||
| 217 | if (wacom->tool[0] == BTN_TOOL_MOUSE) { | ||
| 218 | wacom_report_key(wcombo, BTN_LEFT, 0); | ||
| 219 | wacom_report_key(wcombo, BTN_RIGHT, 0); | ||
| 220 | wacom_report_abs(wcombo, ABS_DISTANCE, 0); | ||
| 221 | } else { | 201 | } else { |
| 222 | wacom_report_abs(wcombo, ABS_PRESSURE, 0); | 202 | wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); |
| 223 | wacom_report_key(wcombo, BTN_TOUCH, 0); | 203 | wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); |
| 224 | wacom_report_key(wcombo, BTN_STYLUS, 0); | 204 | if (features->type == WACOM_G4 || |
| 225 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | 205 | features->type == WACOM_MO) { |
| 206 | wacom_report_abs(wcombo, ABS_DISTANCE, data[6] & 0x3f); | ||
| 207 | rw = (signed)(data[7] & 0x04) - (data[7] & 0x03); | ||
| 208 | } else { | ||
| 209 | wacom_report_abs(wcombo, ABS_DISTANCE, data[7] & 0x3f); | ||
| 210 | rw = -(signed)data[6]; | ||
| 211 | } | ||
| 212 | wacom_report_rel(wcombo, REL_WHEEL, rw); | ||
| 226 | } | 213 | } |
| 227 | wacom->id[0] = 0; | 214 | |
| 228 | wacom_report_abs(wcombo, ABS_MISC, 0); /* reset tool id */ | 215 | if (!prox) |
| 229 | wacom_report_key(wcombo, wacom->tool[0], 0); | 216 | wacom->id[0] = 0; |
| 217 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */ | ||
| 218 | wacom_report_key(wcombo, wacom->tool[0], prox); | ||
| 219 | wacom_input_sync(wcombo); /* sync last event */ | ||
| 230 | } | 220 | } |
| 231 | 221 | ||
| 232 | /* send pad data */ | 222 | /* send pad data */ |
| 233 | switch (features->type) { | 223 | switch (features->type) { |
| 234 | case WACOM_G4: | 224 | case WACOM_G4: |
| 235 | if (data[7] & 0xf8) { | 225 | prox = data[7] & 0xf8; |
| 236 | if (penData) { | 226 | if (prox || wacom->id[1]) { |
| 237 | wacom_input_sync(wcombo); /* sync last event */ | ||
| 238 | if (!wacom->id[0]) | ||
| 239 | penData = 0; | ||
| 240 | } | ||
| 241 | wacom->id[1] = PAD_DEVICE_ID; | 227 | wacom->id[1] = PAD_DEVICE_ID; |
| 242 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); | 228 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); |
| 243 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); | 229 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); |
| @@ -245,29 +231,16 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 245 | wacom_report_rel(wcombo, REL_WHEEL, rw); | 231 | wacom_report_rel(wcombo, REL_WHEEL, rw); |
| 246 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); | 232 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); |
| 247 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); | 233 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); |
| 248 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); | 234 | if (!prox) |
| 249 | } else if (wacom->id[1]) { | 235 | wacom->id[1] = 0; |
| 250 | if (penData) { | 236 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); |
| 251 | wacom_input_sync(wcombo); /* sync last event */ | ||
| 252 | if (!wacom->id[0]) | ||
| 253 | penData = 0; | ||
| 254 | } | ||
| 255 | wacom->id[1] = 0; | ||
| 256 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); | ||
| 257 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); | ||
| 258 | wacom_report_rel(wcombo, REL_WHEEL, 0); | ||
| 259 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0); | ||
| 260 | wacom_report_abs(wcombo, ABS_MISC, 0); | ||
| 261 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); | 237 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); |
| 262 | } | 238 | } |
| 239 | retval = 1; | ||
| 263 | break; | 240 | break; |
| 264 | case WACOM_MO: | 241 | case WACOM_MO: |
| 265 | if ((data[7] & 0xf8) || (data[8] & 0xff)) { | 242 | prox = (data[7] & 0xf8) || data[8]; |
| 266 | if (penData) { | 243 | if (prox || wacom->id[1]) { |
| 267 | wacom_input_sync(wcombo); /* sync last event */ | ||
| 268 | if (!wacom->id[0]) | ||
| 269 | penData = 0; | ||
| 270 | } | ||
| 271 | wacom->id[1] = PAD_DEVICE_ID; | 244 | wacom->id[1] = PAD_DEVICE_ID; |
| 272 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); | 245 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); |
| 273 | wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); | 246 | wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); |
| @@ -275,27 +248,16 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 275 | wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); | 248 | wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); |
| 276 | wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); | 249 | wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); |
| 277 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); | 250 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); |
| 251 | if (!prox) | ||
| 252 | wacom->id[1] = 0; | ||
| 278 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); | 253 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); |
| 279 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); | 254 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); |
| 280 | } else if (wacom->id[1]) { | ||
| 281 | if (penData) { | ||
| 282 | wacom_input_sync(wcombo); /* sync last event */ | ||
| 283 | if (!wacom->id[0]) | ||
| 284 | penData = 0; | ||
| 285 | } | ||
| 286 | wacom->id[1] = 0; | ||
| 287 | wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); | ||
| 288 | wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); | ||
| 289 | wacom_report_key(wcombo, BTN_4, (data[7] & 0x10)); | ||
| 290 | wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); | ||
| 291 | wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); | ||
| 292 | wacom_report_key(wcombo, BTN_TOOL_FINGER, 0); | ||
| 293 | wacom_report_abs(wcombo, ABS_MISC, 0); | ||
| 294 | wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); | ||
| 295 | } | 255 | } |
| 256 | retval = 1; | ||
| 296 | break; | 257 | break; |
| 297 | } | 258 | } |
| 298 | return 1; | 259 | exit: |
| 260 | return retval; | ||
| 299 | } | 261 | } |
| 300 | 262 | ||
| 301 | static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) | 263 | static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) |
| @@ -636,9 +598,9 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 636 | static void wacom_tpc_finger_in(struct wacom_wac *wacom, void *wcombo, char *data, int idx) | 598 | static void wacom_tpc_finger_in(struct wacom_wac *wacom, void *wcombo, char *data, int idx) |
| 637 | { | 599 | { |
| 638 | wacom_report_abs(wcombo, ABS_X, | 600 | wacom_report_abs(wcombo, ABS_X, |
| 639 | (data[2 + idx * 2] & 0xff) | ((data[3 + idx * 2] & 0x7f) << 8)); | 601 | data[2 + idx * 2] | ((data[3 + idx * 2] & 0x7f) << 8)); |
| 640 | wacom_report_abs(wcombo, ABS_Y, | 602 | wacom_report_abs(wcombo, ABS_Y, |
| 641 | (data[6 + idx * 2] & 0xff) | ((data[7 + idx * 2] & 0x7f) << 8)); | 603 | data[6 + idx * 2] | ((data[7 + idx * 2] & 0x7f) << 8)); |
| 642 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); | 604 | wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); |
| 643 | wacom_report_key(wcombo, wacom->tool[idx], 1); | 605 | wacom_report_key(wcombo, wacom->tool[idx], 1); |
| 644 | if (idx) | 606 | if (idx) |
| @@ -782,31 +744,24 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) | |||
| 782 | 744 | ||
| 783 | touchInProx = 0; | 745 | touchInProx = 0; |
| 784 | 746 | ||
| 785 | if (prox) { /* in prox */ | 747 | if (!wacom->id[0]) { /* first in prox */ |
| 786 | if (!wacom->id[0]) { | 748 | /* Going into proximity select tool */ |
| 787 | /* Going into proximity select tool */ | 749 | wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; |
| 788 | wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; | 750 | if (wacom->tool[0] == BTN_TOOL_PEN) |
| 789 | if (wacom->tool[0] == BTN_TOOL_PEN) | 751 | wacom->id[0] = STYLUS_DEVICE_ID; |
| 790 | wacom->id[0] = STYLUS_DEVICE_ID; | 752 | else |
| 791 | else | 753 | wacom->id[0] = ERASER_DEVICE_ID; |
| 792 | wacom->id[0] = ERASER_DEVICE_ID; | 754 | } |
| 793 | } | 755 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); |
| 794 | wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); | 756 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); |
| 795 | wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); | 757 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); |
| 796 | wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); | 758 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); |
| 797 | wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); | 759 | pressure = ((data[7] & 0x01) << 8) | data[6]; |
| 798 | pressure = ((data[7] & 0x01) << 8) | data[6]; | 760 | if (pressure < 0) |
| 799 | if (pressure < 0) | 761 | pressure = features->pressure_max + pressure + 1; |
| 800 | pressure = features->pressure_max + pressure + 1; | 762 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); |
| 801 | wacom_report_abs(wcombo, ABS_PRESSURE, pressure); | 763 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); |
| 802 | wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); | 764 | if (!prox) { /* out-prox */ |
| 803 | } else { | ||
| 804 | wacom_report_abs(wcombo, ABS_X, 0); | ||
| 805 | wacom_report_abs(wcombo, ABS_Y, 0); | ||
| 806 | wacom_report_abs(wcombo, ABS_PRESSURE, 0); | ||
| 807 | wacom_report_key(wcombo, BTN_STYLUS, 0); | ||
| 808 | wacom_report_key(wcombo, BTN_STYLUS2, 0); | ||
| 809 | wacom_report_key(wcombo, BTN_TOUCH, 0); | ||
| 810 | wacom->id[0] = 0; | 765 | wacom->id[0] = 0; |
| 811 | /* pen is out so touch can be enabled now */ | 766 | /* pen is out so touch can be enabled now */ |
| 812 | touchInProx = 1; | 767 | touchInProx = 1; |
| @@ -1028,7 +983,7 @@ static const struct wacom_features wacom_features_0x93 = | |||
| 1028 | static const struct wacom_features wacom_features_0x9A = | 983 | static const struct wacom_features wacom_features_0x9A = |
| 1029 | { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; | 984 | { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; |
| 1030 | static const struct wacom_features wacom_features_0x9F = | 985 | static const struct wacom_features wacom_features_0x9F = |
| 1031 | { "Wacom ISDv4 9F", WACOM_PKGLEN_PENABLED, 26202, 16325, 255, 0, TABLETPC }; | 986 | { "Wacom ISDv4 9F", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; |
| 1032 | static const struct wacom_features wacom_features_0xE2 = | 987 | static const struct wacom_features wacom_features_0xE2 = |
| 1033 | { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; | 988 | { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; |
| 1034 | static const struct wacom_features wacom_features_0xE3 = | 989 | static const struct wacom_features wacom_features_0xE3 = |
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 8590b1e8ec37..b50cf04e61a8 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #define WACOM_PKGLEN_GRAPHIRE 8 | 17 | #define WACOM_PKGLEN_GRAPHIRE 8 |
| 18 | #define WACOM_PKGLEN_BBFUN 9 | 18 | #define WACOM_PKGLEN_BBFUN 9 |
| 19 | #define WACOM_PKGLEN_INTUOS 10 | 19 | #define WACOM_PKGLEN_INTUOS 10 |
| 20 | #define WACOM_PKGLEN_PENABLED 8 | ||
| 21 | #define WACOM_PKGLEN_TPC1FG 5 | 20 | #define WACOM_PKGLEN_TPC1FG 5 |
| 22 | #define WACOM_PKGLEN_TPC2FG 14 | 21 | #define WACOM_PKGLEN_TPC2FG 14 |
| 23 | 22 | ||
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 7208654a94ae..8a8fa4d2d6a8 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
| @@ -24,17 +24,18 @@ config TOUCHSCREEN_88PM860X | |||
| 24 | module will be called 88pm860x-ts. | 24 | module will be called 88pm860x-ts. |
| 25 | 25 | ||
| 26 | config TOUCHSCREEN_ADS7846 | 26 | config TOUCHSCREEN_ADS7846 |
| 27 | tristate "ADS7846/TSC2046 and ADS7843 based touchscreens" | 27 | tristate "ADS7846/TSC2046/AD7873 and AD(S)7843 based touchscreens" |
| 28 | depends on SPI_MASTER | 28 | depends on SPI_MASTER |
| 29 | depends on HWMON = n || HWMON | 29 | depends on HWMON = n || HWMON |
| 30 | help | 30 | help |
| 31 | Say Y here if you have a touchscreen interface using the | 31 | Say Y here if you have a touchscreen interface using the |
| 32 | ADS7846/TSC2046 or ADS7843 controller, and your board-specific | 32 | ADS7846/TSC2046/AD7873 or ADS7843/AD7843 controller, |
| 33 | setup code includes that in its table of SPI devices. | 33 | and your board-specific setup code includes that in its |
| 34 | table of SPI devices. | ||
| 34 | 35 | ||
| 35 | If HWMON is selected, and the driver is told the reference voltage | 36 | If HWMON is selected, and the driver is told the reference voltage |
| 36 | on your board, you will also get hwmon interfaces for the voltage | 37 | on your board, you will also get hwmon interfaces for the voltage |
| 37 | (and on ads7846/tsc2046, temperature) sensors of this chip. | 38 | (and on ads7846/tsc2046/ad7873, temperature) sensors of this chip. |
| 38 | 39 | ||
| 39 | If unsure, say N (but it's safe to say "Y"). | 40 | If unsure, say N (but it's safe to say "Y"). |
| 40 | 41 | ||
diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c index eb83939c705e..e019d53d1ab4 100644 --- a/drivers/input/touchscreen/ad7877.c +++ b/drivers/input/touchscreen/ad7877.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #include <linux/spi/ad7877.h> | 46 | #include <linux/spi/ad7877.h> |
| 47 | #include <asm/irq.h> | 47 | #include <asm/irq.h> |
| 48 | 48 | ||
| 49 | #define TS_PEN_UP_TIMEOUT msecs_to_jiffies(50) | 49 | #define TS_PEN_UP_TIMEOUT msecs_to_jiffies(100) |
| 50 | 50 | ||
| 51 | #define MAX_SPI_FREQ_HZ 20000000 | 51 | #define MAX_SPI_FREQ_HZ 20000000 |
| 52 | #define MAX_12BIT ((1<<12)-1) | 52 | #define MAX_12BIT ((1<<12)-1) |
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 8b05d8e97543..532279cda0e4 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | * TSC2046 is just newer ads7846 silicon. | 36 | * TSC2046 is just newer ads7846 silicon. |
| 37 | * Support for ads7843 tested on Atmel at91sam926x-EK. | 37 | * Support for ads7843 tested on Atmel at91sam926x-EK. |
| 38 | * Support for ads7845 has only been stubbed in. | 38 | * Support for ads7845 has only been stubbed in. |
| 39 | * Support for Analog Devices AD7873 and AD7843 tested. | ||
| 39 | * | 40 | * |
| 40 | * IRQ handling needs a workaround because of a shortcoming in handling | 41 | * IRQ handling needs a workaround because of a shortcoming in handling |
| 41 | * edge triggered IRQs on some platforms like the OMAP1/2. These | 42 | * edge triggered IRQs on some platforms like the OMAP1/2. These |
| @@ -821,6 +822,9 @@ static int ads7846_suspend(struct spi_device *spi, pm_message_t message) | |||
| 821 | 822 | ||
| 822 | spin_unlock_irq(&ts->lock); | 823 | spin_unlock_irq(&ts->lock); |
| 823 | 824 | ||
| 825 | if (device_may_wakeup(&ts->spi->dev)) | ||
| 826 | enable_irq_wake(ts->spi->irq); | ||
| 827 | |||
| 824 | return 0; | 828 | return 0; |
| 825 | 829 | ||
| 826 | } | 830 | } |
| @@ -829,6 +833,9 @@ static int ads7846_resume(struct spi_device *spi) | |||
| 829 | { | 833 | { |
| 830 | struct ads7846 *ts = dev_get_drvdata(&spi->dev); | 834 | struct ads7846 *ts = dev_get_drvdata(&spi->dev); |
| 831 | 835 | ||
| 836 | if (device_may_wakeup(&ts->spi->dev)) | ||
| 837 | disable_irq_wake(ts->spi->irq); | ||
| 838 | |||
| 832 | spin_lock_irq(&ts->lock); | 839 | spin_lock_irq(&ts->lock); |
| 833 | 840 | ||
| 834 | ts->is_suspended = 0; | 841 | ts->is_suspended = 0; |
| @@ -984,6 +991,15 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
| 984 | 991 | ||
| 985 | vref = pdata->keep_vref_on; | 992 | vref = pdata->keep_vref_on; |
| 986 | 993 | ||
| 994 | if (ts->model == 7873) { | ||
| 995 | /* The AD7873 is almost identical to the ADS7846 | ||
| 996 | * keep VREF off during differential/ratiometric | ||
| 997 | * conversion modes | ||
| 998 | */ | ||
| 999 | ts->model = 7846; | ||
| 1000 | vref = 0; | ||
| 1001 | } | ||
| 1002 | |||
| 987 | /* set up the transfers to read touchscreen state; this assumes we | 1003 | /* set up the transfers to read touchscreen state; this assumes we |
| 988 | * use formula #2 for pressure, not #3. | 1004 | * use formula #2 for pressure, not #3. |
| 989 | */ | 1005 | */ |
| @@ -1191,6 +1207,8 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
| 1191 | if (err) | 1207 | if (err) |
| 1192 | goto err_remove_attr_group; | 1208 | goto err_remove_attr_group; |
| 1193 | 1209 | ||
| 1210 | device_init_wakeup(&spi->dev, pdata->wakeup); | ||
| 1211 | |||
| 1194 | return 0; | 1212 | return 0; |
| 1195 | 1213 | ||
| 1196 | err_remove_attr_group: | 1214 | err_remove_attr_group: |
| @@ -1220,6 +1238,8 @@ static int __devexit ads7846_remove(struct spi_device *spi) | |||
| 1220 | { | 1238 | { |
| 1221 | struct ads7846 *ts = dev_get_drvdata(&spi->dev); | 1239 | struct ads7846 *ts = dev_get_drvdata(&spi->dev); |
| 1222 | 1240 | ||
| 1241 | device_init_wakeup(&spi->dev, false); | ||
| 1242 | |||
| 1223 | ads784x_hwmon_unregister(spi, ts); | 1243 | ads784x_hwmon_unregister(spi, ts); |
| 1224 | input_unregister_device(ts->input); | 1244 | input_unregister_device(ts->input); |
| 1225 | 1245 | ||
diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c index 0903f539bf68..0a3b4ed38e48 100644 --- a/drivers/media/IR/ir-keytable.c +++ b/drivers/media/IR/ir-keytable.c | |||
| @@ -123,7 +123,7 @@ static int ir_copy_table(struct ir_scancode_table *destin, | |||
| 123 | * If the key is not found, returns -EINVAL, otherwise, returns 0. | 123 | * If the key is not found, returns -EINVAL, otherwise, returns 0. |
| 124 | */ | 124 | */ |
| 125 | static int ir_getkeycode(struct input_dev *dev, | 125 | static int ir_getkeycode(struct input_dev *dev, |
| 126 | int scancode, int *keycode) | 126 | unsigned int scancode, unsigned int *keycode) |
| 127 | { | 127 | { |
| 128 | int elem; | 128 | int elem; |
| 129 | struct ir_input_dev *ir_dev = input_get_drvdata(dev); | 129 | struct ir_input_dev *ir_dev = input_get_drvdata(dev); |
| @@ -291,7 +291,7 @@ static int ir_insert_key(struct ir_scancode_table *rc_tab, | |||
| 291 | * If the key is not found, returns -EINVAL, otherwise, returns 0. | 291 | * If the key is not found, returns -EINVAL, otherwise, returns 0. |
| 292 | */ | 292 | */ |
| 293 | static int ir_setkeycode(struct input_dev *dev, | 293 | static int ir_setkeycode(struct input_dev *dev, |
| 294 | int scancode, int keycode) | 294 | unsigned int scancode, unsigned int keycode) |
| 295 | { | 295 | { |
| 296 | int rc = 0; | 296 | int rc = 0; |
| 297 | struct ir_input_dev *ir_dev = input_get_drvdata(dev); | 297 | struct ir_input_dev *ir_dev = input_get_drvdata(dev); |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c index a03ef7efec9a..852fe89539cf 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | #include <linux/usb/input.h> | 9 | #include <linux/usb/input.h> |
| 10 | 10 | ||
| 11 | static int dvb_usb_getkeycode(struct input_dev *dev, | 11 | static int dvb_usb_getkeycode(struct input_dev *dev, |
| 12 | int scancode, int *keycode) | 12 | unsigned int scancode, unsigned int *keycode) |
| 13 | { | 13 | { |
| 14 | struct dvb_usb_device *d = input_get_drvdata(dev); | 14 | struct dvb_usb_device *d = input_get_drvdata(dev); |
| 15 | 15 | ||
| @@ -39,7 +39,7 @@ static int dvb_usb_getkeycode(struct input_dev *dev, | |||
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static int dvb_usb_setkeycode(struct input_dev *dev, | 41 | static int dvb_usb_setkeycode(struct input_dev *dev, |
| 42 | int scancode, int keycode) | 42 | unsigned int scancode, unsigned int keycode) |
| 43 | { | 43 | { |
| 44 | struct dvb_usb_device *d = input_get_drvdata(dev); | 44 | struct dvb_usb_device *d = input_get_drvdata(dev); |
| 45 | 45 | ||
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c index 1b1dddbd5744..bed764e3ea2a 100644 --- a/drivers/platform/x86/dell-wmi.c +++ b/drivers/platform/x86/dell-wmi.c | |||
| @@ -142,7 +142,7 @@ static struct key_entry *dell_wmi_keymap = dell_legacy_wmi_keymap; | |||
| 142 | 142 | ||
| 143 | static struct input_dev *dell_wmi_input_dev; | 143 | static struct input_dev *dell_wmi_input_dev; |
| 144 | 144 | ||
| 145 | static struct key_entry *dell_wmi_get_entry_by_scancode(int code) | 145 | static struct key_entry *dell_wmi_get_entry_by_scancode(unsigned int code) |
| 146 | { | 146 | { |
| 147 | struct key_entry *key; | 147 | struct key_entry *key; |
| 148 | 148 | ||
| @@ -153,7 +153,7 @@ static struct key_entry *dell_wmi_get_entry_by_scancode(int code) | |||
| 153 | return NULL; | 153 | return NULL; |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | static struct key_entry *dell_wmi_get_entry_by_keycode(int keycode) | 156 | static struct key_entry *dell_wmi_get_entry_by_keycode(unsigned int keycode) |
| 157 | { | 157 | { |
| 158 | struct key_entry *key; | 158 | struct key_entry *key; |
| 159 | 159 | ||
| @@ -164,8 +164,8 @@ static struct key_entry *dell_wmi_get_entry_by_keycode(int keycode) | |||
| 164 | return NULL; | 164 | return NULL; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | static int dell_wmi_getkeycode(struct input_dev *dev, int scancode, | 167 | static int dell_wmi_getkeycode(struct input_dev *dev, |
| 168 | int *keycode) | 168 | unsigned int scancode, unsigned int *keycode) |
| 169 | { | 169 | { |
| 170 | struct key_entry *key = dell_wmi_get_entry_by_scancode(scancode); | 170 | struct key_entry *key = dell_wmi_get_entry_by_scancode(scancode); |
| 171 | 171 | ||
| @@ -177,13 +177,11 @@ static int dell_wmi_getkeycode(struct input_dev *dev, int scancode, | |||
| 177 | return -EINVAL; | 177 | return -EINVAL; |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static int dell_wmi_setkeycode(struct input_dev *dev, int scancode, int keycode) | 180 | static int dell_wmi_setkeycode(struct input_dev *dev, |
| 181 | unsigned int scancode, unsigned int keycode) | ||
| 181 | { | 182 | { |
| 182 | struct key_entry *key; | 183 | struct key_entry *key; |
| 183 | int old_keycode; | 184 | unsigned int old_keycode; |
| 184 | |||
| 185 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 186 | return -EINVAL; | ||
| 187 | 185 | ||
| 188 | key = dell_wmi_get_entry_by_scancode(scancode); | 186 | key = dell_wmi_get_entry_by_scancode(scancode); |
| 189 | if (key && key->type == KE_KEY) { | 187 | if (key && key->type == KE_KEY) { |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 7ccf33c08967..56086363becc 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
| @@ -278,7 +278,7 @@ static DEVICE_ATTR(als, S_IRUGO | S_IWUSR, show_als, set_als); | |||
| 278 | static DEVICE_ATTR(dock, S_IRUGO, show_dock, NULL); | 278 | static DEVICE_ATTR(dock, S_IRUGO, show_dock, NULL); |
| 279 | static DEVICE_ATTR(tablet, S_IRUGO, show_tablet, NULL); | 279 | static DEVICE_ATTR(tablet, S_IRUGO, show_tablet, NULL); |
| 280 | 280 | ||
| 281 | static struct key_entry *hp_wmi_get_entry_by_scancode(int code) | 281 | static struct key_entry *hp_wmi_get_entry_by_scancode(unsigned int code) |
| 282 | { | 282 | { |
| 283 | struct key_entry *key; | 283 | struct key_entry *key; |
| 284 | 284 | ||
| @@ -289,7 +289,7 @@ static struct key_entry *hp_wmi_get_entry_by_scancode(int code) | |||
| 289 | return NULL; | 289 | return NULL; |
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | static struct key_entry *hp_wmi_get_entry_by_keycode(int keycode) | 292 | static struct key_entry *hp_wmi_get_entry_by_keycode(unsigned int keycode) |
| 293 | { | 293 | { |
| 294 | struct key_entry *key; | 294 | struct key_entry *key; |
| 295 | 295 | ||
| @@ -300,7 +300,8 @@ static struct key_entry *hp_wmi_get_entry_by_keycode(int keycode) | |||
| 300 | return NULL; | 300 | return NULL; |
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | static int hp_wmi_getkeycode(struct input_dev *dev, int scancode, int *keycode) | 303 | static int hp_wmi_getkeycode(struct input_dev *dev, |
| 304 | unsigned int scancode, unsigned int *keycode) | ||
| 304 | { | 305 | { |
| 305 | struct key_entry *key = hp_wmi_get_entry_by_scancode(scancode); | 306 | struct key_entry *key = hp_wmi_get_entry_by_scancode(scancode); |
| 306 | 307 | ||
| @@ -312,13 +313,11 @@ static int hp_wmi_getkeycode(struct input_dev *dev, int scancode, int *keycode) | |||
| 312 | return -EINVAL; | 313 | return -EINVAL; |
| 313 | } | 314 | } |
| 314 | 315 | ||
| 315 | static int hp_wmi_setkeycode(struct input_dev *dev, int scancode, int keycode) | 316 | static int hp_wmi_setkeycode(struct input_dev *dev, |
| 317 | unsigned int scancode, unsigned int keycode) | ||
| 316 | { | 318 | { |
| 317 | struct key_entry *key; | 319 | struct key_entry *key; |
| 318 | int old_keycode; | 320 | unsigned int old_keycode; |
| 319 | |||
| 320 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 321 | return -EINVAL; | ||
| 322 | 321 | ||
| 323 | key = hp_wmi_get_entry_by_scancode(scancode); | 322 | key = hp_wmi_get_entry_by_scancode(scancode); |
| 324 | if (key && key->type == KE_KEY) { | 323 | if (key && key->type == KE_KEY) { |
diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index fe7cf0188acc..c9fc479fc290 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c | |||
| @@ -200,7 +200,7 @@ static struct acpi_driver acpi_pcc_driver = { | |||
| 200 | }; | 200 | }; |
| 201 | 201 | ||
| 202 | #define KEYMAP_SIZE 11 | 202 | #define KEYMAP_SIZE 11 |
| 203 | static const int initial_keymap[KEYMAP_SIZE] = { | 203 | static const unsigned int initial_keymap[KEYMAP_SIZE] = { |
| 204 | /* 0 */ KEY_RESERVED, | 204 | /* 0 */ KEY_RESERVED, |
| 205 | /* 1 */ KEY_BRIGHTNESSDOWN, | 205 | /* 1 */ KEY_BRIGHTNESSDOWN, |
| 206 | /* 2 */ KEY_BRIGHTNESSUP, | 206 | /* 2 */ KEY_BRIGHTNESSUP, |
| @@ -222,7 +222,7 @@ struct pcc_acpi { | |||
| 222 | struct acpi_device *device; | 222 | struct acpi_device *device; |
| 223 | struct input_dev *input_dev; | 223 | struct input_dev *input_dev; |
| 224 | struct backlight_device *backlight; | 224 | struct backlight_device *backlight; |
| 225 | int keymap[KEYMAP_SIZE]; | 225 | unsigned int keymap[KEYMAP_SIZE]; |
| 226 | }; | 226 | }; |
| 227 | 227 | ||
| 228 | struct pcc_keyinput { | 228 | struct pcc_keyinput { |
| @@ -445,7 +445,8 @@ static struct attribute_group pcc_attr_group = { | |||
| 445 | 445 | ||
| 446 | /* hotkey input device driver */ | 446 | /* hotkey input device driver */ |
| 447 | 447 | ||
| 448 | static int pcc_getkeycode(struct input_dev *dev, int scancode, int *keycode) | 448 | static int pcc_getkeycode(struct input_dev *dev, |
| 449 | unsigned int scancode, unsigned int *keycode) | ||
| 449 | { | 450 | { |
| 450 | struct pcc_acpi *pcc = input_get_drvdata(dev); | 451 | struct pcc_acpi *pcc = input_get_drvdata(dev); |
| 451 | 452 | ||
| @@ -457,7 +458,7 @@ static int pcc_getkeycode(struct input_dev *dev, int scancode, int *keycode) | |||
| 457 | return 0; | 458 | return 0; |
| 458 | } | 459 | } |
| 459 | 460 | ||
| 460 | static int keymap_get_by_keycode(struct pcc_acpi *pcc, int keycode) | 461 | static int keymap_get_by_keycode(struct pcc_acpi *pcc, unsigned int keycode) |
| 461 | { | 462 | { |
| 462 | int i; | 463 | int i; |
| 463 | 464 | ||
| @@ -469,7 +470,8 @@ static int keymap_get_by_keycode(struct pcc_acpi *pcc, int keycode) | |||
| 469 | return 0; | 470 | return 0; |
| 470 | } | 471 | } |
| 471 | 472 | ||
| 472 | static int pcc_setkeycode(struct input_dev *dev, int scancode, int keycode) | 473 | static int pcc_setkeycode(struct input_dev *dev, |
| 474 | unsigned int scancode, unsigned int keycode) | ||
| 473 | { | 475 | { |
| 474 | struct pcc_acpi *pcc = input_get_drvdata(dev); | 476 | struct pcc_acpi *pcc = input_get_drvdata(dev); |
| 475 | int oldkeycode; | 477 | int oldkeycode; |
| @@ -477,9 +479,6 @@ static int pcc_setkeycode(struct input_dev *dev, int scancode, int keycode) | |||
| 477 | if (scancode >= ARRAY_SIZE(pcc->keymap)) | 479 | if (scancode >= ARRAY_SIZE(pcc->keymap)) |
| 478 | return -EINVAL; | 480 | return -EINVAL; |
| 479 | 481 | ||
| 480 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 481 | return -EINVAL; | ||
| 482 | |||
| 483 | oldkeycode = pcc->keymap[scancode]; | 482 | oldkeycode = pcc->keymap[scancode]; |
| 484 | pcc->keymap[scancode] = keycode; | 483 | pcc->keymap[scancode] = keycode; |
| 485 | 484 | ||
diff --git a/drivers/platform/x86/topstar-laptop.c b/drivers/platform/x86/topstar-laptop.c index 02f3d4e9e666..4d6516fded7e 100644 --- a/drivers/platform/x86/topstar-laptop.c +++ b/drivers/platform/x86/topstar-laptop.c | |||
| @@ -46,7 +46,7 @@ static struct tps_key_entry topstar_keymap[] = { | |||
| 46 | { } | 46 | { } |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | static struct tps_key_entry *tps_get_key_by_scancode(int code) | 49 | static struct tps_key_entry *tps_get_key_by_scancode(unsigned int code) |
| 50 | { | 50 | { |
| 51 | struct tps_key_entry *key; | 51 | struct tps_key_entry *key; |
| 52 | 52 | ||
| @@ -57,7 +57,7 @@ static struct tps_key_entry *tps_get_key_by_scancode(int code) | |||
| 57 | return NULL; | 57 | return NULL; |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | static struct tps_key_entry *tps_get_key_by_keycode(int code) | 60 | static struct tps_key_entry *tps_get_key_by_keycode(unsigned int code) |
| 61 | { | 61 | { |
| 62 | struct tps_key_entry *key; | 62 | struct tps_key_entry *key; |
| 63 | 63 | ||
| @@ -126,7 +126,8 @@ static int acpi_topstar_fncx_switch(struct acpi_device *device, bool state) | |||
| 126 | return 0; | 126 | return 0; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static int topstar_getkeycode(struct input_dev *dev, int scancode, int *keycode) | 129 | static int topstar_getkeycode(struct input_dev *dev, |
| 130 | unsigned int scancode, unsigned int *keycode) | ||
| 130 | { | 131 | { |
| 131 | struct tps_key_entry *key = tps_get_key_by_scancode(scancode); | 132 | struct tps_key_entry *key = tps_get_key_by_scancode(scancode); |
| 132 | 133 | ||
| @@ -137,14 +138,12 @@ static int topstar_getkeycode(struct input_dev *dev, int scancode, int *keycode) | |||
| 137 | return 0; | 138 | return 0; |
| 138 | } | 139 | } |
| 139 | 140 | ||
| 140 | static int topstar_setkeycode(struct input_dev *dev, int scancode, int keycode) | 141 | static int topstar_setkeycode(struct input_dev *dev, |
| 142 | unsigned int scancode, unsigned int keycode) | ||
| 141 | { | 143 | { |
| 142 | struct tps_key_entry *key; | 144 | struct tps_key_entry *key; |
| 143 | int old_keycode; | 145 | int old_keycode; |
| 144 | 146 | ||
| 145 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 146 | return -EINVAL; | ||
| 147 | |||
| 148 | key = tps_get_key_by_scancode(scancode); | 147 | key = tps_get_key_by_scancode(scancode); |
| 149 | 148 | ||
| 150 | if (!key) | 149 | if (!key) |
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 405b969734d6..789240d1b577 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
| @@ -745,7 +745,7 @@ static struct backlight_ops toshiba_backlight_data = { | |||
| 745 | .update_status = set_lcd_status, | 745 | .update_status = set_lcd_status, |
| 746 | }; | 746 | }; |
| 747 | 747 | ||
| 748 | static struct key_entry *toshiba_acpi_get_entry_by_scancode(int code) | 748 | static struct key_entry *toshiba_acpi_get_entry_by_scancode(unsigned int code) |
| 749 | { | 749 | { |
| 750 | struct key_entry *key; | 750 | struct key_entry *key; |
| 751 | 751 | ||
| @@ -756,7 +756,7 @@ static struct key_entry *toshiba_acpi_get_entry_by_scancode(int code) | |||
| 756 | return NULL; | 756 | return NULL; |
| 757 | } | 757 | } |
| 758 | 758 | ||
| 759 | static struct key_entry *toshiba_acpi_get_entry_by_keycode(int code) | 759 | static struct key_entry *toshiba_acpi_get_entry_by_keycode(unsigned int code) |
| 760 | { | 760 | { |
| 761 | struct key_entry *key; | 761 | struct key_entry *key; |
| 762 | 762 | ||
| @@ -767,8 +767,8 @@ static struct key_entry *toshiba_acpi_get_entry_by_keycode(int code) | |||
| 767 | return NULL; | 767 | return NULL; |
| 768 | } | 768 | } |
| 769 | 769 | ||
| 770 | static int toshiba_acpi_getkeycode(struct input_dev *dev, int scancode, | 770 | static int toshiba_acpi_getkeycode(struct input_dev *dev, |
| 771 | int *keycode) | 771 | unsigned int scancode, unsigned int *keycode) |
| 772 | { | 772 | { |
| 773 | struct key_entry *key = toshiba_acpi_get_entry_by_scancode(scancode); | 773 | struct key_entry *key = toshiba_acpi_get_entry_by_scancode(scancode); |
| 774 | 774 | ||
| @@ -780,14 +780,11 @@ static int toshiba_acpi_getkeycode(struct input_dev *dev, int scancode, | |||
| 780 | return -EINVAL; | 780 | return -EINVAL; |
| 781 | } | 781 | } |
| 782 | 782 | ||
| 783 | static int toshiba_acpi_setkeycode(struct input_dev *dev, int scancode, | 783 | static int toshiba_acpi_setkeycode(struct input_dev *dev, |
| 784 | int keycode) | 784 | unsigned int scancode, unsigned int keycode) |
| 785 | { | 785 | { |
| 786 | struct key_entry *key; | 786 | struct key_entry *key; |
| 787 | int old_keycode; | 787 | unsigned int old_keycode; |
| 788 | |||
| 789 | if (keycode < 0 || keycode > KEY_MAX) | ||
| 790 | return -EINVAL; | ||
| 791 | 788 | ||
| 792 | key = toshiba_acpi_get_entry_by_scancode(scancode); | 789 | key = toshiba_acpi_get_entry_by_scancode(scancode); |
| 793 | if (key && key->type == KE_KEY) { | 790 | if (key && key->type == KE_KEY) { |
diff --git a/include/linux/input.h b/include/linux/input.h index dc24effb6d0e..7ed2251b33f1 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -58,10 +58,10 @@ struct input_absinfo { | |||
| 58 | 58 | ||
| 59 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ | 59 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ |
| 60 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ | 60 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ |
| 61 | #define EVIOCGREP _IOR('E', 0x03, int[2]) /* get repeat settings */ | 61 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ |
| 62 | #define EVIOCSREP _IOW('E', 0x03, int[2]) /* set repeat settings */ | 62 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ |
| 63 | #define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ | 63 | #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ |
| 64 | #define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ | 64 | #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ |
| 65 | 65 | ||
| 66 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ | 66 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ |
| 67 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ | 67 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ |
| @@ -1142,8 +1142,10 @@ struct input_dev { | |||
| 1142 | unsigned int keycodemax; | 1142 | unsigned int keycodemax; |
| 1143 | unsigned int keycodesize; | 1143 | unsigned int keycodesize; |
| 1144 | void *keycode; | 1144 | void *keycode; |
| 1145 | int (*setkeycode)(struct input_dev *dev, int scancode, int keycode); | 1145 | int (*setkeycode)(struct input_dev *dev, |
| 1146 | int (*getkeycode)(struct input_dev *dev, int scancode, int *keycode); | 1146 | unsigned int scancode, unsigned int keycode); |
| 1147 | int (*getkeycode)(struct input_dev *dev, | ||
| 1148 | unsigned int scancode, unsigned int *keycode); | ||
| 1147 | 1149 | ||
| 1148 | struct ff_device *ff; | 1150 | struct ff_device *ff; |
| 1149 | 1151 | ||
| @@ -1415,8 +1417,10 @@ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min | |||
| 1415 | dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis); | 1417 | dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis); |
| 1416 | } | 1418 | } |
| 1417 | 1419 | ||
| 1418 | int input_get_keycode(struct input_dev *dev, int scancode, int *keycode); | 1420 | int input_get_keycode(struct input_dev *dev, |
| 1419 | int input_set_keycode(struct input_dev *dev, int scancode, int keycode); | 1421 | unsigned int scancode, unsigned int *keycode); |
| 1422 | int input_set_keycode(struct input_dev *dev, | ||
| 1423 | unsigned int scancode, unsigned int keycode); | ||
| 1420 | 1424 | ||
| 1421 | extern struct class input_class; | 1425 | extern struct class input_class; |
| 1422 | 1426 | ||
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h index 51948eb6927a..b4ae570d3c98 100644 --- a/include/linux/spi/ads7846.h +++ b/include/linux/spi/ads7846.h | |||
| @@ -12,7 +12,7 @@ enum ads7846_filter { | |||
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | struct ads7846_platform_data { | 14 | struct ads7846_platform_data { |
| 15 | u16 model; /* 7843, 7845, 7846. */ | 15 | u16 model; /* 7843, 7845, 7846, 7873. */ |
| 16 | u16 vref_delay_usecs; /* 0 for external vref; etc */ | 16 | u16 vref_delay_usecs; /* 0 for external vref; etc */ |
| 17 | u16 vref_mv; /* external vref value, milliVolts */ | 17 | u16 vref_mv; /* external vref value, milliVolts */ |
| 18 | bool keep_vref_on; /* set to keep vref on for differential | 18 | bool keep_vref_on; /* set to keep vref on for differential |
| @@ -53,5 +53,6 @@ struct ads7846_platform_data { | |||
| 53 | int (*filter) (void *filter_data, int data_idx, int *val); | 53 | int (*filter) (void *filter_data, int data_idx, int *val); |
| 54 | void (*filter_cleanup)(void *filter_data); | 54 | void (*filter_cleanup)(void *filter_data); |
| 55 | void (*wait_for_sync)(void); | 55 | void (*wait_for_sync)(void); |
| 56 | bool wakeup; | ||
| 56 | }; | 57 | }; |
| 57 | 58 | ||
