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: wacom - add new Bamboo PT (0xdb)
Input: add input driver for polled GPIO buttons
Input: turbografx - fix reference counting
Input: synaptics - fix handling of 2-button ClickPads
Input: wacom - add IDs for two new Bamboo PTs
Input: document struct input_absinfo
Input: add keycodes for touchpad on/off keys
Input: usbtouchscreen - add support for LG Flatron T1710B

+317 -2
+1
drivers/input/joystick/turbografx.c
··· 245 goto err_free_tgfx; 246 } 247 248 return tgfx; 249 250 err_free_dev:
··· 245 goto err_free_tgfx; 246 } 247 248 + parport_put_port(pp); 249 return tgfx; 250 251 err_free_dev:
+16
drivers/input/keyboard/Kconfig
··· 179 To compile this driver as a module, choose M here: the 180 module will be called gpio_keys. 181 182 config KEYBOARD_TCA6416 183 tristate "TCA6416 Keypad Support" 184 depends on I2C
··· 179 To compile this driver as a module, choose M here: the 180 module will be called gpio_keys. 181 182 + config KEYBOARD_GPIO_POLLED 183 + tristate "Polled GPIO buttons" 184 + depends on GENERIC_GPIO 185 + select INPUT_POLLDEV 186 + help 187 + This driver implements support for buttons connected 188 + to GPIO pins that are not capable of generating interrupts. 189 + 190 + Say Y here if your device has buttons connected 191 + directly to such GPIO pins. Your board-specific 192 + setup logic must also provide a platform device, 193 + with configuration data saying which GPIOs are used. 194 + 195 + To compile this driver as a module, choose M here: the 196 + module will be called gpio_keys_polled. 197 + 198 config KEYBOARD_TCA6416 199 tristate "TCA6416 Keypad Support" 200 depends on I2C
+1
drivers/input/keyboard/Makefile
··· 14 obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o 15 obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o 16 obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o 17 obj-$(CONFIG_KEYBOARD_TCA6416) += tca6416-keypad.o 18 obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o 19 obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
··· 14 obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o 15 obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o 16 obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o 17 + obj-$(CONFIG_KEYBOARD_GPIO_POLLED) += gpio_keys_polled.o 18 obj-$(CONFIG_KEYBOARD_TCA6416) += tca6416-keypad.o 19 obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o 20 obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
+261
drivers/input/keyboard/gpio_keys_polled.c
···
··· 1 + /* 2 + * Driver for buttons on GPIO lines not capable of generating interrupts 3 + * 4 + * Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org> 5 + * Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com> 6 + * 7 + * This file was based on: /drivers/input/misc/cobalt_btns.c 8 + * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> 9 + * 10 + * also was based on: /drivers/input/keyboard/gpio_keys.c 11 + * Copyright 2005 Phil Blundell 12 + * 13 + * This program is free software; you can redistribute it and/or modify 14 + * it under the terms of the GNU General Public License version 2 as 15 + * published by the Free Software Foundation. 16 + */ 17 + 18 + #include <linux/kernel.h> 19 + #include <linux/module.h> 20 + #include <linux/init.h> 21 + #include <linux/slab.h> 22 + #include <linux/input.h> 23 + #include <linux/input-polldev.h> 24 + #include <linux/ioport.h> 25 + #include <linux/platform_device.h> 26 + #include <linux/gpio.h> 27 + #include <linux/gpio_keys.h> 28 + 29 + #define DRV_NAME "gpio-keys-polled" 30 + 31 + struct gpio_keys_button_data { 32 + int last_state; 33 + int count; 34 + int threshold; 35 + int can_sleep; 36 + }; 37 + 38 + struct gpio_keys_polled_dev { 39 + struct input_polled_dev *poll_dev; 40 + struct device *dev; 41 + struct gpio_keys_platform_data *pdata; 42 + struct gpio_keys_button_data data[0]; 43 + }; 44 + 45 + static void gpio_keys_polled_check_state(struct input_dev *input, 46 + struct gpio_keys_button *button, 47 + struct gpio_keys_button_data *bdata) 48 + { 49 + int state; 50 + 51 + if (bdata->can_sleep) 52 + state = !!gpio_get_value_cansleep(button->gpio); 53 + else 54 + state = !!gpio_get_value(button->gpio); 55 + 56 + if (state != bdata->last_state) { 57 + unsigned int type = button->type ?: EV_KEY; 58 + 59 + input_event(input, type, button->code, 60 + !!(state ^ button->active_low)); 61 + input_sync(input); 62 + bdata->count = 0; 63 + bdata->last_state = state; 64 + } 65 + } 66 + 67 + static void gpio_keys_polled_poll(struct input_polled_dev *dev) 68 + { 69 + struct gpio_keys_polled_dev *bdev = dev->private; 70 + struct gpio_keys_platform_data *pdata = bdev->pdata; 71 + struct input_dev *input = dev->input; 72 + int i; 73 + 74 + for (i = 0; i < bdev->pdata->nbuttons; i++) { 75 + struct gpio_keys_button_data *bdata = &bdev->data[i]; 76 + 77 + if (bdata->count < bdata->threshold) 78 + bdata->count++; 79 + else 80 + gpio_keys_polled_check_state(input, &pdata->buttons[i], 81 + bdata); 82 + } 83 + } 84 + 85 + static void gpio_keys_polled_open(struct input_polled_dev *dev) 86 + { 87 + struct gpio_keys_polled_dev *bdev = dev->private; 88 + struct gpio_keys_platform_data *pdata = bdev->pdata; 89 + 90 + if (pdata->enable) 91 + pdata->enable(bdev->dev); 92 + } 93 + 94 + static void gpio_keys_polled_close(struct input_polled_dev *dev) 95 + { 96 + struct gpio_keys_polled_dev *bdev = dev->private; 97 + struct gpio_keys_platform_data *pdata = bdev->pdata; 98 + 99 + if (pdata->disable) 100 + pdata->disable(bdev->dev); 101 + } 102 + 103 + static int __devinit gpio_keys_polled_probe(struct platform_device *pdev) 104 + { 105 + struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; 106 + struct device *dev = &pdev->dev; 107 + struct gpio_keys_polled_dev *bdev; 108 + struct input_polled_dev *poll_dev; 109 + struct input_dev *input; 110 + int error; 111 + int i; 112 + 113 + if (!pdata || !pdata->poll_interval) 114 + return -EINVAL; 115 + 116 + bdev = kzalloc(sizeof(struct gpio_keys_polled_dev) + 117 + pdata->nbuttons * sizeof(struct gpio_keys_button_data), 118 + GFP_KERNEL); 119 + if (!bdev) { 120 + dev_err(dev, "no memory for private data\n"); 121 + return -ENOMEM; 122 + } 123 + 124 + poll_dev = input_allocate_polled_device(); 125 + if (!poll_dev) { 126 + dev_err(dev, "no memory for polled device\n"); 127 + error = -ENOMEM; 128 + goto err_free_bdev; 129 + } 130 + 131 + poll_dev->private = bdev; 132 + poll_dev->poll = gpio_keys_polled_poll; 133 + poll_dev->poll_interval = pdata->poll_interval; 134 + poll_dev->open = gpio_keys_polled_open; 135 + poll_dev->close = gpio_keys_polled_close; 136 + 137 + input = poll_dev->input; 138 + 139 + input->evbit[0] = BIT(EV_KEY); 140 + input->name = pdev->name; 141 + input->phys = DRV_NAME"/input0"; 142 + input->dev.parent = &pdev->dev; 143 + 144 + input->id.bustype = BUS_HOST; 145 + input->id.vendor = 0x0001; 146 + input->id.product = 0x0001; 147 + input->id.version = 0x0100; 148 + 149 + for (i = 0; i < pdata->nbuttons; i++) { 150 + struct gpio_keys_button *button = &pdata->buttons[i]; 151 + struct gpio_keys_button_data *bdata = &bdev->data[i]; 152 + unsigned int gpio = button->gpio; 153 + unsigned int type = button->type ?: EV_KEY; 154 + 155 + if (button->wakeup) { 156 + dev_err(dev, DRV_NAME " does not support wakeup\n"); 157 + error = -EINVAL; 158 + goto err_free_gpio; 159 + } 160 + 161 + error = gpio_request(gpio, 162 + button->desc ? button->desc : DRV_NAME); 163 + if (error) { 164 + dev_err(dev, "unable to claim gpio %u, err=%d\n", 165 + gpio, error); 166 + goto err_free_gpio; 167 + } 168 + 169 + error = gpio_direction_input(gpio); 170 + if (error) { 171 + dev_err(dev, 172 + "unable to set direction on gpio %u, err=%d\n", 173 + gpio, error); 174 + goto err_free_gpio; 175 + } 176 + 177 + bdata->can_sleep = gpio_cansleep(gpio); 178 + bdata->last_state = -1; 179 + bdata->threshold = DIV_ROUND_UP(button->debounce_interval, 180 + pdata->poll_interval); 181 + 182 + input_set_capability(input, type, button->code); 183 + } 184 + 185 + bdev->poll_dev = poll_dev; 186 + bdev->dev = dev; 187 + bdev->pdata = pdata; 188 + platform_set_drvdata(pdev, bdev); 189 + 190 + error = input_register_polled_device(poll_dev); 191 + if (error) { 192 + dev_err(dev, "unable to register polled device, err=%d\n", 193 + error); 194 + goto err_free_gpio; 195 + } 196 + 197 + /* report initial state of the buttons */ 198 + for (i = 0; i < pdata->nbuttons; i++) 199 + gpio_keys_polled_check_state(input, &pdata->buttons[i], 200 + &bdev->data[i]); 201 + 202 + return 0; 203 + 204 + err_free_gpio: 205 + while (--i >= 0) 206 + gpio_free(pdata->buttons[i].gpio); 207 + 208 + input_free_polled_device(poll_dev); 209 + 210 + err_free_bdev: 211 + kfree(bdev); 212 + 213 + platform_set_drvdata(pdev, NULL); 214 + return error; 215 + } 216 + 217 + static int __devexit gpio_keys_polled_remove(struct platform_device *pdev) 218 + { 219 + struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev); 220 + struct gpio_keys_platform_data *pdata = bdev->pdata; 221 + int i; 222 + 223 + input_unregister_polled_device(bdev->poll_dev); 224 + 225 + for (i = 0; i < pdata->nbuttons; i++) 226 + gpio_free(pdata->buttons[i].gpio); 227 + 228 + input_free_polled_device(bdev->poll_dev); 229 + 230 + kfree(bdev); 231 + platform_set_drvdata(pdev, NULL); 232 + 233 + return 0; 234 + } 235 + 236 + static struct platform_driver gpio_keys_polled_driver = { 237 + .probe = gpio_keys_polled_probe, 238 + .remove = __devexit_p(gpio_keys_polled_remove), 239 + .driver = { 240 + .name = DRV_NAME, 241 + .owner = THIS_MODULE, 242 + }, 243 + }; 244 + 245 + static int __init gpio_keys_polled_init(void) 246 + { 247 + return platform_driver_register(&gpio_keys_polled_driver); 248 + } 249 + 250 + static void __exit gpio_keys_polled_exit(void) 251 + { 252 + platform_driver_unregister(&gpio_keys_polled_driver); 253 + } 254 + 255 + module_init(gpio_keys_polled_init); 256 + module_exit(gpio_keys_polled_exit); 257 + 258 + MODULE_LICENSE("GPL v2"); 259 + MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); 260 + MODULE_DESCRIPTION("Polled GPIO Buttons driver"); 261 + MODULE_ALIAS("platform:" DRV_NAME);
+2 -1
drivers/input/mouse/synaptics.h
··· 51 #define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20) 52 #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) 53 #define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16) 54 - #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100100) 55 #define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000) 56 57 /* synaptics modes query bits */
··· 51 #define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20) 52 #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) 53 #define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16) 54 + #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */ 55 + #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ 56 #define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000) 57 58 /* synaptics modes query bits */
+9
drivers/input/tablet/wacom_wac.c
··· 1436 { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; 1437 static struct wacom_features wacom_features_0xD3 = 1438 { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; 1439 1440 #define USB_DEVICE_WACOM(prod) \ 1441 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ ··· 1510 { USB_DEVICE_WACOM(0xD1) }, 1511 { USB_DEVICE_WACOM(0xD2) }, 1512 { USB_DEVICE_WACOM(0xD3) }, 1513 { USB_DEVICE_WACOM(0xF0) }, 1514 { USB_DEVICE_WACOM(0xCC) }, 1515 { USB_DEVICE_WACOM(0x90) },
··· 1436 { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; 1437 static struct wacom_features wacom_features_0xD3 = 1438 { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; 1439 + static struct wacom_features wacom_features_0xD8 = 1440 + { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; 1441 + static struct wacom_features wacom_features_0xDA = 1442 + { "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; 1443 + static struct wacom_features wacom_features_0xDB = 1444 + { "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; 1445 1446 #define USB_DEVICE_WACOM(prod) \ 1447 USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ ··· 1504 { USB_DEVICE_WACOM(0xD1) }, 1505 { USB_DEVICE_WACOM(0xD2) }, 1506 { USB_DEVICE_WACOM(0xD3) }, 1507 + { USB_DEVICE_WACOM(0xD8) }, 1508 + { USB_DEVICE_WACOM(0xDA) }, 1509 + { USB_DEVICE_WACOM(0xDB) }, 1510 { USB_DEVICE_WACOM(0xF0) }, 1511 { USB_DEVICE_WACOM(0xCC) }, 1512 { USB_DEVICE_WACOM(0x90) },
+1
drivers/input/touchscreen/usbtouchscreen.c
··· 178 179 #ifdef CONFIG_TOUCHSCREEN_USB_ITM 180 {USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM}, 181 #endif 182 183 #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO
··· 178 179 #ifdef CONFIG_TOUCHSCREEN_USB_ITM 180 {USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM}, 181 + {USB_DEVICE(0x16e3, 0xf9e9), .driver_info = DEVTYPE_ITM}, 182 #endif 183 184 #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO
+2
include/linux/gpio_keys.h
··· 16 struct gpio_keys_platform_data { 17 struct gpio_keys_button *buttons; 18 int nbuttons; 19 unsigned int rep:1; /* enable input subsystem auto repeat */ 20 int (*enable)(struct device *dev); 21 void (*disable)(struct device *dev);
··· 16 struct gpio_keys_platform_data { 17 struct gpio_keys_button *buttons; 18 int nbuttons; 19 + unsigned int poll_interval; /* polling interval in msecs - 20 + for polling driver only */ 21 unsigned int rep:1; /* enable input subsystem auto repeat */ 22 int (*enable)(struct device *dev); 23 void (*disable)(struct device *dev);
+24 -1
include/linux/input.h
··· 47 __u16 version; 48 }; 49 50 struct input_absinfo { 51 __s32 value; 52 __s32 minimum; ··· 643 #define KEY_CAMERA_FOCUS 0x210 644 #define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */ 645 646 #define BTN_TRIGGER_HAPPY 0x2c0 647 #define BTN_TRIGGER_HAPPY1 0x2c0 648 #define BTN_TRIGGER_HAPPY2 0x2c1 ··· 1153 * of tracked contacts 1154 * @mtsize: number of MT slots the device uses 1155 * @slot: MT slot currently being transmitted 1156 - * @absinfo: array of &struct absinfo elements holding information 1157 * about absolute axes (current value, min, max, flat, fuzz, 1158 * resolution) 1159 * @key: reflects current state of device's keys/buttons
··· 47 __u16 version; 48 }; 49 50 + /** 51 + * struct input_absinfo - used by EVIOCGABS/EVIOCSABS ioctls 52 + * @value: latest reported value for the axis. 53 + * @minimum: specifies minimum value for the axis. 54 + * @maximum: specifies maximum value for the axis. 55 + * @fuzz: specifies fuzz value that is used to filter noise from 56 + * the event stream. 57 + * @flat: values that are within this value will be discarded by 58 + * joydev interface and reported as 0 instead. 59 + * @resolution: specifies resolution for the values reported for 60 + * the axis. 61 + * 62 + * Note that input core does not clamp reported values to the 63 + * [minimum, maximum] limits, such task is left to userspace. 64 + * 65 + * Resolution for main axes (ABS_X, ABS_Y, ABS_Z) is reported in 66 + * units per millimeter (units/mm), resolution for rotational axes 67 + * (ABS_RX, ABS_RY, ABS_RZ) is reported in units per radian. 68 + */ 69 struct input_absinfo { 70 __s32 value; 71 __s32 minimum; ··· 624 #define KEY_CAMERA_FOCUS 0x210 625 #define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */ 626 627 + #define KEY_TOUCHPAD_TOGGLE 0x212 /* Request switch touchpad on or off */ 628 + #define KEY_TOUCHPAD_ON 0x213 629 + #define KEY_TOUCHPAD_OFF 0x214 630 + 631 #define BTN_TRIGGER_HAPPY 0x2c0 632 #define BTN_TRIGGER_HAPPY1 0x2c0 633 #define BTN_TRIGGER_HAPPY2 0x2c1 ··· 1130 * of tracked contacts 1131 * @mtsize: number of MT slots the device uses 1132 * @slot: MT slot currently being transmitted 1133 + * @absinfo: array of &struct input_absinfo elements holding information 1134 * about absolute axes (current value, min, max, flat, fuzz, 1135 * resolution) 1136 * @key: reflects current state of device's keys/buttons