Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull input updates from Dmitry Torokhov:
- big update to Wacom driver by Benjamin Tissoires, converting it to
HID infrastructure and unifying USB and Bluetooth models
- large update to ALPS driver by Hans de Goede, which adds support for
newer touchpad models as well as cleans up and restructures the code
- more changes to Atmel MXT driver, including device tree support
- new driver for iPaq x3xxx touchscreen
- driver for serial Wacom tablets
- driver for Microchip's CAP1106
- assorted cleanups and improvements to existing drover and input core

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (93 commits)
Input: wacom - update the ABI doc according to latest changes
Input: wacom - only register once the MODULE_* macros
Input: HID - remove hid-wacom Bluetooth driver
Input: wacom - add copyright note and bump version to 2.0
Input: wacom - remove passing id for wacom_set_report
Input: wacom - check for bluetooth protocol while setting OLEDs
Input: wacom - handle Intuos 4 BT in wacom.ko
Input: wacom - handle Graphire BT tablets in wacom.ko
Input: wacom - prepare the driver to include BT devices
Input: hyperv-keyboard - register as a wakeup source
Input: imx_keypad - remove ifdef round PM methods
Input: jornada720_ts - get rid of space indentation and use tab
Input: jornada720_ts - switch to using managed resources
Input: alps - Rushmore and v7 resolution support
Input: mcs5000_ts - remove ifdef around power management methods
Input: mcs5000_ts - protect PM functions with CONFIG_PM_SLEEP
Input: ads7846 - release resources on failure for clean exit
Input: wacom - add support for 0x12C ISDv4 sensor
Input: atmel_mxt_ts - use deep sleep mode when stopped
ARM: dts: am437x-gp-evm: Update binding for touchscreen size
...

+5394 -3764
+27 -43
Documentation/ABI/testing/sysfs-driver-wacom
··· 1 - WWhat: /sys/class/hidraw/hidraw*/device/oled*_img 2 - Date: June 2012 3 - Contact: linux-bluetooth@vger.kernel.org 4 - Description: 5 - The /sys/class/hidraw/hidraw*/device/oled*_img files control 6 - OLED mocro displays on Intuos4 Wireless tablet. Accepted image 7 - has to contain 256 bytes (64x32 px 1 bit colour). The format 8 - is the same as PBM image 62x32px without header (64 bits per 9 - horizontal line, 32 lines). An example of setting OLED No. 0: 10 - dd bs=256 count=1 if=img_file of=[path to oled0_img]/oled0_img 11 - The attribute is read only and no local copy of the image is 12 - stored. 13 - 14 - What: /sys/class/hidraw/hidraw*/device/speed 1 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/speed 15 2 Date: April 2010 16 3 Kernel Version: 2.6.35 17 4 Contact: linux-bluetooth@vger.kernel.org 18 5 Description: 19 - The /sys/class/hidraw/hidraw*/device/speed file controls 20 - reporting speed of Wacom bluetooth tablet. Reading from 21 - this file returns 1 if tablet reports in high speed mode 6 + The /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/speed file 7 + controls reporting speed of Wacom bluetooth tablet. Reading 8 + from this file returns 1 if tablet reports in high speed mode 22 9 or 0 otherwise. Writing to this file one of these values 23 10 switches reporting speed. 24 11 25 - What: /sys/class/leds/0005\:056A\:00BD.0001\:selector\:*/ 26 - Date: May 2012 27 - Kernel Version: 3.5 28 - Contact: linux-bluetooth@vger.kernel.org 29 - Description: 30 - LED selector for Intuos4 WL. There are 4 leds, but only one LED 31 - can be lit at a time. Max brightness is 127. 32 - 33 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/led 34 - Date: August 2011 12 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/led 13 + Date: August 2014 35 14 Contact: linux-input@vger.kernel.org 36 15 Description: 37 16 Attribute group for control of the status LEDs and the OLEDs. 38 17 This attribute group is only available for Intuos 4 M, L, 39 - and XL (with LEDs and OLEDs), Intuos 5 (LEDs only), and Cintiq 40 - 21UX2 and Cintiq 24HD (LEDs only). Therefore its presence 41 - implicitly signifies the presence of said LEDs and OLEDs on the 42 - tablet device. 18 + and XL (with LEDs and OLEDs), Intuos 4 WL, Intuos 5 (LEDs only), 19 + Intuos Pro (LEDs only) and Cintiq 21UX2 and Cintiq 24HD 20 + (LEDs only). Therefore its presence implicitly signifies the 21 + presence of said LEDs and OLEDs on the tablet device. 43 22 44 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status0_luminance 45 - Date: August 2011 23 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/status0_luminance 24 + Date: August 2014 46 25 Contact: linux-input@vger.kernel.org 47 26 Description: 48 27 Writing to this file sets the status LED luminance (1..127) ··· 29 50 button is pressed on the stylus. This luminance level is 30 51 normally lower than the level when a button is pressed. 31 52 32 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status1_luminance 33 - Date: August 2011 53 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/status1_luminance 54 + Date: August 2014 34 55 Contact: linux-input@vger.kernel.org 35 56 Description: 36 57 Writing to this file sets the status LED luminance (1..127) 37 58 when the stylus touches the tablet surface, or any button is 38 59 pressed on the stylus. 39 60 40 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led0_select 41 - Date: August 2011 61 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/status_led0_select 62 + Date: August 2014 42 63 Contact: linux-input@vger.kernel.org 43 64 Description: 44 65 Writing to this file sets which one of the four (for Intuos 4 ··· 46 67 24HD) status LEDs is active (0..3). The other three LEDs on the 47 68 same side are always inactive. 48 69 49 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led1_select 50 - Date: September 2011 70 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/status_led1_select 71 + Date: August 2014 51 72 Contact: linux-input@vger.kernel.org 52 73 Description: 53 74 Writing to this file sets which one of the left four (for Cintiq 21UX2 54 75 and Cintiq 24HD) status LEDs is active (0..3). The other three LEDs on 55 76 the left are always inactive. 56 77 57 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/buttons_luminance 58 - Date: August 2011 78 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/buttons_luminance 79 + Date: August 2014 59 80 Contact: linux-input@vger.kernel.org 60 81 Description: 61 82 Writing to this file sets the overall luminance level (0..15) 62 83 of all eight button OLED displays. 63 84 64 - What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/button<n>_rawimg 65 - Date: August 2011 85 + What: /sys/bus/hid/devices/<bus>:<vid>:<pid>.<n>/wacom_led/button<n>_rawimg 86 + Date: August 2014 66 87 Contact: linux-input@vger.kernel.org 67 88 Description: 68 89 When writing a 1024 byte raw image in Wacom Intuos 4 ··· 72 93 byte chunk encodes the image data for two consecutive lines on 73 94 the display. The low nibble of each byte contains the first 74 95 line, and the high nibble contains the second line. 96 + When the Wacom Intuos 4 is connected over Bluetooth, the 97 + image has to contain 256 bytes (64x32 px 1 bit colour). 98 + The format is also scrambled, like in the USB mode, and it can 99 + be summarized by converting 76543210 into GECA6420. 100 + HGFEDCBA HFDB7531
+25
Documentation/devicetree/bindings/input/atmel,maxtouch.txt
··· 1 + Atmel maXTouch touchscreen/touchpad 2 + 3 + Required properties: 4 + - compatible: 5 + atmel,maxtouch 6 + 7 + - reg: The I2C address of the device 8 + 9 + - interrupts: The sink for the touchpad's IRQ output 10 + See ../interrupt-controller/interrupts.txt 11 + 12 + Optional properties for main touchpad device: 13 + 14 + - linux,gpio-keymap: An array of up to 4 entries indicating the Linux 15 + keycode generated by each GPIO. Linux keycodes are defined in 16 + <dt-bindings/input/input.h>. 17 + 18 + Example: 19 + 20 + touch@4b { 21 + compatible = "atmel,maxtouch"; 22 + reg = <0x4b>; 23 + interrupt-parent = <&gpio>; 24 + interrupts = <TEGRA_GPIO(W, 3) IRQ_TYPE_LEVEL_LOW>; 25 + };
+53
Documentation/devicetree/bindings/input/cap1106.txt
··· 1 + Device tree bindings for Microchip CAP1106, 6 channel capacitive touch sensor 2 + 3 + The node for this driver must be a child of a I2C controller node, as the 4 + device communication via I2C only. 5 + 6 + Required properties: 7 + 8 + compatible: Must be "microchip,cap1106" 9 + 10 + reg: The I2C slave address of the device. 11 + Only 0x28 is valid. 12 + 13 + interrupts: Property describing the interrupt line the 14 + device's ALERT#/CM_IRQ# pin is connected to. 15 + The device only has one interrupt source. 16 + 17 + Optional properties: 18 + 19 + autorepeat: Enables the Linux input system's autorepeat 20 + feature on the input device. 21 + 22 + microchip,sensor-gain: Defines the gain of the sensor circuitry. This 23 + effectively controls the sensitivity, as a 24 + smaller delta capacitance is required to 25 + generate the same delta count values. 26 + Valid values are 1, 2, 4, and 8. 27 + By default, a gain of 1 is set. 28 + 29 + linux,keycodes: Specifies an array of numeric keycode values to 30 + be used for the channels. If this property is 31 + omitted, KEY_A, KEY_B, etc are used as 32 + defaults. The array must have exactly six 33 + entries. 34 + 35 + Example: 36 + 37 + i2c_controller { 38 + cap1106@28 { 39 + compatible = "microchip,cap1106"; 40 + interrupt-parent = <&gpio1>; 41 + interrupts = <0 0>; 42 + reg = <0x28>; 43 + autorepeat; 44 + microchip,sensor-gain = <2>; 45 + 46 + linux,keycodes = <103 /* KEY_UP */ 47 + 106 /* KEY_RIGHT */ 48 + 108 /* KEY_DOWN */ 49 + 105 /* KEY_LEFT */ 50 + 109 /* KEY_PAGEDOWN */ 51 + 104>; /* KEY_PAGEUP */ 52 + }; 53 + }
+26
Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
··· 1 + * Pixcir I2C touchscreen controllers 2 + 3 + Required properties: 4 + - compatible: must be "pixcir,pixcir_ts" or "pixcir,pixcir_tangoc" 5 + - reg: I2C address of the chip 6 + - interrupts: interrupt to which the chip is connected 7 + - attb-gpio: GPIO connected to the ATTB line of the chip 8 + - touchscreen-size-x: horizontal resolution of touchscreen (in pixels) 9 + - touchscreen-size-y: vertical resolution of touchscreen (in pixels) 10 + 11 + Example: 12 + 13 + i2c@00000000 { 14 + /* ... */ 15 + 16 + pixcir_ts@5c { 17 + compatible = "pixcir,pixcir_ts"; 18 + reg = <0x5c>; 19 + interrupts = <2 0>; 20 + attb-gpio = <&gpf 2 0 2>; 21 + touchscreen-size-x = <800>; 22 + touchscreen-size-y = <600>; 23 + }; 24 + 25 + /* ... */ 26 + };
+4
Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt
··· 9 9 - x-size: horizontal resolution of touchscreen 10 10 - y-size: vertical resolution of touchscreen 11 11 12 + Optional properties: 13 + - vdd-supply: Regulator controlling the controller supply 14 + 12 15 Example: 13 16 14 17 i2c@00000000 { ··· 21 18 compatible = "neonode,zforce"; 22 19 reg = <0x50>; 23 20 interrupts = <2 0>; 21 + vdd-supply = <&reg_zforce_vdd>; 24 22 25 23 gpios = <&gpio5 6 0>, /* INT */ 26 24 <&gpio5 9 0>; /* RST */
+1
Documentation/devicetree/bindings/vendor-prefixes.txt
··· 103 103 phytec PHYTEC Messtechnik GmbH 104 104 picochip Picochip Ltd 105 105 plathome Plat'Home Co., Ltd. 106 + pixcir PIXCIR MICROELECTRONICS Co., Ltd 106 107 powervr PowerVR (deprecated, use img) 107 108 qca Qualcomm Atheros, Inc. 108 109 qcom Qualcomm Technologies, Inc
+7
MAINTAINERS
··· 9877 9877 S: Maintained 9878 9878 F: drivers/mmc/host/wbsd.* 9879 9879 9880 + WACOM PROTOCOL 4 SERIAL TABLETS 9881 + M: Julian Squires <julian@cipht.net> 9882 + M: Hans de Goede <hdegoede@redhat.com> 9883 + L: linux-input@vger.kernel.org 9884 + S: Maintained 9885 + F: drivers/input/tablet/wacom_serial4.c 9886 + 9880 9887 WATCHDOG DEVICE DRIVERS 9881 9888 M: Wim Van Sebroeck <wim@iguana.be> 9882 9889 L: linux-watchdog@vger.kernel.org
+2 -2
arch/arm/boot/dts/am437x-gp-evm.dts
··· 334 334 335 335 attb-gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>; 336 336 337 - x-size = <1024>; 338 - y-size = <600>; 337 + touchscreen-size-x = <1024>; 338 + touchscreen-size-y = <600>; 339 339 }; 340 340 }; 341 341
+2 -2
arch/arm/boot/dts/am43x-epos-evm.dts
··· 403 403 404 404 attb-gpio = <&gpio1 17 GPIO_ACTIVE_HIGH>; 405 405 406 - x-size = <1024>; 407 - y-size = <600>; 406 + touchscreen-size-x = <1024>; 407 + touchscreen-size-y = <600>; 408 408 }; 409 409 }; 410 410
+9 -4
drivers/hid/Kconfig
··· 764 764 Rumble Force or Force Feedback Wheel. 765 765 766 766 config HID_WACOM 767 - tristate "Wacom Bluetooth devices support" 767 + tristate "Wacom Intuos/Graphire tablet support (USB)" 768 768 depends on HID 769 - depends on LEDS_CLASS 770 769 select POWER_SUPPLY 771 - ---help--- 772 - Support for Wacom Graphire Bluetooth and Intuos4 WL tablets. 770 + select NEW_LEDS 771 + select LEDS_CLASS 772 + help 773 + Say Y here if you want to use the USB or BT version of the Wacom Intuos 774 + or Graphire tablet. 775 + 776 + To compile this driver as a module, choose M here: the 777 + module will be called wacom. 773 778 774 779 config HID_WIIMOTE 775 780 tristate "Nintendo Wii / Wii U peripherals"
+3 -1
drivers/hid/Makefile
··· 116 116 obj-$(CONFIG_HID_XINMO) += hid-xinmo.o 117 117 obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o 118 118 obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o 119 - obj-$(CONFIG_HID_WACOM) += hid-wacom.o 119 + 120 + wacom-objs := wacom_wac.o wacom_sys.o 121 + obj-$(CONFIG_HID_WACOM) += wacom.o 120 122 obj-$(CONFIG_HID_WALTOP) += hid-waltop.o 121 123 obj-$(CONFIG_HID_WIIMOTE) += hid-wiimote.o 122 124 obj-$(CONFIG_HID_SENSOR_HUB) += hid-sensor-hub.o
+9 -3
drivers/hid/hid-core.c
··· 789 789 /* hid-rmi should take care of them, not hid-generic */ 790 790 hid->group = HID_GROUP_RMI; 791 791 792 + /* 793 + * Vendor specific handlings 794 + */ 795 + switch (hid->vendor) { 796 + case USB_VENDOR_ID_WACOM: 797 + hid->group = HID_GROUP_WACOM; 798 + break; 799 + } 800 + 792 801 vfree(parser); 793 802 return 0; 794 803 } ··· 1947 1938 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) }, 1948 1939 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) }, 1949 1940 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) }, 1950 - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, 1951 - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, 1952 1941 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) }, 1953 1942 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) }, 1954 1943 { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) }, ··· 2352 2345 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, 2353 2346 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, 2354 2347 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, 2355 - { HID_USB_DEVICE(USB_VENDOR_ID_WACOM, HID_ANY_ID) }, 2356 2348 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20) }, 2357 2349 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) }, 2358 2350 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) },
-973
drivers/hid/hid-wacom.c
··· 1 - /* 2 - * Bluetooth Wacom Tablet support 3 - * 4 - * Copyright (c) 1999 Andreas Gal 5 - * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> 6 - * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc 7 - * Copyright (c) 2006-2007 Jiri Kosina 8 - * Copyright (c) 2008 Jiri Slaby <jirislaby@gmail.com> 9 - * Copyright (c) 2006 Andrew Zabolotny <zap@homelink.ru> 10 - * Copyright (c) 2009 Bastien Nocera <hadess@hadess.net> 11 - * Copyright (c) 2011 Przemysław Firszt <przemo@firszt.eu> 12 - */ 13 - 14 - /* 15 - * This program is free software; you can redistribute it and/or modify it 16 - * under the terms of the GNU General Public License as published by the Free 17 - * Software Foundation; either version 2 of the License, or (at your option) 18 - * any later version. 19 - */ 20 - 21 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 22 - 23 - #include <linux/device.h> 24 - #include <linux/hid.h> 25 - #include <linux/module.h> 26 - #include <linux/leds.h> 27 - #include <linux/slab.h> 28 - #include <linux/power_supply.h> 29 - 30 - #include "hid-ids.h" 31 - 32 - #define PAD_DEVICE_ID 0x0F 33 - 34 - #define WAC_CMD_LED_CONTROL 0x20 35 - #define WAC_CMD_ICON_START_STOP 0x21 36 - #define WAC_CMD_ICON_TRANSFER 0x26 37 - 38 - struct wacom_data { 39 - __u16 tool; 40 - __u16 butstate; 41 - __u8 whlstate; 42 - __u8 features; 43 - __u32 id; 44 - __u32 serial; 45 - unsigned char high_speed; 46 - __u8 battery_capacity; 47 - __u8 power_raw; 48 - __u8 ps_connected; 49 - __u8 bat_charging; 50 - struct power_supply battery; 51 - struct power_supply ac; 52 - __u8 led_selector; 53 - struct led_classdev *leds[4]; 54 - }; 55 - 56 - /*percent of battery capacity for Graphire 57 - 8th value means AC online and show 100% capacity */ 58 - static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 }; 59 - /*percent of battery capacity for Intuos4 WL, AC has a separate bit*/ 60 - static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 }; 61 - 62 - static enum power_supply_property wacom_battery_props[] = { 63 - POWER_SUPPLY_PROP_PRESENT, 64 - POWER_SUPPLY_PROP_CAPACITY, 65 - POWER_SUPPLY_PROP_SCOPE, 66 - POWER_SUPPLY_PROP_STATUS, 67 - }; 68 - 69 - static enum power_supply_property wacom_ac_props[] = { 70 - POWER_SUPPLY_PROP_PRESENT, 71 - POWER_SUPPLY_PROP_ONLINE, 72 - POWER_SUPPLY_PROP_SCOPE, 73 - }; 74 - 75 - static void wacom_scramble(__u8 *image) 76 - { 77 - __u16 mask; 78 - __u16 s1; 79 - __u16 s2; 80 - __u16 r1 ; 81 - __u16 r2 ; 82 - __u16 r; 83 - __u8 buf[256]; 84 - int i, w, x, y, z; 85 - 86 - for (x = 0; x < 32; x++) { 87 - for (y = 0; y < 8; y++) 88 - buf[(8 * x) + (7 - y)] = image[(8 * x) + y]; 89 - } 90 - 91 - /* Change 76543210 into GECA6420 as required by Intuos4 WL 92 - * HGFEDCBA HFDB7531 93 - */ 94 - for (x = 0; x < 4; x++) { 95 - for (y = 0; y < 4; y++) { 96 - for (z = 0; z < 8; z++) { 97 - mask = 0x0001; 98 - r1 = 0; 99 - r2 = 0; 100 - i = (x << 6) + (y << 4) + z; 101 - s1 = buf[i]; 102 - s2 = buf[i+8]; 103 - for (w = 0; w < 8; w++) { 104 - r1 |= (s1 & mask); 105 - r2 |= (s2 & mask); 106 - s1 <<= 1; 107 - s2 <<= 1; 108 - mask <<= 2; 109 - } 110 - r = r1 | (r2 << 1); 111 - i = (x << 6) + (y << 4) + (z << 1); 112 - image[i] = 0xFF & r; 113 - image[i+1] = (0xFF00 & r) >> 8; 114 - } 115 - } 116 - } 117 - } 118 - 119 - static void wacom_set_image(struct hid_device *hdev, const char *image, 120 - __u8 icon_no) 121 - { 122 - __u8 rep_data[68]; 123 - __u8 p[256]; 124 - int ret, i, j; 125 - 126 - for (i = 0; i < 256; i++) 127 - p[i] = image[i]; 128 - 129 - rep_data[0] = WAC_CMD_ICON_START_STOP; 130 - rep_data[1] = 0; 131 - ret = hid_hw_raw_request(hdev, rep_data[0], rep_data, 2, 132 - HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 133 - if (ret < 0) 134 - goto err; 135 - 136 - rep_data[0] = WAC_CMD_ICON_TRANSFER; 137 - rep_data[1] = icon_no & 0x07; 138 - 139 - wacom_scramble(p); 140 - 141 - for (i = 0; i < 4; i++) { 142 - for (j = 0; j < 64; j++) 143 - rep_data[j + 3] = p[(i << 6) + j]; 144 - 145 - rep_data[2] = i; 146 - ret = hid_hw_raw_request(hdev, rep_data[0], rep_data, 67, 147 - HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 148 - } 149 - 150 - rep_data[0] = WAC_CMD_ICON_START_STOP; 151 - rep_data[1] = 0; 152 - 153 - ret = hid_hw_raw_request(hdev, rep_data[0], rep_data, 2, 154 - HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 155 - 156 - err: 157 - return; 158 - } 159 - 160 - static void wacom_leds_set_brightness(struct led_classdev *led_dev, 161 - enum led_brightness value) 162 - { 163 - struct device *dev = led_dev->dev->parent; 164 - struct hid_device *hdev; 165 - struct wacom_data *wdata; 166 - unsigned char *buf; 167 - __u8 led = 0; 168 - int i; 169 - 170 - hdev = container_of(dev, struct hid_device, dev); 171 - wdata = hid_get_drvdata(hdev); 172 - for (i = 0; i < 4; ++i) { 173 - if (wdata->leds[i] == led_dev) 174 - wdata->led_selector = i; 175 - } 176 - 177 - led = wdata->led_selector | 0x04; 178 - buf = kzalloc(9, GFP_KERNEL); 179 - if (buf) { 180 - buf[0] = WAC_CMD_LED_CONTROL; 181 - buf[1] = led; 182 - buf[2] = value >> 2; 183 - buf[3] = value; 184 - /* use fixed brightness for OLEDs */ 185 - buf[4] = 0x08; 186 - hid_hw_raw_request(hdev, buf[0], buf, 9, HID_FEATURE_REPORT, 187 - HID_REQ_SET_REPORT); 188 - kfree(buf); 189 - } 190 - 191 - return; 192 - } 193 - 194 - static enum led_brightness wacom_leds_get_brightness(struct led_classdev *led_dev) 195 - { 196 - struct wacom_data *wdata; 197 - struct device *dev = led_dev->dev->parent; 198 - int value = 0; 199 - int i; 200 - 201 - wdata = hid_get_drvdata(container_of(dev, struct hid_device, dev)); 202 - 203 - for (i = 0; i < 4; ++i) { 204 - if (wdata->leds[i] == led_dev) { 205 - value = wdata->leds[i]->brightness; 206 - break; 207 - } 208 - } 209 - 210 - return value; 211 - } 212 - 213 - 214 - static int wacom_initialize_leds(struct hid_device *hdev) 215 - { 216 - struct wacom_data *wdata = hid_get_drvdata(hdev); 217 - struct led_classdev *led; 218 - struct device *dev = &hdev->dev; 219 - size_t namesz = strlen(dev_name(dev)) + 12; 220 - char *name; 221 - int i, ret; 222 - 223 - wdata->led_selector = 0; 224 - 225 - for (i = 0; i < 4; i++) { 226 - led = kzalloc(sizeof(struct led_classdev) + namesz, GFP_KERNEL); 227 - if (!led) { 228 - hid_warn(hdev, 229 - "can't allocate memory for LED selector\n"); 230 - ret = -ENOMEM; 231 - goto err; 232 - } 233 - 234 - name = (void *)&led[1]; 235 - snprintf(name, namesz, "%s:selector:%d", dev_name(dev), i); 236 - led->name = name; 237 - led->brightness = 0; 238 - led->max_brightness = 127; 239 - led->brightness_get = wacom_leds_get_brightness; 240 - led->brightness_set = wacom_leds_set_brightness; 241 - 242 - wdata->leds[i] = led; 243 - 244 - ret = led_classdev_register(dev, wdata->leds[i]); 245 - 246 - if (ret) { 247 - wdata->leds[i] = NULL; 248 - kfree(led); 249 - hid_warn(hdev, "can't register LED\n"); 250 - goto err; 251 - } 252 - } 253 - 254 - err: 255 - return ret; 256 - } 257 - 258 - static void wacom_destroy_leds(struct hid_device *hdev) 259 - { 260 - struct wacom_data *wdata = hid_get_drvdata(hdev); 261 - struct led_classdev *led; 262 - int i; 263 - 264 - for (i = 0; i < 4; ++i) { 265 - if (wdata->leds[i]) { 266 - led = wdata->leds[i]; 267 - wdata->leds[i] = NULL; 268 - led_classdev_unregister(led); 269 - kfree(led); 270 - } 271 - } 272 - 273 - } 274 - 275 - static int wacom_battery_get_property(struct power_supply *psy, 276 - enum power_supply_property psp, 277 - union power_supply_propval *val) 278 - { 279 - struct wacom_data *wdata = container_of(psy, 280 - struct wacom_data, battery); 281 - int ret = 0; 282 - 283 - switch (psp) { 284 - case POWER_SUPPLY_PROP_PRESENT: 285 - val->intval = 1; 286 - break; 287 - case POWER_SUPPLY_PROP_SCOPE: 288 - val->intval = POWER_SUPPLY_SCOPE_DEVICE; 289 - break; 290 - case POWER_SUPPLY_PROP_CAPACITY: 291 - val->intval = wdata->battery_capacity; 292 - break; 293 - case POWER_SUPPLY_PROP_STATUS: 294 - if (wdata->bat_charging) 295 - val->intval = POWER_SUPPLY_STATUS_CHARGING; 296 - else 297 - if (wdata->battery_capacity == 100 && wdata->ps_connected) 298 - val->intval = POWER_SUPPLY_STATUS_FULL; 299 - else 300 - val->intval = POWER_SUPPLY_STATUS_DISCHARGING; 301 - break; 302 - default: 303 - ret = -EINVAL; 304 - break; 305 - } 306 - return ret; 307 - } 308 - 309 - static int wacom_ac_get_property(struct power_supply *psy, 310 - enum power_supply_property psp, 311 - union power_supply_propval *val) 312 - { 313 - struct wacom_data *wdata = container_of(psy, struct wacom_data, ac); 314 - int ret = 0; 315 - 316 - switch (psp) { 317 - case POWER_SUPPLY_PROP_PRESENT: 318 - /* fall through */ 319 - case POWER_SUPPLY_PROP_ONLINE: 320 - val->intval = wdata->ps_connected; 321 - break; 322 - case POWER_SUPPLY_PROP_SCOPE: 323 - val->intval = POWER_SUPPLY_SCOPE_DEVICE; 324 - break; 325 - default: 326 - ret = -EINVAL; 327 - break; 328 - } 329 - return ret; 330 - } 331 - 332 - static void wacom_set_features(struct hid_device *hdev, u8 speed) 333 - { 334 - struct wacom_data *wdata = hid_get_drvdata(hdev); 335 - int limit, ret; 336 - __u8 rep_data[2]; 337 - 338 - switch (hdev->product) { 339 - case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH: 340 - rep_data[0] = 0x03 ; rep_data[1] = 0x00; 341 - limit = 3; 342 - do { 343 - ret = hid_hw_raw_request(hdev, rep_data[0], rep_data, 2, 344 - HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 345 - } while (ret < 0 && limit-- > 0); 346 - 347 - if (ret >= 0) { 348 - if (speed == 0) 349 - rep_data[0] = 0x05; 350 - else 351 - rep_data[0] = 0x06; 352 - 353 - rep_data[1] = 0x00; 354 - limit = 3; 355 - do { 356 - ret = hid_hw_raw_request(hdev, rep_data[0], 357 - rep_data, 2, HID_FEATURE_REPORT, 358 - HID_REQ_SET_REPORT); 359 - } while (ret < 0 && limit-- > 0); 360 - 361 - if (ret >= 0) { 362 - wdata->high_speed = speed; 363 - return; 364 - } 365 - } 366 - 367 - /* 368 - * Note that if the raw queries fail, it's not a hard failure 369 - * and it is safe to continue 370 - */ 371 - hid_warn(hdev, "failed to poke device, command %d, err %d\n", 372 - rep_data[0], ret); 373 - break; 374 - case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: 375 - if (speed == 1) 376 - wdata->features &= ~0x20; 377 - else 378 - wdata->features |= 0x20; 379 - 380 - rep_data[0] = 0x03; 381 - rep_data[1] = wdata->features; 382 - 383 - ret = hid_hw_raw_request(hdev, rep_data[0], rep_data, 2, 384 - HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 385 - if (ret >= 0) 386 - wdata->high_speed = speed; 387 - break; 388 - } 389 - 390 - return; 391 - } 392 - 393 - static ssize_t wacom_show_speed(struct device *dev, 394 - struct device_attribute 395 - *attr, char *buf) 396 - { 397 - struct wacom_data *wdata = dev_get_drvdata(dev); 398 - 399 - return snprintf(buf, PAGE_SIZE, "%i\n", wdata->high_speed); 400 - } 401 - 402 - static ssize_t wacom_store_speed(struct device *dev, 403 - struct device_attribute *attr, 404 - const char *buf, size_t count) 405 - { 406 - struct hid_device *hdev = container_of(dev, struct hid_device, dev); 407 - int new_speed; 408 - 409 - if (sscanf(buf, "%1d", &new_speed ) != 1) 410 - return -EINVAL; 411 - 412 - if (new_speed == 0 || new_speed == 1) { 413 - wacom_set_features(hdev, new_speed); 414 - return strnlen(buf, PAGE_SIZE); 415 - } else 416 - return -EINVAL; 417 - } 418 - 419 - static DEVICE_ATTR(speed, S_IRUGO | S_IWUSR | S_IWGRP, 420 - wacom_show_speed, wacom_store_speed); 421 - 422 - #define WACOM_STORE(OLED_ID) \ 423 - static ssize_t wacom_oled##OLED_ID##_store(struct device *dev, \ 424 - struct device_attribute *attr, \ 425 - const char *buf, size_t count) \ 426 - { \ 427 - struct hid_device *hdev = container_of(dev, struct hid_device, \ 428 - dev); \ 429 - \ 430 - if (count != 256) \ 431 - return -EINVAL; \ 432 - \ 433 - wacom_set_image(hdev, buf, OLED_ID); \ 434 - \ 435 - return count; \ 436 - } \ 437 - \ 438 - static DEVICE_ATTR(oled##OLED_ID##_img, S_IWUSR | S_IWGRP, NULL, \ 439 - wacom_oled##OLED_ID##_store) 440 - 441 - WACOM_STORE(0); 442 - WACOM_STORE(1); 443 - WACOM_STORE(2); 444 - WACOM_STORE(3); 445 - WACOM_STORE(4); 446 - WACOM_STORE(5); 447 - WACOM_STORE(6); 448 - WACOM_STORE(7); 449 - 450 - static int wacom_gr_parse_report(struct hid_device *hdev, 451 - struct wacom_data *wdata, 452 - struct input_dev *input, unsigned char *data) 453 - { 454 - int tool, x, y, rw; 455 - 456 - tool = 0; 457 - /* Get X & Y positions */ 458 - x = le16_to_cpu(*(__le16 *) &data[2]); 459 - y = le16_to_cpu(*(__le16 *) &data[4]); 460 - 461 - /* Get current tool identifier */ 462 - if (data[1] & 0x90) { /* If pen is in the in/active area */ 463 - switch ((data[1] >> 5) & 3) { 464 - case 0: /* Pen */ 465 - tool = BTN_TOOL_PEN; 466 - break; 467 - 468 - case 1: /* Rubber */ 469 - tool = BTN_TOOL_RUBBER; 470 - break; 471 - 472 - case 2: /* Mouse with wheel */ 473 - case 3: /* Mouse without wheel */ 474 - tool = BTN_TOOL_MOUSE; 475 - break; 476 - } 477 - 478 - /* Reset tool if out of active tablet area */ 479 - if (!(data[1] & 0x10)) 480 - tool = 0; 481 - } 482 - 483 - /* If tool changed, notify input subsystem */ 484 - if (wdata->tool != tool) { 485 - if (wdata->tool) { 486 - /* Completely reset old tool state */ 487 - if (wdata->tool == BTN_TOOL_MOUSE) { 488 - input_report_key(input, BTN_LEFT, 0); 489 - input_report_key(input, BTN_RIGHT, 0); 490 - input_report_key(input, BTN_MIDDLE, 0); 491 - input_report_abs(input, ABS_DISTANCE, 492 - input_abs_get_max(input, ABS_DISTANCE)); 493 - } else { 494 - input_report_key(input, BTN_TOUCH, 0); 495 - input_report_key(input, BTN_STYLUS, 0); 496 - input_report_key(input, BTN_STYLUS2, 0); 497 - input_report_abs(input, ABS_PRESSURE, 0); 498 - } 499 - input_report_key(input, wdata->tool, 0); 500 - input_sync(input); 501 - } 502 - wdata->tool = tool; 503 - if (tool) 504 - input_report_key(input, tool, 1); 505 - } 506 - 507 - if (tool) { 508 - input_report_abs(input, ABS_X, x); 509 - input_report_abs(input, ABS_Y, y); 510 - 511 - switch ((data[1] >> 5) & 3) { 512 - case 2: /* Mouse with wheel */ 513 - input_report_key(input, BTN_MIDDLE, data[1] & 0x04); 514 - rw = (data[6] & 0x01) ? -1 : 515 - (data[6] & 0x02) ? 1 : 0; 516 - input_report_rel(input, REL_WHEEL, rw); 517 - /* fall through */ 518 - 519 - case 3: /* Mouse without wheel */ 520 - input_report_key(input, BTN_LEFT, data[1] & 0x01); 521 - input_report_key(input, BTN_RIGHT, data[1] & 0x02); 522 - /* Compute distance between mouse and tablet */ 523 - rw = 44 - (data[6] >> 2); 524 - if (rw < 0) 525 - rw = 0; 526 - else if (rw > 31) 527 - rw = 31; 528 - input_report_abs(input, ABS_DISTANCE, rw); 529 - break; 530 - 531 - default: 532 - input_report_abs(input, ABS_PRESSURE, 533 - data[6] | (((__u16) (data[1] & 0x08)) << 5)); 534 - input_report_key(input, BTN_TOUCH, data[1] & 0x01); 535 - input_report_key(input, BTN_STYLUS, data[1] & 0x02); 536 - input_report_key(input, BTN_STYLUS2, (tool == BTN_TOOL_PEN) && data[1] & 0x04); 537 - break; 538 - } 539 - 540 - input_sync(input); 541 - } 542 - 543 - /* Report the state of the two buttons at the top of the tablet 544 - * as two extra fingerpad keys (buttons 4 & 5). */ 545 - rw = data[7] & 0x03; 546 - if (rw != wdata->butstate) { 547 - wdata->butstate = rw; 548 - input_report_key(input, BTN_0, rw & 0x02); 549 - input_report_key(input, BTN_1, rw & 0x01); 550 - input_report_key(input, BTN_TOOL_FINGER, 0xf0); 551 - input_event(input, EV_MSC, MSC_SERIAL, 0xf0); 552 - input_sync(input); 553 - } 554 - 555 - /* Store current battery capacity and power supply state*/ 556 - rw = (data[7] >> 2 & 0x07); 557 - if (rw != wdata->power_raw) { 558 - wdata->power_raw = rw; 559 - wdata->battery_capacity = batcap_gr[rw]; 560 - if (rw == 7) 561 - wdata->ps_connected = 1; 562 - else 563 - wdata->ps_connected = 0; 564 - } 565 - return 1; 566 - } 567 - 568 - static void wacom_i4_parse_button_report(struct wacom_data *wdata, 569 - struct input_dev *input, unsigned char *data) 570 - { 571 - __u16 new_butstate; 572 - __u8 new_whlstate; 573 - __u8 sync = 0; 574 - 575 - new_whlstate = data[1]; 576 - if (new_whlstate != wdata->whlstate) { 577 - wdata->whlstate = new_whlstate; 578 - if (new_whlstate & 0x80) { 579 - input_report_key(input, BTN_TOUCH, 1); 580 - input_report_abs(input, ABS_WHEEL, (new_whlstate & 0x7f)); 581 - input_report_key(input, BTN_TOOL_FINGER, 1); 582 - } else { 583 - input_report_key(input, BTN_TOUCH, 0); 584 - input_report_abs(input, ABS_WHEEL, 0); 585 - input_report_key(input, BTN_TOOL_FINGER, 0); 586 - } 587 - sync = 1; 588 - } 589 - 590 - new_butstate = (data[3] << 1) | (data[2] & 0x01); 591 - if (new_butstate != wdata->butstate) { 592 - wdata->butstate = new_butstate; 593 - input_report_key(input, BTN_0, new_butstate & 0x001); 594 - input_report_key(input, BTN_1, new_butstate & 0x002); 595 - input_report_key(input, BTN_2, new_butstate & 0x004); 596 - input_report_key(input, BTN_3, new_butstate & 0x008); 597 - input_report_key(input, BTN_4, new_butstate & 0x010); 598 - input_report_key(input, BTN_5, new_butstate & 0x020); 599 - input_report_key(input, BTN_6, new_butstate & 0x040); 600 - input_report_key(input, BTN_7, new_butstate & 0x080); 601 - input_report_key(input, BTN_8, new_butstate & 0x100); 602 - input_report_key(input, BTN_TOOL_FINGER, 1); 603 - sync = 1; 604 - } 605 - 606 - if (sync) { 607 - input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); 608 - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); 609 - input_sync(input); 610 - } 611 - } 612 - 613 - static void wacom_i4_parse_pen_report(struct wacom_data *wdata, 614 - struct input_dev *input, unsigned char *data) 615 - { 616 - __u16 x, y, pressure; 617 - __u8 distance; 618 - __u8 tilt_x, tilt_y; 619 - 620 - switch (data[1]) { 621 - case 0x80: /* Out of proximity report */ 622 - input_report_key(input, BTN_TOUCH, 0); 623 - input_report_abs(input, ABS_PRESSURE, 0); 624 - input_report_key(input, BTN_STYLUS, 0); 625 - input_report_key(input, BTN_STYLUS2, 0); 626 - input_report_key(input, wdata->tool, 0); 627 - input_report_abs(input, ABS_MISC, 0); 628 - input_event(input, EV_MSC, MSC_SERIAL, wdata->serial); 629 - wdata->tool = 0; 630 - input_sync(input); 631 - break; 632 - case 0xC2: /* Tool report */ 633 - wdata->id = ((data[2] << 4) | (data[3] >> 4) | 634 - ((data[7] & 0x0f) << 20) | 635 - ((data[8] & 0xf0) << 12)); 636 - wdata->serial = ((data[3] & 0x0f) << 28) + 637 - (data[4] << 20) + (data[5] << 12) + 638 - (data[6] << 4) + (data[7] >> 4); 639 - 640 - switch (wdata->id) { 641 - case 0x100802: 642 - wdata->tool = BTN_TOOL_PEN; 643 - break; 644 - case 0x10080A: 645 - wdata->tool = BTN_TOOL_RUBBER; 646 - break; 647 - } 648 - break; 649 - default: /* Position/pressure report */ 650 - x = data[2] << 9 | data[3] << 1 | ((data[9] & 0x02) >> 1); 651 - y = data[4] << 9 | data[5] << 1 | (data[9] & 0x01); 652 - pressure = (data[6] << 3) | ((data[7] & 0xC0) >> 5) 653 - | (data[1] & 0x01); 654 - distance = (data[9] >> 2) & 0x3f; 655 - tilt_x = ((data[7] << 1) & 0x7e) | (data[8] >> 7); 656 - tilt_y = data[8] & 0x7f; 657 - 658 - input_report_key(input, BTN_TOUCH, pressure > 1); 659 - 660 - input_report_key(input, BTN_STYLUS, data[1] & 0x02); 661 - input_report_key(input, BTN_STYLUS2, data[1] & 0x04); 662 - input_report_key(input, wdata->tool, 1); 663 - input_report_abs(input, ABS_X, x); 664 - input_report_abs(input, ABS_Y, y); 665 - input_report_abs(input, ABS_PRESSURE, pressure); 666 - input_report_abs(input, ABS_DISTANCE, distance); 667 - input_report_abs(input, ABS_TILT_X, tilt_x); 668 - input_report_abs(input, ABS_TILT_Y, tilt_y); 669 - input_report_abs(input, ABS_MISC, wdata->id); 670 - input_event(input, EV_MSC, MSC_SERIAL, wdata->serial); 671 - input_report_key(input, wdata->tool, 1); 672 - input_sync(input); 673 - break; 674 - } 675 - 676 - return; 677 - } 678 - 679 - static void wacom_i4_parse_report(struct hid_device *hdev, 680 - struct wacom_data *wdata, 681 - struct input_dev *input, unsigned char *data) 682 - { 683 - switch (data[0]) { 684 - case 0x00: /* Empty report */ 685 - break; 686 - case 0x02: /* Pen report */ 687 - wacom_i4_parse_pen_report(wdata, input, data); 688 - break; 689 - case 0x03: /* Features Report */ 690 - wdata->features = data[2]; 691 - break; 692 - case 0x0C: /* Button report */ 693 - wacom_i4_parse_button_report(wdata, input, data); 694 - break; 695 - default: 696 - hid_err(hdev, "Unknown report: %d,%d\n", data[0], data[1]); 697 - break; 698 - } 699 - } 700 - 701 - static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, 702 - u8 *raw_data, int size) 703 - { 704 - struct wacom_data *wdata = hid_get_drvdata(hdev); 705 - struct hid_input *hidinput; 706 - struct input_dev *input; 707 - unsigned char *data = (unsigned char *) raw_data; 708 - int i; 709 - __u8 power_raw; 710 - 711 - if (!(hdev->claimed & HID_CLAIMED_INPUT)) 712 - return 0; 713 - 714 - hidinput = list_entry(hdev->inputs.next, struct hid_input, list); 715 - input = hidinput->input; 716 - 717 - switch (hdev->product) { 718 - case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH: 719 - if (data[0] == 0x03) { 720 - return wacom_gr_parse_report(hdev, wdata, input, data); 721 - } else { 722 - hid_err(hdev, "Unknown report: %d,%d size:%d\n", 723 - data[0], data[1], size); 724 - return 0; 725 - } 726 - break; 727 - case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: 728 - i = 1; 729 - 730 - switch (data[0]) { 731 - case 0x04: 732 - wacom_i4_parse_report(hdev, wdata, input, data + i); 733 - i += 10; 734 - /* fall through */ 735 - case 0x03: 736 - wacom_i4_parse_report(hdev, wdata, input, data + i); 737 - i += 10; 738 - wacom_i4_parse_report(hdev, wdata, input, data + i); 739 - power_raw = data[i+10]; 740 - if (power_raw != wdata->power_raw) { 741 - wdata->power_raw = power_raw; 742 - wdata->battery_capacity = batcap_i4[power_raw & 0x07]; 743 - wdata->bat_charging = (power_raw & 0x08) ? 1 : 0; 744 - wdata->ps_connected = (power_raw & 0x10) ? 1 : 0; 745 - } 746 - 747 - break; 748 - default: 749 - hid_err(hdev, "Unknown report: %d,%d size:%d\n", 750 - data[0], data[1], size); 751 - return 0; 752 - } 753 - } 754 - return 1; 755 - } 756 - 757 - static int wacom_input_mapped(struct hid_device *hdev, struct hid_input *hi, 758 - struct hid_field *field, struct hid_usage *usage, unsigned long **bit, 759 - int *max) 760 - { 761 - struct input_dev *input = hi->input; 762 - 763 - __set_bit(INPUT_PROP_POINTER, input->propbit); 764 - 765 - /* Basics */ 766 - input->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_REL); 767 - 768 - __set_bit(REL_WHEEL, input->relbit); 769 - 770 - __set_bit(BTN_TOOL_PEN, input->keybit); 771 - __set_bit(BTN_TOUCH, input->keybit); 772 - __set_bit(BTN_STYLUS, input->keybit); 773 - __set_bit(BTN_STYLUS2, input->keybit); 774 - __set_bit(BTN_LEFT, input->keybit); 775 - __set_bit(BTN_RIGHT, input->keybit); 776 - __set_bit(BTN_MIDDLE, input->keybit); 777 - 778 - /* Pad */ 779 - input_set_capability(input, EV_MSC, MSC_SERIAL); 780 - 781 - __set_bit(BTN_0, input->keybit); 782 - __set_bit(BTN_1, input->keybit); 783 - __set_bit(BTN_TOOL_FINGER, input->keybit); 784 - 785 - /* Distance, rubber and mouse */ 786 - __set_bit(BTN_TOOL_RUBBER, input->keybit); 787 - __set_bit(BTN_TOOL_MOUSE, input->keybit); 788 - 789 - switch (hdev->product) { 790 - case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH: 791 - input_set_abs_params(input, ABS_X, 0, 16704, 4, 0); 792 - input_set_abs_params(input, ABS_Y, 0, 12064, 4, 0); 793 - input_set_abs_params(input, ABS_PRESSURE, 0, 511, 0, 0); 794 - input_set_abs_params(input, ABS_DISTANCE, 0, 32, 0, 0); 795 - break; 796 - case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: 797 - __set_bit(ABS_WHEEL, input->absbit); 798 - __set_bit(ABS_MISC, input->absbit); 799 - __set_bit(BTN_2, input->keybit); 800 - __set_bit(BTN_3, input->keybit); 801 - __set_bit(BTN_4, input->keybit); 802 - __set_bit(BTN_5, input->keybit); 803 - __set_bit(BTN_6, input->keybit); 804 - __set_bit(BTN_7, input->keybit); 805 - __set_bit(BTN_8, input->keybit); 806 - input_set_abs_params(input, ABS_WHEEL, 0, 71, 0, 0); 807 - input_set_abs_params(input, ABS_X, 0, 40640, 4, 0); 808 - input_set_abs_params(input, ABS_Y, 0, 25400, 4, 0); 809 - input_set_abs_params(input, ABS_PRESSURE, 0, 2047, 0, 0); 810 - input_set_abs_params(input, ABS_DISTANCE, 0, 63, 0, 0); 811 - input_set_abs_params(input, ABS_TILT_X, 0, 127, 0, 0); 812 - input_set_abs_params(input, ABS_TILT_Y, 0, 127, 0, 0); 813 - break; 814 - } 815 - 816 - return 0; 817 - } 818 - 819 - static int wacom_probe(struct hid_device *hdev, 820 - const struct hid_device_id *id) 821 - { 822 - struct wacom_data *wdata; 823 - int ret; 824 - 825 - wdata = kzalloc(sizeof(*wdata), GFP_KERNEL); 826 - if (wdata == NULL) { 827 - hid_err(hdev, "can't alloc wacom descriptor\n"); 828 - return -ENOMEM; 829 - } 830 - 831 - hid_set_drvdata(hdev, wdata); 832 - 833 - /* Parse the HID report now */ 834 - ret = hid_parse(hdev); 835 - if (ret) { 836 - hid_err(hdev, "parse failed\n"); 837 - goto err_free; 838 - } 839 - 840 - ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 841 - if (ret) { 842 - hid_err(hdev, "hw start failed\n"); 843 - goto err_free; 844 - } 845 - 846 - ret = device_create_file(&hdev->dev, &dev_attr_speed); 847 - if (ret) 848 - hid_warn(hdev, 849 - "can't create sysfs speed attribute err: %d\n", ret); 850 - 851 - #define OLED_INIT(OLED_ID) \ 852 - do { \ 853 - ret = device_create_file(&hdev->dev, \ 854 - &dev_attr_oled##OLED_ID##_img); \ 855 - if (ret) \ 856 - hid_warn(hdev, \ 857 - "can't create sysfs oled attribute, err: %d\n", ret);\ 858 - } while (0) 859 - 860 - OLED_INIT(0); 861 - OLED_INIT(1); 862 - OLED_INIT(2); 863 - OLED_INIT(3); 864 - OLED_INIT(4); 865 - OLED_INIT(5); 866 - OLED_INIT(6); 867 - OLED_INIT(7); 868 - 869 - wdata->features = 0; 870 - wacom_set_features(hdev, 1); 871 - 872 - if (hdev->product == USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) { 873 - sprintf(hdev->name, "%s", "Wacom Intuos4 WL"); 874 - ret = wacom_initialize_leds(hdev); 875 - if (ret) 876 - hid_warn(hdev, 877 - "can't create led attribute, err: %d\n", ret); 878 - } 879 - 880 - wdata->battery.properties = wacom_battery_props; 881 - wdata->battery.num_properties = ARRAY_SIZE(wacom_battery_props); 882 - wdata->battery.get_property = wacom_battery_get_property; 883 - wdata->battery.name = "wacom_battery"; 884 - wdata->battery.type = POWER_SUPPLY_TYPE_BATTERY; 885 - wdata->battery.use_for_apm = 0; 886 - 887 - 888 - ret = power_supply_register(&hdev->dev, &wdata->battery); 889 - if (ret) { 890 - hid_err(hdev, "can't create sysfs battery attribute, err: %d\n", 891 - ret); 892 - goto err_battery; 893 - } 894 - 895 - power_supply_powers(&wdata->battery, &hdev->dev); 896 - 897 - wdata->ac.properties = wacom_ac_props; 898 - wdata->ac.num_properties = ARRAY_SIZE(wacom_ac_props); 899 - wdata->ac.get_property = wacom_ac_get_property; 900 - wdata->ac.name = "wacom_ac"; 901 - wdata->ac.type = POWER_SUPPLY_TYPE_MAINS; 902 - wdata->ac.use_for_apm = 0; 903 - 904 - ret = power_supply_register(&hdev->dev, &wdata->ac); 905 - if (ret) { 906 - hid_err(hdev, 907 - "can't create ac battery attribute, err: %d\n", ret); 908 - goto err_ac; 909 - } 910 - 911 - power_supply_powers(&wdata->ac, &hdev->dev); 912 - return 0; 913 - 914 - err_ac: 915 - power_supply_unregister(&wdata->battery); 916 - err_battery: 917 - wacom_destroy_leds(hdev); 918 - device_remove_file(&hdev->dev, &dev_attr_oled0_img); 919 - device_remove_file(&hdev->dev, &dev_attr_oled1_img); 920 - device_remove_file(&hdev->dev, &dev_attr_oled2_img); 921 - device_remove_file(&hdev->dev, &dev_attr_oled3_img); 922 - device_remove_file(&hdev->dev, &dev_attr_oled4_img); 923 - device_remove_file(&hdev->dev, &dev_attr_oled5_img); 924 - device_remove_file(&hdev->dev, &dev_attr_oled6_img); 925 - device_remove_file(&hdev->dev, &dev_attr_oled7_img); 926 - device_remove_file(&hdev->dev, &dev_attr_speed); 927 - hid_hw_stop(hdev); 928 - err_free: 929 - kfree(wdata); 930 - return ret; 931 - } 932 - 933 - static void wacom_remove(struct hid_device *hdev) 934 - { 935 - struct wacom_data *wdata = hid_get_drvdata(hdev); 936 - 937 - wacom_destroy_leds(hdev); 938 - device_remove_file(&hdev->dev, &dev_attr_oled0_img); 939 - device_remove_file(&hdev->dev, &dev_attr_oled1_img); 940 - device_remove_file(&hdev->dev, &dev_attr_oled2_img); 941 - device_remove_file(&hdev->dev, &dev_attr_oled3_img); 942 - device_remove_file(&hdev->dev, &dev_attr_oled4_img); 943 - device_remove_file(&hdev->dev, &dev_attr_oled5_img); 944 - device_remove_file(&hdev->dev, &dev_attr_oled6_img); 945 - device_remove_file(&hdev->dev, &dev_attr_oled7_img); 946 - device_remove_file(&hdev->dev, &dev_attr_speed); 947 - hid_hw_stop(hdev); 948 - 949 - power_supply_unregister(&wdata->battery); 950 - power_supply_unregister(&wdata->ac); 951 - kfree(hid_get_drvdata(hdev)); 952 - } 953 - 954 - static const struct hid_device_id wacom_devices[] = { 955 - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) }, 956 - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) }, 957 - 958 - { } 959 - }; 960 - MODULE_DEVICE_TABLE(hid, wacom_devices); 961 - 962 - static struct hid_driver wacom_driver = { 963 - .name = "wacom", 964 - .id_table = wacom_devices, 965 - .probe = wacom_probe, 966 - .remove = wacom_remove, 967 - .raw_event = wacom_raw_event, 968 - .input_mapped = wacom_input_mapped, 969 - }; 970 - module_hid_driver(wacom_driver); 971 - 972 - MODULE_DESCRIPTION("Driver for Wacom Graphire Bluetooth and Wacom Intuos4 WL"); 973 - MODULE_LICENSE("GPL");
+1456
drivers/hid/wacom_sys.c
··· 1 + /* 2 + * drivers/input/tablet/wacom_sys.c 3 + * 4 + * USB Wacom tablet support - system specific code 5 + */ 6 + 7 + /* 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + */ 13 + 14 + #include "wacom_wac.h" 15 + #include "wacom.h" 16 + #include <linux/hid.h> 17 + 18 + #define WAC_MSG_RETRIES 5 19 + 20 + #define WAC_CMD_LED_CONTROL 0x20 21 + #define WAC_CMD_ICON_START 0x21 22 + #define WAC_CMD_ICON_XFER 0x23 23 + #define WAC_CMD_ICON_BT_XFER 0x26 24 + #define WAC_CMD_RETRIES 10 25 + 26 + static int wacom_get_report(struct hid_device *hdev, u8 type, u8 id, 27 + void *buf, size_t size, unsigned int retries) 28 + { 29 + int retval; 30 + 31 + do { 32 + retval = hid_hw_raw_request(hdev, id, buf, size, type, 33 + HID_REQ_GET_REPORT); 34 + } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries); 35 + 36 + return retval; 37 + } 38 + 39 + static int wacom_set_report(struct hid_device *hdev, u8 type, u8 *buf, 40 + size_t size, unsigned int retries) 41 + { 42 + int retval; 43 + 44 + do { 45 + retval = hid_hw_raw_request(hdev, buf[0], buf, size, type, 46 + HID_REQ_SET_REPORT); 47 + } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries); 48 + 49 + return retval; 50 + } 51 + 52 + static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, 53 + u8 *raw_data, int size) 54 + { 55 + struct wacom *wacom = hid_get_drvdata(hdev); 56 + 57 + if (size > WACOM_PKGLEN_MAX) 58 + return 1; 59 + 60 + memcpy(wacom->wacom_wac.data, raw_data, size); 61 + 62 + wacom_wac_irq(&wacom->wacom_wac, size); 63 + 64 + return 0; 65 + } 66 + 67 + static int wacom_open(struct input_dev *dev) 68 + { 69 + struct wacom *wacom = input_get_drvdata(dev); 70 + int retval; 71 + 72 + mutex_lock(&wacom->lock); 73 + retval = hid_hw_open(wacom->hdev); 74 + mutex_unlock(&wacom->lock); 75 + 76 + return retval; 77 + } 78 + 79 + static void wacom_close(struct input_dev *dev) 80 + { 81 + struct wacom *wacom = input_get_drvdata(dev); 82 + 83 + mutex_lock(&wacom->lock); 84 + hid_hw_close(wacom->hdev); 85 + mutex_unlock(&wacom->lock); 86 + } 87 + 88 + /* 89 + * Calculate the resolution of the X or Y axis using hidinput_calc_abs_res. 90 + */ 91 + static int wacom_calc_hid_res(int logical_extents, int physical_extents, 92 + unsigned unit, int exponent) 93 + { 94 + struct hid_field field = { 95 + .logical_maximum = logical_extents, 96 + .physical_maximum = physical_extents, 97 + .unit = unit, 98 + .unit_exponent = exponent, 99 + }; 100 + 101 + return hidinput_calc_abs_res(&field, ABS_X); 102 + } 103 + 104 + static void wacom_feature_mapping(struct hid_device *hdev, 105 + struct hid_field *field, struct hid_usage *usage) 106 + { 107 + struct wacom *wacom = hid_get_drvdata(hdev); 108 + struct wacom_features *features = &wacom->wacom_wac.features; 109 + 110 + switch (usage->hid) { 111 + case HID_DG_CONTACTMAX: 112 + /* leave touch_max as is if predefined */ 113 + if (!features->touch_max) 114 + features->touch_max = field->value[0]; 115 + break; 116 + } 117 + } 118 + 119 + /* 120 + * Interface Descriptor of wacom devices can be incomplete and 121 + * inconsistent so wacom_features table is used to store stylus 122 + * device's packet lengths, various maximum values, and tablet 123 + * resolution based on product ID's. 124 + * 125 + * For devices that contain 2 interfaces, wacom_features table is 126 + * inaccurate for the touch interface. Since the Interface Descriptor 127 + * for touch interfaces has pretty complete data, this function exists 128 + * to query tablet for this missing information instead of hard coding in 129 + * an additional table. 130 + * 131 + * A typical Interface Descriptor for a stylus will contain a 132 + * boot mouse application collection that is not of interest and this 133 + * function will ignore it. 134 + * 135 + * It also contains a digitizer application collection that also is not 136 + * of interest since any information it contains would be duplicate 137 + * of what is in wacom_features. Usually it defines a report of an array 138 + * of bytes that could be used as max length of the stylus packet returned. 139 + * If it happens to define a Digitizer-Stylus Physical Collection then 140 + * the X and Y logical values contain valid data but it is ignored. 141 + * 142 + * A typical Interface Descriptor for a touch interface will contain a 143 + * Digitizer-Finger Physical Collection which will define both logical 144 + * X/Y maximum as well as the physical size of tablet. Since touch 145 + * interfaces haven't supported pressure or distance, this is enough 146 + * information to override invalid values in the wacom_features table. 147 + * 148 + * Intuos5 touch interface and 3rd gen Bamboo Touch do not contain useful 149 + * data. We deal with them after returning from this function. 150 + */ 151 + static void wacom_usage_mapping(struct hid_device *hdev, 152 + struct hid_field *field, struct hid_usage *usage) 153 + { 154 + struct wacom *wacom = hid_get_drvdata(hdev); 155 + struct wacom_features *features = &wacom->wacom_wac.features; 156 + bool finger = (field->logical == HID_DG_FINGER) || 157 + (field->physical == HID_DG_FINGER); 158 + bool pen = (field->logical == HID_DG_STYLUS) || 159 + (field->physical == HID_DG_STYLUS); 160 + 161 + /* 162 + * Requiring Stylus Usage will ignore boot mouse 163 + * X/Y values and some cases of invalid Digitizer X/Y 164 + * values commonly reported. 165 + */ 166 + if (!pen && !finger) 167 + return; 168 + 169 + if (finger && !features->touch_max) 170 + /* touch device at least supports one touch point */ 171 + features->touch_max = 1; 172 + 173 + switch (usage->hid) { 174 + case HID_GD_X: 175 + features->x_max = field->logical_maximum; 176 + if (finger) { 177 + features->device_type = BTN_TOOL_FINGER; 178 + features->x_phy = field->physical_maximum; 179 + if (features->type != BAMBOO_PT) { 180 + features->unit = field->unit; 181 + features->unitExpo = field->unit_exponent; 182 + } 183 + } else { 184 + features->device_type = BTN_TOOL_PEN; 185 + } 186 + break; 187 + case HID_GD_Y: 188 + features->y_max = field->logical_maximum; 189 + if (finger) { 190 + features->y_phy = field->physical_maximum; 191 + if (features->type != BAMBOO_PT) { 192 + features->unit = field->unit; 193 + features->unitExpo = field->unit_exponent; 194 + } 195 + } 196 + break; 197 + case HID_DG_TIPPRESSURE: 198 + if (pen) 199 + features->pressure_max = field->logical_maximum; 200 + break; 201 + } 202 + } 203 + 204 + static void wacom_parse_hid(struct hid_device *hdev, 205 + struct wacom_features *features) 206 + { 207 + struct hid_report_enum *rep_enum; 208 + struct hid_report *hreport; 209 + int i, j; 210 + 211 + /* check features first */ 212 + rep_enum = &hdev->report_enum[HID_FEATURE_REPORT]; 213 + list_for_each_entry(hreport, &rep_enum->report_list, list) { 214 + for (i = 0; i < hreport->maxfield; i++) { 215 + /* Ignore if report count is out of bounds. */ 216 + if (hreport->field[i]->report_count < 1) 217 + continue; 218 + 219 + for (j = 0; j < hreport->field[i]->maxusage; j++) { 220 + wacom_feature_mapping(hdev, hreport->field[i], 221 + hreport->field[i]->usage + j); 222 + } 223 + } 224 + } 225 + 226 + /* now check the input usages */ 227 + rep_enum = &hdev->report_enum[HID_INPUT_REPORT]; 228 + list_for_each_entry(hreport, &rep_enum->report_list, list) { 229 + 230 + if (!hreport->maxfield) 231 + continue; 232 + 233 + for (i = 0; i < hreport->maxfield; i++) 234 + for (j = 0; j < hreport->field[i]->maxusage; j++) 235 + wacom_usage_mapping(hdev, hreport->field[i], 236 + hreport->field[i]->usage + j); 237 + } 238 + } 239 + 240 + static int wacom_set_device_mode(struct hid_device *hdev, int report_id, 241 + int length, int mode) 242 + { 243 + unsigned char *rep_data; 244 + int error = -ENOMEM, limit = 0; 245 + 246 + rep_data = kzalloc(length, GFP_KERNEL); 247 + if (!rep_data) 248 + return error; 249 + 250 + do { 251 + rep_data[0] = report_id; 252 + rep_data[1] = mode; 253 + 254 + error = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 255 + length, 1); 256 + if (error >= 0) 257 + error = wacom_get_report(hdev, HID_FEATURE_REPORT, 258 + report_id, rep_data, length, 1); 259 + } while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES); 260 + 261 + kfree(rep_data); 262 + 263 + return error < 0 ? error : 0; 264 + } 265 + 266 + static int wacom_bt_query_tablet_data(struct hid_device *hdev, u8 speed, 267 + struct wacom_features *features) 268 + { 269 + struct wacom *wacom = hid_get_drvdata(hdev); 270 + int ret; 271 + u8 rep_data[2]; 272 + 273 + switch (features->type) { 274 + case GRAPHIRE_BT: 275 + rep_data[0] = 0x03; 276 + rep_data[1] = 0x00; 277 + ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2, 278 + 3); 279 + 280 + if (ret >= 0) { 281 + rep_data[0] = speed == 0 ? 0x05 : 0x06; 282 + rep_data[1] = 0x00; 283 + 284 + ret = wacom_set_report(hdev, HID_FEATURE_REPORT, 285 + rep_data, 2, 3); 286 + 287 + if (ret >= 0) { 288 + wacom->wacom_wac.bt_high_speed = speed; 289 + return 0; 290 + } 291 + } 292 + 293 + /* 294 + * Note that if the raw queries fail, it's not a hard failure 295 + * and it is safe to continue 296 + */ 297 + hid_warn(hdev, "failed to poke device, command %d, err %d\n", 298 + rep_data[0], ret); 299 + break; 300 + case INTUOS4WL: 301 + if (speed == 1) 302 + wacom->wacom_wac.bt_features &= ~0x20; 303 + else 304 + wacom->wacom_wac.bt_features |= 0x20; 305 + 306 + rep_data[0] = 0x03; 307 + rep_data[1] = wacom->wacom_wac.bt_features; 308 + 309 + ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2, 310 + 1); 311 + if (ret >= 0) 312 + wacom->wacom_wac.bt_high_speed = speed; 313 + break; 314 + } 315 + 316 + return 0; 317 + } 318 + 319 + /* 320 + * Switch the tablet into its most-capable mode. Wacom tablets are 321 + * typically configured to power-up in a mode which sends mouse-like 322 + * reports to the OS. To get absolute position, pressure data, etc. 323 + * from the tablet, it is necessary to switch the tablet out of this 324 + * mode and into one which sends the full range of tablet data. 325 + */ 326 + static int wacom_query_tablet_data(struct hid_device *hdev, 327 + struct wacom_features *features) 328 + { 329 + if (hdev->bus == BUS_BLUETOOTH) 330 + return wacom_bt_query_tablet_data(hdev, 1, features); 331 + 332 + if (features->device_type == BTN_TOOL_FINGER) { 333 + if (features->type > TABLETPC) { 334 + /* MT Tablet PC touch */ 335 + return wacom_set_device_mode(hdev, 3, 4, 4); 336 + } 337 + else if (features->type == WACOM_24HDT || features->type == CINTIQ_HYBRID) { 338 + return wacom_set_device_mode(hdev, 18, 3, 2); 339 + } 340 + } else if (features->device_type == BTN_TOOL_PEN) { 341 + if (features->type <= BAMBOO_PT && features->type != WIRELESS) { 342 + return wacom_set_device_mode(hdev, 2, 2, 2); 343 + } 344 + } 345 + 346 + return 0; 347 + } 348 + 349 + static void wacom_retrieve_hid_descriptor(struct hid_device *hdev, 350 + struct wacom_features *features) 351 + { 352 + struct wacom *wacom = hid_get_drvdata(hdev); 353 + struct usb_interface *intf = wacom->intf; 354 + 355 + /* default features */ 356 + features->device_type = BTN_TOOL_PEN; 357 + features->x_fuzz = 4; 358 + features->y_fuzz = 4; 359 + features->pressure_fuzz = 0; 360 + features->distance_fuzz = 0; 361 + 362 + /* 363 + * The wireless device HID is basic and layout conflicts with 364 + * other tablets (monitor and touch interface can look like pen). 365 + * Skip the query for this type and modify defaults based on 366 + * interface number. 367 + */ 368 + if (features->type == WIRELESS) { 369 + if (intf->cur_altsetting->desc.bInterfaceNumber == 0) { 370 + features->device_type = 0; 371 + } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) { 372 + features->device_type = BTN_TOOL_FINGER; 373 + features->pktlen = WACOM_PKGLEN_BBTOUCH3; 374 + } 375 + } 376 + 377 + /* only devices that support touch need to retrieve the info */ 378 + if (features->type < BAMBOO_PT) 379 + return; 380 + 381 + wacom_parse_hid(hdev, features); 382 + } 383 + 384 + struct wacom_hdev_data { 385 + struct list_head list; 386 + struct kref kref; 387 + struct hid_device *dev; 388 + struct wacom_shared shared; 389 + }; 390 + 391 + static LIST_HEAD(wacom_udev_list); 392 + static DEFINE_MUTEX(wacom_udev_list_lock); 393 + 394 + static bool wacom_are_sibling(struct hid_device *hdev, 395 + struct hid_device *sibling) 396 + { 397 + struct wacom *wacom = hid_get_drvdata(hdev); 398 + struct wacom_features *features = &wacom->wacom_wac.features; 399 + int vid = features->oVid; 400 + int pid = features->oPid; 401 + int n1,n2; 402 + 403 + if (vid == 0 && pid == 0) { 404 + vid = hdev->vendor; 405 + pid = hdev->product; 406 + } 407 + 408 + if (vid != sibling->vendor || pid != sibling->product) 409 + return false; 410 + 411 + /* Compare the physical path. */ 412 + n1 = strrchr(hdev->phys, '.') - hdev->phys; 413 + n2 = strrchr(sibling->phys, '.') - sibling->phys; 414 + if (n1 != n2 || n1 <= 0 || n2 <= 0) 415 + return false; 416 + 417 + return !strncmp(hdev->phys, sibling->phys, n1); 418 + } 419 + 420 + static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev) 421 + { 422 + struct wacom_hdev_data *data; 423 + 424 + list_for_each_entry(data, &wacom_udev_list, list) { 425 + if (wacom_are_sibling(hdev, data->dev)) { 426 + kref_get(&data->kref); 427 + return data; 428 + } 429 + } 430 + 431 + return NULL; 432 + } 433 + 434 + static int wacom_add_shared_data(struct hid_device *hdev) 435 + { 436 + struct wacom *wacom = hid_get_drvdata(hdev); 437 + struct wacom_wac *wacom_wac = &wacom->wacom_wac; 438 + struct wacom_hdev_data *data; 439 + int retval = 0; 440 + 441 + mutex_lock(&wacom_udev_list_lock); 442 + 443 + data = wacom_get_hdev_data(hdev); 444 + if (!data) { 445 + data = kzalloc(sizeof(struct wacom_hdev_data), GFP_KERNEL); 446 + if (!data) { 447 + retval = -ENOMEM; 448 + goto out; 449 + } 450 + 451 + kref_init(&data->kref); 452 + data->dev = hdev; 453 + list_add_tail(&data->list, &wacom_udev_list); 454 + } 455 + 456 + wacom_wac->shared = &data->shared; 457 + 458 + out: 459 + mutex_unlock(&wacom_udev_list_lock); 460 + return retval; 461 + } 462 + 463 + static void wacom_release_shared_data(struct kref *kref) 464 + { 465 + struct wacom_hdev_data *data = 466 + container_of(kref, struct wacom_hdev_data, kref); 467 + 468 + mutex_lock(&wacom_udev_list_lock); 469 + list_del(&data->list); 470 + mutex_unlock(&wacom_udev_list_lock); 471 + 472 + kfree(data); 473 + } 474 + 475 + static void wacom_remove_shared_data(struct wacom_wac *wacom) 476 + { 477 + struct wacom_hdev_data *data; 478 + 479 + if (wacom->shared) { 480 + data = container_of(wacom->shared, struct wacom_hdev_data, shared); 481 + kref_put(&data->kref, wacom_release_shared_data); 482 + wacom->shared = NULL; 483 + } 484 + } 485 + 486 + static int wacom_led_control(struct wacom *wacom) 487 + { 488 + unsigned char *buf; 489 + int retval; 490 + 491 + buf = kzalloc(9, GFP_KERNEL); 492 + if (!buf) 493 + return -ENOMEM; 494 + 495 + if (wacom->wacom_wac.features.type >= INTUOS5S && 496 + wacom->wacom_wac.features.type <= INTUOSPL) { 497 + /* 498 + * Touch Ring and crop mark LED luminance may take on 499 + * one of four values: 500 + * 0 = Low; 1 = Medium; 2 = High; 3 = Off 501 + */ 502 + int ring_led = wacom->led.select[0] & 0x03; 503 + int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03; 504 + int crop_lum = 0; 505 + 506 + buf[0] = WAC_CMD_LED_CONTROL; 507 + buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led); 508 + } 509 + else { 510 + int led = wacom->led.select[0] | 0x4; 511 + 512 + if (wacom->wacom_wac.features.type == WACOM_21UX2 || 513 + wacom->wacom_wac.features.type == WACOM_24HD) 514 + led |= (wacom->led.select[1] << 4) | 0x40; 515 + 516 + buf[0] = WAC_CMD_LED_CONTROL; 517 + buf[1] = led; 518 + buf[2] = wacom->led.llv; 519 + buf[3] = wacom->led.hlv; 520 + buf[4] = wacom->led.img_lum; 521 + } 522 + 523 + retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 9, 524 + WAC_CMD_RETRIES); 525 + kfree(buf); 526 + 527 + return retval; 528 + } 529 + 530 + static int wacom_led_putimage(struct wacom *wacom, int button_id, u8 xfer_id, 531 + const unsigned len, const void *img) 532 + { 533 + unsigned char *buf; 534 + int i, retval; 535 + const unsigned chunk_len = len / 4; /* 4 chunks are needed to be sent */ 536 + 537 + buf = kzalloc(chunk_len + 3 , GFP_KERNEL); 538 + if (!buf) 539 + return -ENOMEM; 540 + 541 + /* Send 'start' command */ 542 + buf[0] = WAC_CMD_ICON_START; 543 + buf[1] = 1; 544 + retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2, 545 + WAC_CMD_RETRIES); 546 + if (retval < 0) 547 + goto out; 548 + 549 + buf[0] = xfer_id; 550 + buf[1] = button_id & 0x07; 551 + for (i = 0; i < 4; i++) { 552 + buf[2] = i; 553 + memcpy(buf + 3, img + i * chunk_len, chunk_len); 554 + 555 + retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, 556 + buf, chunk_len + 3, WAC_CMD_RETRIES); 557 + if (retval < 0) 558 + break; 559 + } 560 + 561 + /* Send 'stop' */ 562 + buf[0] = WAC_CMD_ICON_START; 563 + buf[1] = 0; 564 + wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2, 565 + WAC_CMD_RETRIES); 566 + 567 + out: 568 + kfree(buf); 569 + return retval; 570 + } 571 + 572 + static ssize_t wacom_led_select_store(struct device *dev, int set_id, 573 + const char *buf, size_t count) 574 + { 575 + struct hid_device *hdev = container_of(dev, struct hid_device, dev); 576 + struct wacom *wacom = hid_get_drvdata(hdev); 577 + unsigned int id; 578 + int err; 579 + 580 + err = kstrtouint(buf, 10, &id); 581 + if (err) 582 + return err; 583 + 584 + mutex_lock(&wacom->lock); 585 + 586 + wacom->led.select[set_id] = id & 0x3; 587 + err = wacom_led_control(wacom); 588 + 589 + mutex_unlock(&wacom->lock); 590 + 591 + return err < 0 ? err : count; 592 + } 593 + 594 + #define DEVICE_LED_SELECT_ATTR(SET_ID) \ 595 + static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \ 596 + struct device_attribute *attr, const char *buf, size_t count) \ 597 + { \ 598 + return wacom_led_select_store(dev, SET_ID, buf, count); \ 599 + } \ 600 + static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \ 601 + struct device_attribute *attr, char *buf) \ 602 + { \ 603 + struct hid_device *hdev = container_of(dev, struct hid_device, dev);\ 604 + struct wacom *wacom = hid_get_drvdata(hdev); \ 605 + return snprintf(buf, 2, "%d\n", wacom->led.select[SET_ID]); \ 606 + } \ 607 + static DEVICE_ATTR(status_led##SET_ID##_select, S_IWUSR | S_IRUSR, \ 608 + wacom_led##SET_ID##_select_show, \ 609 + wacom_led##SET_ID##_select_store) 610 + 611 + DEVICE_LED_SELECT_ATTR(0); 612 + DEVICE_LED_SELECT_ATTR(1); 613 + 614 + static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest, 615 + const char *buf, size_t count) 616 + { 617 + unsigned int value; 618 + int err; 619 + 620 + err = kstrtouint(buf, 10, &value); 621 + if (err) 622 + return err; 623 + 624 + mutex_lock(&wacom->lock); 625 + 626 + *dest = value & 0x7f; 627 + err = wacom_led_control(wacom); 628 + 629 + mutex_unlock(&wacom->lock); 630 + 631 + return err < 0 ? err : count; 632 + } 633 + 634 + #define DEVICE_LUMINANCE_ATTR(name, field) \ 635 + static ssize_t wacom_##name##_luminance_store(struct device *dev, \ 636 + struct device_attribute *attr, const char *buf, size_t count) \ 637 + { \ 638 + struct hid_device *hdev = container_of(dev, struct hid_device, dev);\ 639 + struct wacom *wacom = hid_get_drvdata(hdev); \ 640 + \ 641 + return wacom_luminance_store(wacom, &wacom->led.field, \ 642 + buf, count); \ 643 + } \ 644 + static DEVICE_ATTR(name##_luminance, S_IWUSR, \ 645 + NULL, wacom_##name##_luminance_store) 646 + 647 + DEVICE_LUMINANCE_ATTR(status0, llv); 648 + DEVICE_LUMINANCE_ATTR(status1, hlv); 649 + DEVICE_LUMINANCE_ATTR(buttons, img_lum); 650 + 651 + static ssize_t wacom_button_image_store(struct device *dev, int button_id, 652 + const char *buf, size_t count) 653 + { 654 + struct hid_device *hdev = container_of(dev, struct hid_device, dev); 655 + struct wacom *wacom = hid_get_drvdata(hdev); 656 + int err; 657 + unsigned len; 658 + u8 xfer_id; 659 + 660 + if (hdev->bus == BUS_BLUETOOTH) { 661 + len = 256; 662 + xfer_id = WAC_CMD_ICON_BT_XFER; 663 + } else { 664 + len = 1024; 665 + xfer_id = WAC_CMD_ICON_XFER; 666 + } 667 + 668 + if (count != len) 669 + return -EINVAL; 670 + 671 + mutex_lock(&wacom->lock); 672 + 673 + err = wacom_led_putimage(wacom, button_id, xfer_id, len, buf); 674 + 675 + mutex_unlock(&wacom->lock); 676 + 677 + return err < 0 ? err : count; 678 + } 679 + 680 + #define DEVICE_BTNIMG_ATTR(BUTTON_ID) \ 681 + static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \ 682 + struct device_attribute *attr, const char *buf, size_t count) \ 683 + { \ 684 + return wacom_button_image_store(dev, BUTTON_ID, buf, count); \ 685 + } \ 686 + static DEVICE_ATTR(button##BUTTON_ID##_rawimg, S_IWUSR, \ 687 + NULL, wacom_btnimg##BUTTON_ID##_store) 688 + 689 + DEVICE_BTNIMG_ATTR(0); 690 + DEVICE_BTNIMG_ATTR(1); 691 + DEVICE_BTNIMG_ATTR(2); 692 + DEVICE_BTNIMG_ATTR(3); 693 + DEVICE_BTNIMG_ATTR(4); 694 + DEVICE_BTNIMG_ATTR(5); 695 + DEVICE_BTNIMG_ATTR(6); 696 + DEVICE_BTNIMG_ATTR(7); 697 + 698 + static struct attribute *cintiq_led_attrs[] = { 699 + &dev_attr_status_led0_select.attr, 700 + &dev_attr_status_led1_select.attr, 701 + NULL 702 + }; 703 + 704 + static struct attribute_group cintiq_led_attr_group = { 705 + .name = "wacom_led", 706 + .attrs = cintiq_led_attrs, 707 + }; 708 + 709 + static struct attribute *intuos4_led_attrs[] = { 710 + &dev_attr_status0_luminance.attr, 711 + &dev_attr_status1_luminance.attr, 712 + &dev_attr_status_led0_select.attr, 713 + &dev_attr_buttons_luminance.attr, 714 + &dev_attr_button0_rawimg.attr, 715 + &dev_attr_button1_rawimg.attr, 716 + &dev_attr_button2_rawimg.attr, 717 + &dev_attr_button3_rawimg.attr, 718 + &dev_attr_button4_rawimg.attr, 719 + &dev_attr_button5_rawimg.attr, 720 + &dev_attr_button6_rawimg.attr, 721 + &dev_attr_button7_rawimg.attr, 722 + NULL 723 + }; 724 + 725 + static struct attribute_group intuos4_led_attr_group = { 726 + .name = "wacom_led", 727 + .attrs = intuos4_led_attrs, 728 + }; 729 + 730 + static struct attribute *intuos5_led_attrs[] = { 731 + &dev_attr_status0_luminance.attr, 732 + &dev_attr_status_led0_select.attr, 733 + NULL 734 + }; 735 + 736 + static struct attribute_group intuos5_led_attr_group = { 737 + .name = "wacom_led", 738 + .attrs = intuos5_led_attrs, 739 + }; 740 + 741 + static int wacom_initialize_leds(struct wacom *wacom) 742 + { 743 + int error; 744 + 745 + /* Initialize default values */ 746 + switch (wacom->wacom_wac.features.type) { 747 + case INTUOS4S: 748 + case INTUOS4: 749 + case INTUOS4WL: 750 + case INTUOS4L: 751 + wacom->led.select[0] = 0; 752 + wacom->led.select[1] = 0; 753 + wacom->led.llv = 10; 754 + wacom->led.hlv = 20; 755 + wacom->led.img_lum = 10; 756 + error = sysfs_create_group(&wacom->hdev->dev.kobj, 757 + &intuos4_led_attr_group); 758 + break; 759 + 760 + case WACOM_24HD: 761 + case WACOM_21UX2: 762 + wacom->led.select[0] = 0; 763 + wacom->led.select[1] = 0; 764 + wacom->led.llv = 0; 765 + wacom->led.hlv = 0; 766 + wacom->led.img_lum = 0; 767 + 768 + error = sysfs_create_group(&wacom->hdev->dev.kobj, 769 + &cintiq_led_attr_group); 770 + break; 771 + 772 + case INTUOS5S: 773 + case INTUOS5: 774 + case INTUOS5L: 775 + case INTUOSPS: 776 + case INTUOSPM: 777 + case INTUOSPL: 778 + if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN) { 779 + wacom->led.select[0] = 0; 780 + wacom->led.select[1] = 0; 781 + wacom->led.llv = 32; 782 + wacom->led.hlv = 0; 783 + wacom->led.img_lum = 0; 784 + 785 + error = sysfs_create_group(&wacom->hdev->dev.kobj, 786 + &intuos5_led_attr_group); 787 + } else 788 + return 0; 789 + break; 790 + 791 + default: 792 + return 0; 793 + } 794 + 795 + if (error) { 796 + hid_err(wacom->hdev, 797 + "cannot create sysfs group err: %d\n", error); 798 + return error; 799 + } 800 + wacom_led_control(wacom); 801 + wacom->led_initialized = true; 802 + 803 + return 0; 804 + } 805 + 806 + static void wacom_destroy_leds(struct wacom *wacom) 807 + { 808 + if (!wacom->led_initialized) 809 + return; 810 + 811 + wacom->led_initialized = false; 812 + 813 + switch (wacom->wacom_wac.features.type) { 814 + case INTUOS4S: 815 + case INTUOS4: 816 + case INTUOS4WL: 817 + case INTUOS4L: 818 + sysfs_remove_group(&wacom->hdev->dev.kobj, 819 + &intuos4_led_attr_group); 820 + break; 821 + 822 + case WACOM_24HD: 823 + case WACOM_21UX2: 824 + sysfs_remove_group(&wacom->hdev->dev.kobj, 825 + &cintiq_led_attr_group); 826 + break; 827 + 828 + case INTUOS5S: 829 + case INTUOS5: 830 + case INTUOS5L: 831 + case INTUOSPS: 832 + case INTUOSPM: 833 + case INTUOSPL: 834 + if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN) 835 + sysfs_remove_group(&wacom->hdev->dev.kobj, 836 + &intuos5_led_attr_group); 837 + break; 838 + } 839 + } 840 + 841 + static enum power_supply_property wacom_battery_props[] = { 842 + POWER_SUPPLY_PROP_STATUS, 843 + POWER_SUPPLY_PROP_SCOPE, 844 + POWER_SUPPLY_PROP_CAPACITY 845 + }; 846 + 847 + static enum power_supply_property wacom_ac_props[] = { 848 + POWER_SUPPLY_PROP_PRESENT, 849 + POWER_SUPPLY_PROP_ONLINE, 850 + POWER_SUPPLY_PROP_SCOPE, 851 + }; 852 + 853 + static int wacom_battery_get_property(struct power_supply *psy, 854 + enum power_supply_property psp, 855 + union power_supply_propval *val) 856 + { 857 + struct wacom *wacom = container_of(psy, struct wacom, battery); 858 + int ret = 0; 859 + 860 + switch (psp) { 861 + case POWER_SUPPLY_PROP_SCOPE: 862 + val->intval = POWER_SUPPLY_SCOPE_DEVICE; 863 + break; 864 + case POWER_SUPPLY_PROP_CAPACITY: 865 + val->intval = 866 + wacom->wacom_wac.battery_capacity; 867 + break; 868 + case POWER_SUPPLY_PROP_STATUS: 869 + if (wacom->wacom_wac.bat_charging) 870 + val->intval = POWER_SUPPLY_STATUS_CHARGING; 871 + else if (wacom->wacom_wac.battery_capacity == 100 && 872 + wacom->wacom_wac.ps_connected) 873 + val->intval = POWER_SUPPLY_STATUS_FULL; 874 + else 875 + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; 876 + break; 877 + default: 878 + ret = -EINVAL; 879 + break; 880 + } 881 + 882 + return ret; 883 + } 884 + 885 + static int wacom_ac_get_property(struct power_supply *psy, 886 + enum power_supply_property psp, 887 + union power_supply_propval *val) 888 + { 889 + struct wacom *wacom = container_of(psy, struct wacom, ac); 890 + int ret = 0; 891 + 892 + switch (psp) { 893 + case POWER_SUPPLY_PROP_PRESENT: 894 + /* fall through */ 895 + case POWER_SUPPLY_PROP_ONLINE: 896 + val->intval = wacom->wacom_wac.ps_connected; 897 + break; 898 + case POWER_SUPPLY_PROP_SCOPE: 899 + val->intval = POWER_SUPPLY_SCOPE_DEVICE; 900 + break; 901 + default: 902 + ret = -EINVAL; 903 + break; 904 + } 905 + return ret; 906 + } 907 + 908 + static int wacom_initialize_battery(struct wacom *wacom) 909 + { 910 + static atomic_t battery_no = ATOMIC_INIT(0); 911 + int error; 912 + unsigned long n; 913 + 914 + if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) { 915 + n = atomic_inc_return(&battery_no) - 1; 916 + 917 + wacom->battery.properties = wacom_battery_props; 918 + wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props); 919 + wacom->battery.get_property = wacom_battery_get_property; 920 + sprintf(wacom->wacom_wac.bat_name, "wacom_battery_%ld", n); 921 + wacom->battery.name = wacom->wacom_wac.bat_name; 922 + wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY; 923 + wacom->battery.use_for_apm = 0; 924 + 925 + wacom->ac.properties = wacom_ac_props; 926 + wacom->ac.num_properties = ARRAY_SIZE(wacom_ac_props); 927 + wacom->ac.get_property = wacom_ac_get_property; 928 + sprintf(wacom->wacom_wac.ac_name, "wacom_ac_%ld", n); 929 + wacom->ac.name = wacom->wacom_wac.ac_name; 930 + wacom->ac.type = POWER_SUPPLY_TYPE_MAINS; 931 + wacom->ac.use_for_apm = 0; 932 + 933 + error = power_supply_register(&wacom->hdev->dev, 934 + &wacom->battery); 935 + if (error) 936 + return error; 937 + 938 + power_supply_powers(&wacom->battery, &wacom->hdev->dev); 939 + 940 + error = power_supply_register(&wacom->hdev->dev, &wacom->ac); 941 + if (error) { 942 + power_supply_unregister(&wacom->battery); 943 + return error; 944 + } 945 + 946 + power_supply_powers(&wacom->ac, &wacom->hdev->dev); 947 + } 948 + 949 + return 0; 950 + } 951 + 952 + static void wacom_destroy_battery(struct wacom *wacom) 953 + { 954 + if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) && 955 + wacom->battery.dev) { 956 + power_supply_unregister(&wacom->battery); 957 + wacom->battery.dev = NULL; 958 + power_supply_unregister(&wacom->ac); 959 + wacom->ac.dev = NULL; 960 + } 961 + } 962 + 963 + static ssize_t wacom_show_speed(struct device *dev, 964 + struct device_attribute 965 + *attr, char *buf) 966 + { 967 + struct hid_device *hdev = container_of(dev, struct hid_device, dev); 968 + struct wacom *wacom = hid_get_drvdata(hdev); 969 + 970 + return snprintf(buf, PAGE_SIZE, "%i\n", wacom->wacom_wac.bt_high_speed); 971 + } 972 + 973 + static ssize_t wacom_store_speed(struct device *dev, 974 + struct device_attribute *attr, 975 + const char *buf, size_t count) 976 + { 977 + struct hid_device *hdev = container_of(dev, struct hid_device, dev); 978 + struct wacom *wacom = hid_get_drvdata(hdev); 979 + u8 new_speed; 980 + 981 + if (kstrtou8(buf, 0, &new_speed)) 982 + return -EINVAL; 983 + 984 + if (new_speed != 0 && new_speed != 1) 985 + return -EINVAL; 986 + 987 + wacom_bt_query_tablet_data(hdev, new_speed, &wacom->wacom_wac.features); 988 + 989 + return count; 990 + } 991 + 992 + static DEVICE_ATTR(speed, S_IRUGO | S_IWUSR | S_IWGRP, 993 + wacom_show_speed, wacom_store_speed); 994 + 995 + static struct input_dev *wacom_allocate_input(struct wacom *wacom) 996 + { 997 + struct input_dev *input_dev; 998 + struct hid_device *hdev = wacom->hdev; 999 + struct wacom_wac *wacom_wac = &(wacom->wacom_wac); 1000 + 1001 + input_dev = input_allocate_device(); 1002 + if (!input_dev) 1003 + return NULL; 1004 + 1005 + input_dev->name = wacom_wac->name; 1006 + input_dev->phys = hdev->phys; 1007 + input_dev->dev.parent = &hdev->dev; 1008 + input_dev->open = wacom_open; 1009 + input_dev->close = wacom_close; 1010 + input_dev->uniq = hdev->uniq; 1011 + input_dev->id.bustype = hdev->bus; 1012 + input_dev->id.vendor = hdev->vendor; 1013 + input_dev->id.product = hdev->product; 1014 + input_dev->id.version = hdev->version; 1015 + input_set_drvdata(input_dev, wacom); 1016 + 1017 + return input_dev; 1018 + } 1019 + 1020 + static void wacom_unregister_inputs(struct wacom *wacom) 1021 + { 1022 + if (wacom->wacom_wac.input) 1023 + input_unregister_device(wacom->wacom_wac.input); 1024 + if (wacom->wacom_wac.pad_input) 1025 + input_unregister_device(wacom->wacom_wac.pad_input); 1026 + wacom->wacom_wac.input = NULL; 1027 + wacom->wacom_wac.pad_input = NULL; 1028 + } 1029 + 1030 + static int wacom_register_inputs(struct wacom *wacom) 1031 + { 1032 + struct input_dev *input_dev, *pad_input_dev; 1033 + struct wacom_wac *wacom_wac = &(wacom->wacom_wac); 1034 + int error; 1035 + 1036 + input_dev = wacom_allocate_input(wacom); 1037 + pad_input_dev = wacom_allocate_input(wacom); 1038 + if (!input_dev || !pad_input_dev) { 1039 + error = -ENOMEM; 1040 + goto fail1; 1041 + } 1042 + 1043 + wacom_wac->input = input_dev; 1044 + wacom_wac->pad_input = pad_input_dev; 1045 + wacom_wac->pad_input->name = wacom_wac->pad_name; 1046 + 1047 + error = wacom_setup_input_capabilities(input_dev, wacom_wac); 1048 + if (error) 1049 + goto fail2; 1050 + 1051 + error = input_register_device(input_dev); 1052 + if (error) 1053 + goto fail2; 1054 + 1055 + error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); 1056 + if (error) { 1057 + /* no pad in use on this interface */ 1058 + input_free_device(pad_input_dev); 1059 + wacom_wac->pad_input = NULL; 1060 + pad_input_dev = NULL; 1061 + } else { 1062 + error = input_register_device(pad_input_dev); 1063 + if (error) 1064 + goto fail3; 1065 + } 1066 + 1067 + return 0; 1068 + 1069 + fail3: 1070 + input_unregister_device(input_dev); 1071 + input_dev = NULL; 1072 + fail2: 1073 + wacom_wac->input = NULL; 1074 + wacom_wac->pad_input = NULL; 1075 + fail1: 1076 + if (input_dev) 1077 + input_free_device(input_dev); 1078 + if (pad_input_dev) 1079 + input_free_device(pad_input_dev); 1080 + return error; 1081 + } 1082 + 1083 + static void wacom_wireless_work(struct work_struct *work) 1084 + { 1085 + struct wacom *wacom = container_of(work, struct wacom, work); 1086 + struct usb_device *usbdev = wacom->usbdev; 1087 + struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1088 + struct hid_device *hdev1, *hdev2; 1089 + struct wacom *wacom1, *wacom2; 1090 + struct wacom_wac *wacom_wac1, *wacom_wac2; 1091 + int error; 1092 + 1093 + /* 1094 + * Regardless if this is a disconnect or a new tablet, 1095 + * remove any existing input and battery devices. 1096 + */ 1097 + 1098 + wacom_destroy_battery(wacom); 1099 + 1100 + /* Stylus interface */ 1101 + hdev1 = usb_get_intfdata(usbdev->config->interface[1]); 1102 + wacom1 = hid_get_drvdata(hdev1); 1103 + wacom_wac1 = &(wacom1->wacom_wac); 1104 + wacom_unregister_inputs(wacom1); 1105 + 1106 + /* Touch interface */ 1107 + hdev2 = usb_get_intfdata(usbdev->config->interface[2]); 1108 + wacom2 = hid_get_drvdata(hdev2); 1109 + wacom_wac2 = &(wacom2->wacom_wac); 1110 + wacom_unregister_inputs(wacom2); 1111 + 1112 + if (wacom_wac->pid == 0) { 1113 + hid_info(wacom->hdev, "wireless tablet disconnected\n"); 1114 + wacom_wac1->shared->type = 0; 1115 + } else { 1116 + const struct hid_device_id *id = wacom_ids; 1117 + 1118 + hid_info(wacom->hdev, "wireless tablet connected with PID %x\n", 1119 + wacom_wac->pid); 1120 + 1121 + while (id->bus) { 1122 + if (id->vendor == USB_VENDOR_ID_WACOM && 1123 + id->product == wacom_wac->pid) 1124 + break; 1125 + id++; 1126 + } 1127 + 1128 + if (!id->bus) { 1129 + hid_info(wacom->hdev, "ignoring unknown PID.\n"); 1130 + return; 1131 + } 1132 + 1133 + /* Stylus interface */ 1134 + wacom_wac1->features = 1135 + *((struct wacom_features *)id->driver_data); 1136 + wacom_wac1->features.device_type = BTN_TOOL_PEN; 1137 + snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen", 1138 + wacom_wac1->features.name); 1139 + snprintf(wacom_wac1->pad_name, WACOM_NAME_MAX, "%s (WL) Pad", 1140 + wacom_wac1->features.name); 1141 + wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max; 1142 + wacom_wac1->shared->type = wacom_wac1->features.type; 1143 + error = wacom_register_inputs(wacom1); 1144 + if (error) 1145 + goto fail; 1146 + 1147 + /* Touch interface */ 1148 + if (wacom_wac1->features.touch_max || 1149 + wacom_wac1->features.type == INTUOSHT) { 1150 + wacom_wac2->features = 1151 + *((struct wacom_features *)id->driver_data); 1152 + wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3; 1153 + wacom_wac2->features.device_type = BTN_TOOL_FINGER; 1154 + wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096; 1155 + if (wacom_wac2->features.touch_max) 1156 + snprintf(wacom_wac2->name, WACOM_NAME_MAX, 1157 + "%s (WL) Finger",wacom_wac2->features.name); 1158 + else 1159 + snprintf(wacom_wac2->name, WACOM_NAME_MAX, 1160 + "%s (WL) Pad",wacom_wac2->features.name); 1161 + snprintf(wacom_wac2->pad_name, WACOM_NAME_MAX, 1162 + "%s (WL) Pad", wacom_wac2->features.name); 1163 + error = wacom_register_inputs(wacom2); 1164 + if (error) 1165 + goto fail; 1166 + 1167 + if (wacom_wac1->features.type == INTUOSHT && 1168 + wacom_wac1->features.touch_max) 1169 + wacom_wac->shared->touch_input = wacom_wac2->input; 1170 + } 1171 + 1172 + error = wacom_initialize_battery(wacom); 1173 + if (error) 1174 + goto fail; 1175 + } 1176 + 1177 + return; 1178 + 1179 + fail: 1180 + wacom_unregister_inputs(wacom1); 1181 + wacom_unregister_inputs(wacom2); 1182 + return; 1183 + } 1184 + 1185 + /* 1186 + * Not all devices report physical dimensions from HID. 1187 + * Compute the default from hardcoded logical dimension 1188 + * and resolution before driver overwrites them. 1189 + */ 1190 + static void wacom_set_default_phy(struct wacom_features *features) 1191 + { 1192 + if (features->x_resolution) { 1193 + features->x_phy = (features->x_max * 100) / 1194 + features->x_resolution; 1195 + features->y_phy = (features->y_max * 100) / 1196 + features->y_resolution; 1197 + } 1198 + } 1199 + 1200 + static void wacom_calculate_res(struct wacom_features *features) 1201 + { 1202 + features->x_resolution = wacom_calc_hid_res(features->x_max, 1203 + features->x_phy, 1204 + features->unit, 1205 + features->unitExpo); 1206 + features->y_resolution = wacom_calc_hid_res(features->y_max, 1207 + features->y_phy, 1208 + features->unit, 1209 + features->unitExpo); 1210 + } 1211 + 1212 + static int wacom_hid_report_len(struct hid_report *report) 1213 + { 1214 + /* equivalent to DIV_ROUND_UP(report->size, 8) + !!(report->id > 0) */ 1215 + return ((report->size - 1) >> 3) + 1 + (report->id > 0); 1216 + } 1217 + 1218 + static size_t wacom_compute_pktlen(struct hid_device *hdev) 1219 + { 1220 + struct hid_report_enum *report_enum; 1221 + struct hid_report *report; 1222 + size_t size = 0; 1223 + 1224 + report_enum = hdev->report_enum + HID_INPUT_REPORT; 1225 + 1226 + list_for_each_entry(report, &report_enum->report_list, list) { 1227 + size_t report_size = wacom_hid_report_len(report); 1228 + if (report_size > size) 1229 + size = report_size; 1230 + } 1231 + 1232 + return size; 1233 + } 1234 + 1235 + static int wacom_probe(struct hid_device *hdev, 1236 + const struct hid_device_id *id) 1237 + { 1238 + struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 1239 + struct usb_device *dev = interface_to_usbdev(intf); 1240 + struct wacom *wacom; 1241 + struct wacom_wac *wacom_wac; 1242 + struct wacom_features *features; 1243 + int error; 1244 + 1245 + if (!id->driver_data) 1246 + return -EINVAL; 1247 + 1248 + wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); 1249 + if (!wacom) 1250 + return -ENOMEM; 1251 + 1252 + hid_set_drvdata(hdev, wacom); 1253 + wacom->hdev = hdev; 1254 + 1255 + /* ask for the report descriptor to be loaded by HID */ 1256 + error = hid_parse(hdev); 1257 + if (error) { 1258 + hid_err(hdev, "parse failed\n"); 1259 + goto fail1; 1260 + } 1261 + 1262 + wacom_wac = &wacom->wacom_wac; 1263 + wacom_wac->features = *((struct wacom_features *)id->driver_data); 1264 + features = &wacom_wac->features; 1265 + features->pktlen = wacom_compute_pktlen(hdev); 1266 + if (features->pktlen > WACOM_PKGLEN_MAX) { 1267 + error = -EINVAL; 1268 + goto fail1; 1269 + } 1270 + 1271 + if (features->check_for_hid_type && features->hid_type != hdev->type) { 1272 + error = -ENODEV; 1273 + goto fail1; 1274 + } 1275 + 1276 + wacom->usbdev = dev; 1277 + wacom->intf = intf; 1278 + mutex_init(&wacom->lock); 1279 + INIT_WORK(&wacom->work, wacom_wireless_work); 1280 + 1281 + /* set the default size in case we do not get them from hid */ 1282 + wacom_set_default_phy(features); 1283 + 1284 + /* Retrieve the physical and logical size for touch devices */ 1285 + wacom_retrieve_hid_descriptor(hdev, features); 1286 + 1287 + /* 1288 + * Intuos5 has no useful data about its touch interface in its 1289 + * HID descriptor. If this is the touch interface (PacketSize 1290 + * of WACOM_PKGLEN_BBTOUCH3), override the table values. 1291 + */ 1292 + if (features->type >= INTUOS5S && features->type <= INTUOSHT) { 1293 + if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { 1294 + features->device_type = BTN_TOOL_FINGER; 1295 + 1296 + features->x_max = 4096; 1297 + features->y_max = 4096; 1298 + } else { 1299 + features->device_type = BTN_TOOL_PEN; 1300 + } 1301 + } 1302 + 1303 + /* 1304 + * Same thing for Bamboo 3rd gen. 1305 + */ 1306 + if ((features->type == BAMBOO_PT) && 1307 + (features->pktlen == WACOM_PKGLEN_BBTOUCH3) && 1308 + (features->device_type == BTN_TOOL_PEN)) { 1309 + features->device_type = BTN_TOOL_FINGER; 1310 + 1311 + features->x_max = 4096; 1312 + features->y_max = 4096; 1313 + } 1314 + 1315 + if (hdev->bus == BUS_BLUETOOTH) 1316 + features->quirks |= WACOM_QUIRK_BATTERY; 1317 + 1318 + wacom_setup_device_quirks(features); 1319 + 1320 + /* set unit to "100th of a mm" for devices not reported by HID */ 1321 + if (!features->unit) { 1322 + features->unit = 0x11; 1323 + features->unitExpo = -3; 1324 + } 1325 + wacom_calculate_res(features); 1326 + 1327 + strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); 1328 + snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name), 1329 + "%s Pad", features->name); 1330 + 1331 + if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { 1332 + /* Append the device type to the name */ 1333 + if (features->device_type != BTN_TOOL_FINGER) 1334 + strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX); 1335 + else if (features->touch_max) 1336 + strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX); 1337 + else 1338 + strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX); 1339 + 1340 + error = wacom_add_shared_data(hdev); 1341 + if (error) 1342 + goto fail1; 1343 + } 1344 + 1345 + error = wacom_initialize_leds(wacom); 1346 + if (error) 1347 + goto fail2; 1348 + 1349 + if (!(features->quirks & WACOM_QUIRK_MONITOR) && 1350 + (features->quirks & WACOM_QUIRK_BATTERY)) { 1351 + error = wacom_initialize_battery(wacom); 1352 + if (error) 1353 + goto fail3; 1354 + } 1355 + 1356 + if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) { 1357 + error = wacom_register_inputs(wacom); 1358 + if (error) 1359 + goto fail4; 1360 + } 1361 + 1362 + if (hdev->bus == BUS_BLUETOOTH) { 1363 + error = device_create_file(&hdev->dev, &dev_attr_speed); 1364 + if (error) 1365 + hid_warn(hdev, 1366 + "can't create sysfs speed attribute err: %d\n", 1367 + error); 1368 + } 1369 + 1370 + /* Note that if query fails it is not a hard failure */ 1371 + wacom_query_tablet_data(hdev, features); 1372 + 1373 + /* Regular HID work starts now */ 1374 + error = hid_hw_start(hdev, HID_CONNECT_HIDRAW); 1375 + if (error) { 1376 + hid_err(hdev, "hw start failed\n"); 1377 + goto fail5; 1378 + } 1379 + 1380 + if (features->quirks & WACOM_QUIRK_MONITOR) 1381 + error = hid_hw_open(hdev); 1382 + 1383 + if (wacom_wac->features.type == INTUOSHT && wacom_wac->features.touch_max) { 1384 + if (wacom_wac->features.device_type == BTN_TOOL_FINGER) 1385 + wacom_wac->shared->touch_input = wacom_wac->input; 1386 + } 1387 + 1388 + return 0; 1389 + 1390 + fail5: if (hdev->bus == BUS_BLUETOOTH) 1391 + device_remove_file(&hdev->dev, &dev_attr_speed); 1392 + wacom_unregister_inputs(wacom); 1393 + fail4: wacom_destroy_battery(wacom); 1394 + fail3: wacom_destroy_leds(wacom); 1395 + fail2: wacom_remove_shared_data(wacom_wac); 1396 + fail1: kfree(wacom); 1397 + hid_set_drvdata(hdev, NULL); 1398 + return error; 1399 + } 1400 + 1401 + static void wacom_remove(struct hid_device *hdev) 1402 + { 1403 + struct wacom *wacom = hid_get_drvdata(hdev); 1404 + 1405 + hid_hw_stop(hdev); 1406 + 1407 + cancel_work_sync(&wacom->work); 1408 + wacom_unregister_inputs(wacom); 1409 + if (hdev->bus == BUS_BLUETOOTH) 1410 + device_remove_file(&hdev->dev, &dev_attr_speed); 1411 + wacom_destroy_battery(wacom); 1412 + wacom_destroy_leds(wacom); 1413 + wacom_remove_shared_data(&wacom->wacom_wac); 1414 + 1415 + hid_set_drvdata(hdev, NULL); 1416 + kfree(wacom); 1417 + } 1418 + 1419 + static int wacom_resume(struct hid_device *hdev) 1420 + { 1421 + struct wacom *wacom = hid_get_drvdata(hdev); 1422 + struct wacom_features *features = &wacom->wacom_wac.features; 1423 + 1424 + mutex_lock(&wacom->lock); 1425 + 1426 + /* switch to wacom mode first */ 1427 + wacom_query_tablet_data(hdev, features); 1428 + wacom_led_control(wacom); 1429 + 1430 + mutex_unlock(&wacom->lock); 1431 + 1432 + return 0; 1433 + } 1434 + 1435 + static int wacom_reset_resume(struct hid_device *hdev) 1436 + { 1437 + return wacom_resume(hdev); 1438 + } 1439 + 1440 + static struct hid_driver wacom_driver = { 1441 + .name = "wacom", 1442 + .id_table = wacom_ids, 1443 + .probe = wacom_probe, 1444 + .remove = wacom_remove, 1445 + #ifdef CONFIG_PM 1446 + .resume = wacom_resume, 1447 + .reset_resume = wacom_reset_resume, 1448 + #endif 1449 + .raw_event = wacom_raw_event, 1450 + }; 1451 + module_hid_driver(wacom_driver); 1452 + 1453 + MODULE_VERSION(DRIVER_VERSION); 1454 + MODULE_AUTHOR(DRIVER_AUTHOR); 1455 + MODULE_DESCRIPTION(DRIVER_DESC); 1456 + MODULE_LICENSE(DRIVER_LICENSE);
+10
drivers/input/keyboard/Kconfig
··· 665 665 To compile this driver as a module, choose M here: the 666 666 module will be called cros_ec_keyb. 667 667 668 + config KEYBOARD_CAP1106 669 + tristate "Microchip CAP1106 touch sensor" 670 + depends on OF && I2C 671 + select REGMAP_I2C 672 + help 673 + Say Y here to enable the CAP1106 touch sensor driver. 674 + 675 + To compile this driver as a module, choose M here: the 676 + module will be called cap1106. 677 + 668 678 endif
+1
drivers/input/keyboard/Makefile
··· 11 11 obj-$(CONFIG_KEYBOARD_ATARI) += atakbd.o 12 12 obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o 13 13 obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o 14 + obj-$(CONFIG_KEYBOARD_CAP1106) += cap1106.o 14 15 obj-$(CONFIG_KEYBOARD_CLPS711X) += clps711x-keypad.o 15 16 obj-$(CONFIG_KEYBOARD_CROS_EC) += cros_ec_keyb.o 16 17 obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o
+335
drivers/input/keyboard/cap1106.c
··· 1 + /* 2 + * Input driver for Microchip CAP1106, 6 channel capacitive touch sensor 3 + * 4 + * http://www.microchip.com/wwwproducts/Devices.aspx?product=CAP1106 5 + * 6 + * (c) 2014 Daniel Mack <linux@zonque.org> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 as 10 + * published by the Free Software Foundation. 11 + */ 12 + 13 + #include <linux/kernel.h> 14 + #include <linux/module.h> 15 + #include <linux/interrupt.h> 16 + #include <linux/input.h> 17 + #include <linux/of_irq.h> 18 + #include <linux/regmap.h> 19 + #include <linux/i2c.h> 20 + #include <linux/gpio/consumer.h> 21 + 22 + #define CAP1106_REG_MAIN_CONTROL 0x00 23 + #define CAP1106_REG_MAIN_CONTROL_GAIN_SHIFT (6) 24 + #define CAP1106_REG_MAIN_CONTROL_GAIN_MASK (0xc0) 25 + #define CAP1106_REG_MAIN_CONTROL_DLSEEP BIT(4) 26 + #define CAP1106_REG_GENERAL_STATUS 0x02 27 + #define CAP1106_REG_SENSOR_INPUT 0x03 28 + #define CAP1106_REG_NOISE_FLAG_STATUS 0x0a 29 + #define CAP1106_REG_SENOR_DELTA(X) (0x10 + (X)) 30 + #define CAP1106_REG_SENSITIVITY_CONTROL 0x1f 31 + #define CAP1106_REG_CONFIG 0x20 32 + #define CAP1106_REG_SENSOR_ENABLE 0x21 33 + #define CAP1106_REG_SENSOR_CONFIG 0x22 34 + #define CAP1106_REG_SENSOR_CONFIG2 0x23 35 + #define CAP1106_REG_SAMPLING_CONFIG 0x24 36 + #define CAP1106_REG_CALIBRATION 0x25 37 + #define CAP1106_REG_INT_ENABLE 0x26 38 + #define CAP1106_REG_REPEAT_RATE 0x28 39 + #define CAP1106_REG_MT_CONFIG 0x2a 40 + #define CAP1106_REG_MT_PATTERN_CONFIG 0x2b 41 + #define CAP1106_REG_MT_PATTERN 0x2d 42 + #define CAP1106_REG_RECALIB_CONFIG 0x2f 43 + #define CAP1106_REG_SENSOR_THRESH(X) (0x30 + (X)) 44 + #define CAP1106_REG_SENSOR_NOISE_THRESH 0x38 45 + #define CAP1106_REG_STANDBY_CHANNEL 0x40 46 + #define CAP1106_REG_STANDBY_CONFIG 0x41 47 + #define CAP1106_REG_STANDBY_SENSITIVITY 0x42 48 + #define CAP1106_REG_STANDBY_THRESH 0x43 49 + #define CAP1106_REG_CONFIG2 0x44 50 + #define CAP1106_REG_SENSOR_BASE_CNT(X) (0x50 + (X)) 51 + #define CAP1106_REG_SENSOR_CALIB (0xb1 + (X)) 52 + #define CAP1106_REG_SENSOR_CALIB_LSB1 0xb9 53 + #define CAP1106_REG_SENSOR_CALIB_LSB2 0xba 54 + #define CAP1106_REG_PRODUCT_ID 0xfd 55 + #define CAP1106_REG_MANUFACTURER_ID 0xfe 56 + #define CAP1106_REG_REVISION 0xff 57 + 58 + #define CAP1106_NUM_CHN 6 59 + #define CAP1106_PRODUCT_ID 0x55 60 + #define CAP1106_MANUFACTURER_ID 0x5d 61 + 62 + struct cap1106_priv { 63 + struct regmap *regmap; 64 + struct input_dev *idev; 65 + 66 + /* config */ 67 + unsigned int keycodes[CAP1106_NUM_CHN]; 68 + }; 69 + 70 + static const struct reg_default cap1106_reg_defaults[] = { 71 + { CAP1106_REG_MAIN_CONTROL, 0x00 }, 72 + { CAP1106_REG_GENERAL_STATUS, 0x00 }, 73 + { CAP1106_REG_SENSOR_INPUT, 0x00 }, 74 + { CAP1106_REG_NOISE_FLAG_STATUS, 0x00 }, 75 + { CAP1106_REG_SENSITIVITY_CONTROL, 0x2f }, 76 + { CAP1106_REG_CONFIG, 0x20 }, 77 + { CAP1106_REG_SENSOR_ENABLE, 0x3f }, 78 + { CAP1106_REG_SENSOR_CONFIG, 0xa4 }, 79 + { CAP1106_REG_SENSOR_CONFIG2, 0x07 }, 80 + { CAP1106_REG_SAMPLING_CONFIG, 0x39 }, 81 + { CAP1106_REG_CALIBRATION, 0x00 }, 82 + { CAP1106_REG_INT_ENABLE, 0x3f }, 83 + { CAP1106_REG_REPEAT_RATE, 0x3f }, 84 + { CAP1106_REG_MT_CONFIG, 0x80 }, 85 + { CAP1106_REG_MT_PATTERN_CONFIG, 0x00 }, 86 + { CAP1106_REG_MT_PATTERN, 0x3f }, 87 + { CAP1106_REG_RECALIB_CONFIG, 0x8a }, 88 + { CAP1106_REG_SENSOR_THRESH(0), 0x40 }, 89 + { CAP1106_REG_SENSOR_THRESH(1), 0x40 }, 90 + { CAP1106_REG_SENSOR_THRESH(2), 0x40 }, 91 + { CAP1106_REG_SENSOR_THRESH(3), 0x40 }, 92 + { CAP1106_REG_SENSOR_THRESH(4), 0x40 }, 93 + { CAP1106_REG_SENSOR_THRESH(5), 0x40 }, 94 + { CAP1106_REG_SENSOR_NOISE_THRESH, 0x01 }, 95 + { CAP1106_REG_STANDBY_CHANNEL, 0x00 }, 96 + { CAP1106_REG_STANDBY_CONFIG, 0x39 }, 97 + { CAP1106_REG_STANDBY_SENSITIVITY, 0x02 }, 98 + { CAP1106_REG_STANDBY_THRESH, 0x40 }, 99 + { CAP1106_REG_CONFIG2, 0x40 }, 100 + { CAP1106_REG_SENSOR_CALIB_LSB1, 0x00 }, 101 + { CAP1106_REG_SENSOR_CALIB_LSB2, 0x00 }, 102 + }; 103 + 104 + static bool cap1106_volatile_reg(struct device *dev, unsigned int reg) 105 + { 106 + switch (reg) { 107 + case CAP1106_REG_MAIN_CONTROL: 108 + case CAP1106_REG_SENSOR_INPUT: 109 + case CAP1106_REG_SENOR_DELTA(0): 110 + case CAP1106_REG_SENOR_DELTA(1): 111 + case CAP1106_REG_SENOR_DELTA(2): 112 + case CAP1106_REG_SENOR_DELTA(3): 113 + case CAP1106_REG_SENOR_DELTA(4): 114 + case CAP1106_REG_SENOR_DELTA(5): 115 + case CAP1106_REG_PRODUCT_ID: 116 + case CAP1106_REG_MANUFACTURER_ID: 117 + case CAP1106_REG_REVISION: 118 + return true; 119 + } 120 + 121 + return false; 122 + } 123 + 124 + static const struct regmap_config cap1106_regmap_config = { 125 + .reg_bits = 8, 126 + .val_bits = 8, 127 + 128 + .max_register = CAP1106_REG_REVISION, 129 + .reg_defaults = cap1106_reg_defaults, 130 + 131 + .num_reg_defaults = ARRAY_SIZE(cap1106_reg_defaults), 132 + .cache_type = REGCACHE_RBTREE, 133 + .volatile_reg = cap1106_volatile_reg, 134 + }; 135 + 136 + static irqreturn_t cap1106_thread_func(int irq_num, void *data) 137 + { 138 + struct cap1106_priv *priv = data; 139 + unsigned int status; 140 + int ret, i; 141 + 142 + /* 143 + * Deassert interrupt. This needs to be done before reading the status 144 + * registers, which will not carry valid values otherwise. 145 + */ 146 + ret = regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL, 1, 0); 147 + if (ret < 0) 148 + goto out; 149 + 150 + ret = regmap_read(priv->regmap, CAP1106_REG_SENSOR_INPUT, &status); 151 + if (ret < 0) 152 + goto out; 153 + 154 + for (i = 0; i < CAP1106_NUM_CHN; i++) 155 + input_report_key(priv->idev, priv->keycodes[i], 156 + status & (1 << i)); 157 + 158 + input_sync(priv->idev); 159 + 160 + out: 161 + return IRQ_HANDLED; 162 + } 163 + 164 + static int cap1106_set_sleep(struct cap1106_priv *priv, bool sleep) 165 + { 166 + return regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL, 167 + CAP1106_REG_MAIN_CONTROL_DLSEEP, 168 + sleep ? CAP1106_REG_MAIN_CONTROL_DLSEEP : 0); 169 + } 170 + 171 + static int cap1106_input_open(struct input_dev *idev) 172 + { 173 + struct cap1106_priv *priv = input_get_drvdata(idev); 174 + 175 + return cap1106_set_sleep(priv, false); 176 + } 177 + 178 + static void cap1106_input_close(struct input_dev *idev) 179 + { 180 + struct cap1106_priv *priv = input_get_drvdata(idev); 181 + 182 + cap1106_set_sleep(priv, true); 183 + } 184 + 185 + static int cap1106_i2c_probe(struct i2c_client *i2c_client, 186 + const struct i2c_device_id *id) 187 + { 188 + struct device *dev = &i2c_client->dev; 189 + struct cap1106_priv *priv; 190 + struct device_node *node; 191 + int i, error, irq, gain = 0; 192 + unsigned int val, rev; 193 + u32 gain32, keycodes[CAP1106_NUM_CHN]; 194 + 195 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 196 + if (!priv) 197 + return -ENOMEM; 198 + 199 + priv->regmap = devm_regmap_init_i2c(i2c_client, &cap1106_regmap_config); 200 + if (IS_ERR(priv->regmap)) 201 + return PTR_ERR(priv->regmap); 202 + 203 + error = regmap_read(priv->regmap, CAP1106_REG_PRODUCT_ID, &val); 204 + if (error) 205 + return error; 206 + 207 + if (val != CAP1106_PRODUCT_ID) { 208 + dev_err(dev, "Product ID: Got 0x%02x, expected 0x%02x\n", 209 + val, CAP1106_PRODUCT_ID); 210 + return -ENODEV; 211 + } 212 + 213 + error = regmap_read(priv->regmap, CAP1106_REG_MANUFACTURER_ID, &val); 214 + if (error) 215 + return error; 216 + 217 + if (val != CAP1106_MANUFACTURER_ID) { 218 + dev_err(dev, "Manufacturer ID: Got 0x%02x, expected 0x%02x\n", 219 + val, CAP1106_MANUFACTURER_ID); 220 + return -ENODEV; 221 + } 222 + 223 + error = regmap_read(priv->regmap, CAP1106_REG_REVISION, &rev); 224 + if (error < 0) 225 + return error; 226 + 227 + dev_info(dev, "CAP1106 detected, revision 0x%02x\n", rev); 228 + i2c_set_clientdata(i2c_client, priv); 229 + node = dev->of_node; 230 + 231 + if (!of_property_read_u32(node, "microchip,sensor-gain", &gain32)) { 232 + if (is_power_of_2(gain32) && gain32 <= 8) 233 + gain = ilog2(gain32); 234 + else 235 + dev_err(dev, "Invalid sensor-gain value %d\n", gain32); 236 + } 237 + 238 + BUILD_BUG_ON(ARRAY_SIZE(keycodes) != ARRAY_SIZE(priv->keycodes)); 239 + 240 + /* Provide some useful defaults */ 241 + for (i = 0; i < ARRAY_SIZE(keycodes); i++) 242 + keycodes[i] = KEY_A + i; 243 + 244 + of_property_read_u32_array(node, "linux,keycodes", 245 + keycodes, ARRAY_SIZE(keycodes)); 246 + 247 + for (i = 0; i < ARRAY_SIZE(keycodes); i++) 248 + priv->keycodes[i] = keycodes[i]; 249 + 250 + error = regmap_update_bits(priv->regmap, CAP1106_REG_MAIN_CONTROL, 251 + CAP1106_REG_MAIN_CONTROL_GAIN_MASK, 252 + gain << CAP1106_REG_MAIN_CONTROL_GAIN_SHIFT); 253 + if (error) 254 + return error; 255 + 256 + /* Disable autorepeat. The Linux input system has its own handling. */ 257 + error = regmap_write(priv->regmap, CAP1106_REG_REPEAT_RATE, 0); 258 + if (error) 259 + return error; 260 + 261 + priv->idev = devm_input_allocate_device(dev); 262 + if (!priv->idev) 263 + return -ENOMEM; 264 + 265 + priv->idev->name = "CAP1106 capacitive touch sensor"; 266 + priv->idev->id.bustype = BUS_I2C; 267 + priv->idev->evbit[0] = BIT_MASK(EV_KEY); 268 + 269 + if (of_property_read_bool(node, "autorepeat")) 270 + __set_bit(EV_REP, priv->idev->evbit); 271 + 272 + for (i = 0; i < CAP1106_NUM_CHN; i++) 273 + __set_bit(priv->keycodes[i], priv->idev->keybit); 274 + 275 + priv->idev->id.vendor = CAP1106_MANUFACTURER_ID; 276 + priv->idev->id.product = CAP1106_PRODUCT_ID; 277 + priv->idev->id.version = rev; 278 + 279 + priv->idev->open = cap1106_input_open; 280 + priv->idev->close = cap1106_input_close; 281 + 282 + input_set_drvdata(priv->idev, priv); 283 + 284 + /* 285 + * Put the device in deep sleep mode for now. 286 + * ->open() will bring it back once the it is actually needed. 287 + */ 288 + cap1106_set_sleep(priv, true); 289 + 290 + error = input_register_device(priv->idev); 291 + if (error) 292 + return error; 293 + 294 + irq = irq_of_parse_and_map(node, 0); 295 + if (!irq) { 296 + dev_err(dev, "Unable to parse or map IRQ\n"); 297 + return -ENXIO; 298 + } 299 + 300 + error = devm_request_threaded_irq(dev, irq, NULL, cap1106_thread_func, 301 + IRQF_ONESHOT, dev_name(dev), priv); 302 + if (error) 303 + return error; 304 + 305 + return 0; 306 + } 307 + 308 + static const struct of_device_id cap1106_dt_ids[] = { 309 + { .compatible = "microchip,cap1106", }, 310 + {} 311 + }; 312 + MODULE_DEVICE_TABLE(of, cap1106_dt_ids); 313 + 314 + static const struct i2c_device_id cap1106_i2c_ids[] = { 315 + { "cap1106", 0 }, 316 + {} 317 + }; 318 + MODULE_DEVICE_TABLE(i2c, cap1106_i2c_ids); 319 + 320 + static struct i2c_driver cap1106_i2c_driver = { 321 + .driver = { 322 + .name = "cap1106", 323 + .owner = THIS_MODULE, 324 + .of_match_table = cap1106_dt_ids, 325 + }, 326 + .id_table = cap1106_i2c_ids, 327 + .probe = cap1106_i2c_probe, 328 + }; 329 + 330 + module_i2c_driver(cap1106_i2c_driver); 331 + 332 + MODULE_ALIAS("platform:cap1106"); 333 + MODULE_DESCRIPTION("Microchip CAP1106 driver"); 334 + MODULE_AUTHOR("Daniel Mack <linux@zonque.org>"); 335 + MODULE_LICENSE("GPL v2");
+2 -4
drivers/input/keyboard/imx_keypad.c
··· 531 531 return 0; 532 532 } 533 533 534 - #ifdef CONFIG_PM_SLEEP 535 - static int imx_kbd_suspend(struct device *dev) 534 + static int __maybe_unused imx_kbd_suspend(struct device *dev) 536 535 { 537 536 struct platform_device *pdev = to_platform_device(dev); 538 537 struct imx_keypad *kbd = platform_get_drvdata(pdev); ··· 551 552 return 0; 552 553 } 553 554 554 - static int imx_kbd_resume(struct device *dev) 555 + static int __maybe_unused imx_kbd_resume(struct device *dev) 555 556 { 556 557 struct platform_device *pdev = to_platform_device(dev); 557 558 struct imx_keypad *kbd = platform_get_drvdata(pdev); ··· 574 575 575 576 return ret; 576 577 } 577 - #endif 578 578 579 579 static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume); 580 580
+16 -29
drivers/input/keyboard/max7359_keypad.c
··· 203 203 204 204 dev_dbg(&client->dev, "keys FIFO is 0x%02x\n", ret); 205 205 206 - keypad = kzalloc(sizeof(struct max7359_keypad), GFP_KERNEL); 207 - input_dev = input_allocate_device(); 208 - if (!keypad || !input_dev) { 206 + keypad = devm_kzalloc(&client->dev, sizeof(struct max7359_keypad), 207 + GFP_KERNEL); 208 + if (!keypad) { 209 209 dev_err(&client->dev, "failed to allocate memory\n"); 210 - error = -ENOMEM; 211 - goto failed_free_mem; 210 + return -ENOMEM; 211 + } 212 + 213 + input_dev = devm_input_allocate_device(&client->dev); 214 + if (!input_dev) { 215 + dev_err(&client->dev, "failed to allocate input device\n"); 216 + return -ENOMEM; 212 217 } 213 218 214 219 keypad->client = client; ··· 235 230 236 231 max7359_build_keycode(keypad, keymap_data); 237 232 238 - error = request_threaded_irq(client->irq, NULL, max7359_interrupt, 239 - IRQF_TRIGGER_LOW | IRQF_ONESHOT, 240 - client->name, keypad); 233 + error = devm_request_threaded_irq(&client->dev, client->irq, NULL, 234 + max7359_interrupt, 235 + IRQF_TRIGGER_LOW | IRQF_ONESHOT, 236 + client->name, keypad); 241 237 if (error) { 242 238 dev_err(&client->dev, "failed to register interrupt\n"); 243 - goto failed_free_mem; 239 + return error; 244 240 } 245 241 246 242 /* Register the input device */ 247 243 error = input_register_device(input_dev); 248 244 if (error) { 249 245 dev_err(&client->dev, "failed to register input device\n"); 250 - goto failed_free_irq; 246 + return error; 251 247 } 252 248 253 249 /* Initialize MAX7359 */ ··· 256 250 257 251 i2c_set_clientdata(client, keypad); 258 252 device_init_wakeup(&client->dev, 1); 259 - 260 - return 0; 261 - 262 - failed_free_irq: 263 - free_irq(client->irq, keypad); 264 - failed_free_mem: 265 - input_free_device(input_dev); 266 - kfree(keypad); 267 - return error; 268 - } 269 - 270 - static int max7359_remove(struct i2c_client *client) 271 - { 272 - struct max7359_keypad *keypad = i2c_get_clientdata(client); 273 - 274 - free_irq(client->irq, keypad); 275 - input_unregister_device(keypad->input_dev); 276 - kfree(keypad); 277 253 278 254 return 0; 279 255 } ··· 301 313 .pm = &max7359_pm, 302 314 }, 303 315 .probe = max7359_probe, 304 - .remove = max7359_remove, 305 316 .id_table = max7359_ids, 306 317 }; 307 318
-1
drivers/input/misc/keyspan_remote.c
··· 392 392 393 393 default: 394 394 goto resubmit; 395 - break; 396 395 } 397 396 398 397 if (debug)
+3
drivers/input/misc/soc_button_array.c
··· 83 83 sizeof(*gpio_keys_pdata) + 84 84 sizeof(*gpio_keys) * MAX_NBUTTONS, 85 85 GFP_KERNEL); 86 + if (!gpio_keys_pdata) 87 + return ERR_PTR(-ENOMEM); 88 + 86 89 gpio_keys = (void *)(gpio_keys_pdata + 1); 87 90 88 91 for (info = button_info; info->name; info++) {
+28 -19
drivers/input/misc/uinput.c
··· 311 311 static int uinput_validate_absbits(struct input_dev *dev) 312 312 { 313 313 unsigned int cnt; 314 - int retval = 0; 314 + int nslot; 315 + 316 + if (!test_bit(EV_ABS, dev->evbit)) 317 + return 0; 318 + 319 + /* 320 + * Check if absmin/absmax/absfuzz/absflat are sane. 321 + */ 315 322 316 323 for (cnt = 0; cnt < ABS_CNT; cnt++) { 317 324 int min, max; ··· 334 327 UINPUT_NAME, cnt, 335 328 input_abs_get_min(dev, cnt), 336 329 input_abs_get_max(dev, cnt)); 337 - retval = -EINVAL; 338 - break; 330 + return -EINVAL; 339 331 } 340 332 341 333 if (input_abs_get_flat(dev, cnt) > ··· 346 340 input_abs_get_flat(dev, cnt), 347 341 input_abs_get_min(dev, cnt), 348 342 input_abs_get_max(dev, cnt)); 349 - retval = -EINVAL; 350 - break; 343 + return -EINVAL; 351 344 } 352 345 } 353 - return retval; 346 + 347 + if (test_bit(ABS_MT_SLOT, dev->absbit)) { 348 + nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1; 349 + input_mt_init_slots(dev, nslot, 0); 350 + } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { 351 + input_set_events_per_packet(dev, 60); 352 + } 353 + 354 + return 0; 354 355 } 355 356 356 357 static int uinput_allocate_device(struct uinput_device *udev) ··· 423 410 input_abs_set_flat(dev, i, user_dev->absflat[i]); 424 411 } 425 412 426 - /* check if absmin/absmax/absfuzz/absflat are filled as 427 - * told in Documentation/input/input-programming.txt */ 428 - if (test_bit(EV_ABS, dev->evbit)) { 429 - retval = uinput_validate_absbits(dev); 430 - if (retval < 0) 431 - goto exit; 432 - if (test_bit(ABS_MT_SLOT, dev->absbit)) { 433 - int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1; 434 - input_mt_init_slots(dev, nslot, 0); 435 - } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { 436 - input_set_events_per_packet(dev, 60); 437 - } 438 - } 413 + retval = uinput_validate_absbits(dev); 414 + if (retval < 0) 415 + goto exit; 439 416 440 417 udev->state = UIST_SETUP_COMPLETE; 441 418 retval = count; ··· 723 720 } 724 721 725 722 switch (cmd) { 723 + case UI_GET_VERSION: 724 + if (put_user(UINPUT_VERSION, 725 + (unsigned int __user *)p)) 726 + retval = -EFAULT; 727 + goto out; 728 + 726 729 case UI_DEV_CREATE: 727 730 retval = uinput_create_device(udev); 728 731 goto out;
+464 -227
drivers/input/mouse/alps.c
··· 99 99 #define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */ 100 100 #define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with 101 101 6-byte ALPS packet */ 102 + #define ALPS_IS_RUSHMORE 0x100 /* device is a rushmore */ 103 + #define ALPS_BUTTONPAD 0x200 /* device is a clickpad */ 102 104 103 105 static const struct alps_model_info alps_model_data[] = { 104 106 { { 0x32, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */ ··· 283 281 * 284 282 * The bitmaps don't have enough data to track fingers, so this function 285 283 * only generates points representing a bounding box of at most two contacts. 286 - * These two points are returned in x1, y1, x2, and y2. 284 + * These two points are returned in fields->mt. 287 285 */ 288 286 static void alps_process_bitmap_dolphin(struct alps_data *priv, 289 - struct alps_fields *fields, 290 - int *x1, int *y1, int *x2, int *y2) 287 + struct alps_fields *fields) 291 288 { 292 289 int box_middle_x, box_middle_y; 293 290 unsigned int x_map, y_map; ··· 309 308 if (x_msb > priv->x_bits || y_msb > priv->y_bits) 310 309 return; 311 310 312 - *x1 = *y1 = *x2 = *y2 = 0; 313 - 314 311 if (fields->fingers > 1) { 315 312 start_bit = priv->x_bits - x_msb; 316 313 end_bit = priv->x_bits - x_lsb; ··· 319 320 end_bit = y_msb - 1; 320 321 box_middle_y = (priv->y_max * (start_bit + end_bit)) / 321 322 (2 * (priv->y_bits - 1)); 322 - *x1 = fields->x; 323 - *y1 = fields->y; 324 - *x2 = 2 * box_middle_x - *x1; 325 - *y2 = 2 * box_middle_y - *y1; 323 + fields->mt[0] = fields->st; 324 + fields->mt[1].x = 2 * box_middle_x - fields->mt[0].x; 325 + fields->mt[1].y = 2 * box_middle_y - fields->mt[0].y; 326 + } 327 + } 328 + 329 + static void alps_get_bitmap_points(unsigned int map, 330 + struct alps_bitmap_point *low, 331 + struct alps_bitmap_point *high, 332 + int *fingers) 333 + { 334 + struct alps_bitmap_point *point; 335 + int i, bit, prev_bit = 0; 336 + 337 + point = low; 338 + for (i = 0; map != 0; i++, map >>= 1) { 339 + bit = map & 1; 340 + if (bit) { 341 + if (!prev_bit) { 342 + point->start_bit = i; 343 + point->num_bits = 0; 344 + (*fingers)++; 345 + } 346 + point->num_bits++; 347 + } else { 348 + if (prev_bit) 349 + point = high; 350 + } 351 + prev_bit = bit; 326 352 } 327 353 } 328 354 ··· 358 334 * 359 335 * The bitmaps don't have enough data to track fingers, so this function 360 336 * only generates points representing a bounding box of all contacts. 361 - * These points are returned in x1, y1, x2, and y2 when the return value 337 + * These points are returned in fields->mt when the return value 362 338 * is greater than 0. 363 339 */ 364 340 static int alps_process_bitmap(struct alps_data *priv, 365 - unsigned int x_map, unsigned int y_map, 366 - int *x1, int *y1, int *x2, int *y2) 341 + struct alps_fields *fields) 367 342 { 368 - struct alps_bitmap_point { 369 - int start_bit; 370 - int num_bits; 371 - }; 372 - 373 - int fingers_x = 0, fingers_y = 0, fingers; 374 - int i, bit, prev_bit; 343 + int i, fingers_x = 0, fingers_y = 0, fingers; 375 344 struct alps_bitmap_point x_low = {0,}, x_high = {0,}; 376 345 struct alps_bitmap_point y_low = {0,}, y_high = {0,}; 377 - struct alps_bitmap_point *point; 378 346 379 - if (!x_map || !y_map) 347 + if (!fields->x_map || !fields->y_map) 380 348 return 0; 381 349 382 - *x1 = *y1 = *x2 = *y2 = 0; 383 - 384 - prev_bit = 0; 385 - point = &x_low; 386 - for (i = 0; x_map != 0; i++, x_map >>= 1) { 387 - bit = x_map & 1; 388 - if (bit) { 389 - if (!prev_bit) { 390 - point->start_bit = i; 391 - fingers_x++; 392 - } 393 - point->num_bits++; 394 - } else { 395 - if (prev_bit) 396 - point = &x_high; 397 - else 398 - point->num_bits = 0; 399 - } 400 - prev_bit = bit; 401 - } 402 - 403 - /* 404 - * y bitmap is reversed for what we need (lower positions are in 405 - * higher bits), so we process from the top end. 406 - */ 407 - y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - priv->y_bits); 408 - prev_bit = 0; 409 - point = &y_low; 410 - for (i = 0; y_map != 0; i++, y_map <<= 1) { 411 - bit = y_map & (1 << (sizeof(y_map) * BITS_PER_BYTE - 1)); 412 - if (bit) { 413 - if (!prev_bit) { 414 - point->start_bit = i; 415 - fingers_y++; 416 - } 417 - point->num_bits++; 418 - } else { 419 - if (prev_bit) 420 - point = &y_high; 421 - else 422 - point->num_bits = 0; 423 - } 424 - prev_bit = bit; 425 - } 350 + alps_get_bitmap_points(fields->x_map, &x_low, &x_high, &fingers_x); 351 + alps_get_bitmap_points(fields->y_map, &y_low, &y_high, &fingers_y); 426 352 427 353 /* 428 354 * Fingers can overlap, so we use the maximum count of fingers ··· 381 407 fingers = max(fingers_x, fingers_y); 382 408 383 409 /* 384 - * If total fingers is > 1 but either axis reports only a single 385 - * contact, we have overlapping or adjacent fingers. For the 386 - * purposes of creating a bounding box, divide the single contact 387 - * (roughly) equally between the two points. 410 + * If an axis reports only a single contact, we have overlapping or 411 + * adjacent fingers. Divide the single contact between the two points. 388 412 */ 389 - if (fingers > 1) { 390 - if (fingers_x == 1) { 391 - i = x_low.num_bits / 2; 392 - x_low.num_bits = x_low.num_bits - i; 393 - x_high.start_bit = x_low.start_bit + i; 394 - x_high.num_bits = max(i, 1); 395 - } else if (fingers_y == 1) { 396 - i = y_low.num_bits / 2; 397 - y_low.num_bits = y_low.num_bits - i; 398 - y_high.start_bit = y_low.start_bit + i; 399 - y_high.num_bits = max(i, 1); 400 - } 413 + if (fingers_x == 1) { 414 + i = (x_low.num_bits - 1) / 2; 415 + x_low.num_bits = x_low.num_bits - i; 416 + x_high.start_bit = x_low.start_bit + i; 417 + x_high.num_bits = max(i, 1); 418 + } 419 + if (fingers_y == 1) { 420 + i = (y_low.num_bits - 1) / 2; 421 + y_low.num_bits = y_low.num_bits - i; 422 + y_high.start_bit = y_low.start_bit + i; 423 + y_high.num_bits = max(i, 1); 401 424 } 402 425 403 - *x1 = (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) / 404 - (2 * (priv->x_bits - 1)); 405 - *y1 = (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) / 406 - (2 * (priv->y_bits - 1)); 426 + fields->mt[0].x = 427 + (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) / 428 + (2 * (priv->x_bits - 1)); 429 + fields->mt[0].y = 430 + (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) / 431 + (2 * (priv->y_bits - 1)); 407 432 408 - if (fingers > 1) { 409 - *x2 = (priv->x_max * 410 - (2 * x_high.start_bit + x_high.num_bits - 1)) / 411 - (2 * (priv->x_bits - 1)); 412 - *y2 = (priv->y_max * 413 - (2 * y_high.start_bit + y_high.num_bits - 1)) / 414 - (2 * (priv->y_bits - 1)); 433 + fields->mt[1].x = 434 + (priv->x_max * (2 * x_high.start_bit + x_high.num_bits - 1)) / 435 + (2 * (priv->x_bits - 1)); 436 + fields->mt[1].y = 437 + (priv->y_max * (2 * y_high.start_bit + y_high.num_bits - 1)) / 438 + (2 * (priv->y_bits - 1)); 439 + 440 + /* y-bitmap order is reversed, except on rushmore */ 441 + if (!(priv->flags & ALPS_IS_RUSHMORE)) { 442 + fields->mt[0].y = priv->y_max - fields->mt[0].y; 443 + fields->mt[1].y = priv->y_max - fields->mt[1].y; 415 444 } 416 445 417 446 return fingers; 418 447 } 419 448 420 - static void alps_set_slot(struct input_dev *dev, int slot, bool active, 421 - int x, int y) 449 + static void alps_set_slot(struct input_dev *dev, int slot, int x, int y) 422 450 { 423 451 input_mt_slot(dev, slot); 424 - input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); 425 - if (active) { 426 - input_report_abs(dev, ABS_MT_POSITION_X, x); 427 - input_report_abs(dev, ABS_MT_POSITION_Y, y); 428 - } 452 + input_mt_report_slot_state(dev, MT_TOOL_FINGER, true); 453 + input_report_abs(dev, ABS_MT_POSITION_X, x); 454 + input_report_abs(dev, ABS_MT_POSITION_Y, y); 429 455 } 430 456 431 - static void alps_report_semi_mt_data(struct input_dev *dev, int num_fingers, 432 - int x1, int y1, int x2, int y2) 457 + static void alps_report_mt_data(struct psmouse *psmouse, int n) 433 458 { 434 - alps_set_slot(dev, 0, num_fingers != 0, x1, y1); 435 - alps_set_slot(dev, 1, num_fingers == 2, x2, y2); 459 + struct alps_data *priv = psmouse->private; 460 + struct input_dev *dev = psmouse->dev; 461 + struct alps_fields *f = &priv->f; 462 + int i, slot[MAX_TOUCHES]; 463 + 464 + input_mt_assign_slots(dev, slot, f->mt, n); 465 + for (i = 0; i < n; i++) 466 + alps_set_slot(dev, slot[i], f->mt[i].x, f->mt[i].y); 467 + 468 + input_mt_sync_frame(dev); 469 + } 470 + 471 + static void alps_report_semi_mt_data(struct psmouse *psmouse, int fingers) 472 + { 473 + struct alps_data *priv = psmouse->private; 474 + struct input_dev *dev = psmouse->dev; 475 + struct alps_fields *f = &priv->f; 476 + 477 + /* Use st data when we don't have mt data */ 478 + if (fingers < 2) { 479 + f->mt[0].x = f->st.x; 480 + f->mt[0].y = f->st.y; 481 + fingers = f->pressure > 0 ? 1 : 0; 482 + } 483 + 484 + alps_report_mt_data(psmouse, (fingers <= 2) ? fingers : 2); 485 + 486 + input_mt_report_finger_count(dev, fingers); 487 + 488 + input_report_key(dev, BTN_LEFT, f->left); 489 + input_report_key(dev, BTN_RIGHT, f->right); 490 + input_report_key(dev, BTN_MIDDLE, f->middle); 491 + 492 + input_report_abs(dev, ABS_PRESSURE, f->pressure); 493 + 494 + input_sync(dev); 436 495 } 437 496 438 497 static void alps_process_trackstick_packet_v3(struct psmouse *psmouse) ··· 539 532 f->ts_middle = !!(p[3] & 0x40); 540 533 } 541 534 542 - static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p, 535 + static int alps_decode_pinnacle(struct alps_fields *f, unsigned char *p, 543 536 struct psmouse *psmouse) 544 537 { 545 538 f->first_mp = !!(p[4] & 0x40); ··· 553 546 ((p[2] & 0x7f) << 1) | 554 547 (p[4] & 0x01); 555 548 556 - f->x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) | 549 + f->st.x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) | 557 550 ((p[0] & 0x30) >> 4); 558 - f->y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f); 559 - f->z = p[5] & 0x7f; 551 + f->st.y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f); 552 + f->pressure = p[5] & 0x7f; 560 553 561 554 alps_decode_buttons_v3(f, p); 555 + 556 + return 0; 562 557 } 563 558 564 - static void alps_decode_rushmore(struct alps_fields *f, unsigned char *p, 559 + static int alps_decode_rushmore(struct alps_fields *f, unsigned char *p, 565 560 struct psmouse *psmouse) 566 561 { 567 562 alps_decode_pinnacle(f, p, psmouse); 568 563 564 + /* Rushmore's packet decode has a bit difference with Pinnacle's */ 565 + f->is_mp = !!(p[5] & 0x40); 566 + f->fingers = max((p[5] & 0x3), ((p[5] >> 2) & 0x3)) + 1; 569 567 f->x_map |= (p[5] & 0x10) << 11; 570 568 f->y_map |= (p[5] & 0x20) << 6; 569 + 570 + return 0; 571 571 } 572 572 573 - static void alps_decode_dolphin(struct alps_fields *f, unsigned char *p, 573 + static int alps_decode_dolphin(struct alps_fields *f, unsigned char *p, 574 574 struct psmouse *psmouse) 575 575 { 576 576 u64 palm_data = 0; ··· 587 573 f->is_mp = !!(p[0] & 0x20); 588 574 589 575 if (!f->is_mp) { 590 - f->x = ((p[1] & 0x7f) | ((p[4] & 0x0f) << 7)); 591 - f->y = ((p[2] & 0x7f) | ((p[4] & 0xf0) << 3)); 592 - f->z = (p[0] & 4) ? 0 : p[5] & 0x7f; 576 + f->st.x = ((p[1] & 0x7f) | ((p[4] & 0x0f) << 7)); 577 + f->st.y = ((p[2] & 0x7f) | ((p[4] & 0xf0) << 3)); 578 + f->pressure = (p[0] & 4) ? 0 : p[5] & 0x7f; 593 579 alps_decode_buttons_v3(f, p); 594 580 } else { 595 581 f->fingers = ((p[0] & 0x6) >> 1 | ··· 610 596 f->x_map = (palm_data >> priv->y_bits) & 611 597 (BIT(priv->x_bits) - 1); 612 598 } 599 + 600 + return 0; 613 601 } 614 602 615 603 static void alps_process_touchpad_packet_v3_v5(struct psmouse *psmouse) 616 604 { 617 605 struct alps_data *priv = psmouse->private; 618 606 unsigned char *packet = psmouse->packet; 619 - struct input_dev *dev = psmouse->dev; 620 607 struct input_dev *dev2 = priv->dev2; 621 - int x1 = 0, y1 = 0, x2 = 0, y2 = 0; 622 - int fingers = 0, bmap_fn; 623 - struct alps_fields f = {0}; 608 + struct alps_fields *f = &priv->f; 609 + int fingers = 0; 624 610 625 - priv->decode_fields(&f, packet, psmouse); 611 + memset(f, 0, sizeof(*f)); 612 + 613 + priv->decode_fields(f, packet, psmouse); 626 614 627 615 /* 628 616 * There's no single feature of touchpad position and bitmap packets ··· 639 623 * packet. Check for this, and when it happens process the 640 624 * position packet as usual. 641 625 */ 642 - if (f.is_mp) { 643 - fingers = f.fingers; 626 + if (f->is_mp) { 627 + fingers = f->fingers; 644 628 if (priv->proto_version == ALPS_PROTO_V3) { 645 - bmap_fn = alps_process_bitmap(priv, f.x_map, 646 - f.y_map, &x1, &y1, 647 - &x2, &y2); 648 - 649 - /* 650 - * We shouldn't report more than one finger if 651 - * we don't have two coordinates. 652 - */ 653 - if (fingers > 1 && bmap_fn < 2) 654 - fingers = bmap_fn; 629 + if (alps_process_bitmap(priv, f) == 0) 630 + fingers = 0; /* Use st data */ 655 631 656 632 /* Now process position packet */ 657 - priv->decode_fields(&f, priv->multi_data, 633 + priv->decode_fields(f, priv->multi_data, 658 634 psmouse); 659 635 } else { 660 636 /* ··· 655 647 * calculate Pt2, so we need to do position 656 648 * packet decode first. 657 649 */ 658 - priv->decode_fields(&f, priv->multi_data, 650 + priv->decode_fields(f, priv->multi_data, 659 651 psmouse); 660 652 661 653 /* 662 654 * Since Dolphin's finger number is reliable, 663 655 * there is no need to compare with bmap_fn. 664 656 */ 665 - alps_process_bitmap_dolphin(priv, &f, &x1, &y1, 666 - &x2, &y2); 657 + alps_process_bitmap_dolphin(priv, f); 667 658 } 668 659 } else { 669 660 priv->multi_packet = 0; ··· 677 670 * out misidentified bitmap packets, we reject anything with this 678 671 * bit set. 679 672 */ 680 - if (f.is_mp) 673 + if (f->is_mp) 681 674 return; 682 675 683 - if (!priv->multi_packet && f.first_mp) { 676 + if (!priv->multi_packet && f->first_mp) { 684 677 priv->multi_packet = 1; 685 678 memcpy(priv->multi_data, packet, sizeof(priv->multi_data)); 686 679 return; ··· 694 687 * with x, y, and z all zero, so these seem to be flukes. 695 688 * Ignore them. 696 689 */ 697 - if (f.x && f.y && !f.z) 690 + if (f->st.x && f->st.y && !f->pressure) 698 691 return; 699 692 700 - /* 701 - * If we don't have MT data or the bitmaps were empty, we have 702 - * to rely on ST data. 703 - */ 704 - if (!fingers) { 705 - x1 = f.x; 706 - y1 = f.y; 707 - fingers = f.z > 0 ? 1 : 0; 708 - } 709 - 710 - if (f.z >= 64) 711 - input_report_key(dev, BTN_TOUCH, 1); 712 - else 713 - input_report_key(dev, BTN_TOUCH, 0); 714 - 715 - alps_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); 716 - 717 - input_mt_report_finger_count(dev, fingers); 718 - 719 - input_report_key(dev, BTN_LEFT, f.left); 720 - input_report_key(dev, BTN_RIGHT, f.right); 721 - input_report_key(dev, BTN_MIDDLE, f.middle); 722 - 723 - if (f.z > 0) { 724 - input_report_abs(dev, ABS_X, f.x); 725 - input_report_abs(dev, ABS_Y, f.y); 726 - } 727 - input_report_abs(dev, ABS_PRESSURE, f.z); 728 - 729 - input_sync(dev); 693 + alps_report_semi_mt_data(psmouse, fingers); 730 694 731 695 if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) { 732 - input_report_key(dev2, BTN_LEFT, f.ts_left); 733 - input_report_key(dev2, BTN_RIGHT, f.ts_right); 734 - input_report_key(dev2, BTN_MIDDLE, f.ts_middle); 696 + input_report_key(dev2, BTN_LEFT, f->ts_left); 697 + input_report_key(dev2, BTN_RIGHT, f->ts_right); 698 + input_report_key(dev2, BTN_MIDDLE, f->ts_middle); 735 699 input_sync(dev2); 736 700 } 737 701 } ··· 801 823 { 802 824 struct alps_data *priv = psmouse->private; 803 825 unsigned char *packet = psmouse->packet; 804 - struct input_dev *dev = psmouse->dev; 826 + struct alps_fields *f = &priv->f; 805 827 int offset; 806 - int x, y, z; 807 - int left, right; 808 - int x1, y1, x2, y2; 809 - int fingers = 0; 810 - unsigned int x_bitmap, y_bitmap; 811 828 812 829 /* 813 830 * v4 has a 6-byte encoding for bitmap data, but this data is ··· 824 851 if (++priv->multi_packet > 2) { 825 852 priv->multi_packet = 0; 826 853 827 - x_bitmap = ((priv->multi_data[2] & 0x1f) << 10) | 854 + f->x_map = ((priv->multi_data[2] & 0x1f) << 10) | 828 855 ((priv->multi_data[3] & 0x60) << 3) | 829 856 ((priv->multi_data[0] & 0x3f) << 2) | 830 857 ((priv->multi_data[1] & 0x60) >> 5); 831 - y_bitmap = ((priv->multi_data[5] & 0x01) << 10) | 858 + f->y_map = ((priv->multi_data[5] & 0x01) << 10) | 832 859 ((priv->multi_data[3] & 0x1f) << 5) | 833 860 (priv->multi_data[1] & 0x1f); 834 861 835 - fingers = alps_process_bitmap(priv, x_bitmap, y_bitmap, 836 - &x1, &y1, &x2, &y2); 837 - 838 - /* Store MT data.*/ 839 - priv->fingers = fingers; 840 - priv->x1 = x1; 841 - priv->x2 = x2; 842 - priv->y1 = y1; 843 - priv->y2 = y2; 862 + f->fingers = alps_process_bitmap(priv, f); 844 863 } 845 864 846 - left = packet[4] & 0x01; 847 - right = packet[4] & 0x02; 865 + f->left = packet[4] & 0x01; 866 + f->right = packet[4] & 0x02; 848 867 849 - x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) | 850 - ((packet[0] & 0x30) >> 4); 851 - y = ((packet[2] & 0x7f) << 4) | (packet[3] & 0x0f); 852 - z = packet[5] & 0x7f; 868 + f->st.x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) | 869 + ((packet[0] & 0x30) >> 4); 870 + f->st.y = ((packet[2] & 0x7f) << 4) | (packet[3] & 0x0f); 871 + f->pressure = packet[5] & 0x7f; 872 + 873 + alps_report_semi_mt_data(psmouse, f->fingers); 874 + } 875 + 876 + static bool alps_is_valid_package_v7(struct psmouse *psmouse) 877 + { 878 + switch (psmouse->pktcnt) { 879 + case 3: 880 + return (psmouse->packet[2] & 0x40) == 0x40; 881 + case 4: 882 + return (psmouse->packet[3] & 0x48) == 0x48; 883 + case 6: 884 + return (psmouse->packet[5] & 0x40) == 0x00; 885 + } 886 + return true; 887 + } 888 + 889 + static unsigned char alps_get_packet_id_v7(char *byte) 890 + { 891 + unsigned char packet_id; 892 + 893 + if (byte[4] & 0x40) 894 + packet_id = V7_PACKET_ID_TWO; 895 + else if (byte[4] & 0x01) 896 + packet_id = V7_PACKET_ID_MULTI; 897 + else if ((byte[0] & 0x10) && !(byte[4] & 0x43)) 898 + packet_id = V7_PACKET_ID_NEW; 899 + else if (byte[1] == 0x00 && byte[4] == 0x00) 900 + packet_id = V7_PACKET_ID_IDLE; 901 + else 902 + packet_id = V7_PACKET_ID_UNKNOWN; 903 + 904 + return packet_id; 905 + } 906 + 907 + static void alps_get_finger_coordinate_v7(struct input_mt_pos *mt, 908 + unsigned char *pkt, 909 + unsigned char pkt_id) 910 + { 911 + mt[0].x = ((pkt[2] & 0x80) << 4); 912 + mt[0].x |= ((pkt[2] & 0x3F) << 5); 913 + mt[0].x |= ((pkt[3] & 0x30) >> 1); 914 + mt[0].x |= (pkt[3] & 0x07); 915 + mt[0].y = (pkt[1] << 3) | (pkt[0] & 0x07); 916 + 917 + mt[1].x = ((pkt[3] & 0x80) << 4); 918 + mt[1].x |= ((pkt[4] & 0x80) << 3); 919 + mt[1].x |= ((pkt[4] & 0x3F) << 4); 920 + mt[1].y = ((pkt[5] & 0x80) << 3); 921 + mt[1].y |= ((pkt[5] & 0x3F) << 4); 922 + 923 + switch (pkt_id) { 924 + case V7_PACKET_ID_TWO: 925 + mt[1].x &= ~0x000F; 926 + mt[1].y |= 0x000F; 927 + break; 928 + 929 + case V7_PACKET_ID_MULTI: 930 + mt[1].x &= ~0x003F; 931 + mt[1].y &= ~0x0020; 932 + mt[1].y |= ((pkt[4] & 0x02) << 4); 933 + mt[1].y |= 0x001F; 934 + break; 935 + 936 + case V7_PACKET_ID_NEW: 937 + mt[1].x &= ~0x003F; 938 + mt[1].x |= (pkt[0] & 0x20); 939 + mt[1].y |= 0x000F; 940 + break; 941 + } 942 + 943 + mt[0].y = 0x7FF - mt[0].y; 944 + mt[1].y = 0x7FF - mt[1].y; 945 + } 946 + 947 + static int alps_get_mt_count(struct input_mt_pos *mt) 948 + { 949 + int i; 950 + 951 + for (i = 0; i < MAX_TOUCHES && mt[i].x != 0 && mt[i].y != 0; i++) 952 + /* empty */; 953 + 954 + return i; 955 + } 956 + 957 + static int alps_decode_packet_v7(struct alps_fields *f, 958 + unsigned char *p, 959 + struct psmouse *psmouse) 960 + { 961 + unsigned char pkt_id; 962 + 963 + pkt_id = alps_get_packet_id_v7(p); 964 + if (pkt_id == V7_PACKET_ID_IDLE) 965 + return 0; 966 + if (pkt_id == V7_PACKET_ID_UNKNOWN) 967 + return -1; 968 + 969 + alps_get_finger_coordinate_v7(f->mt, p, pkt_id); 970 + 971 + if (pkt_id == V7_PACKET_ID_TWO || pkt_id == V7_PACKET_ID_MULTI) { 972 + f->left = (p[0] & 0x80) >> 7; 973 + f->right = (p[0] & 0x20) >> 5; 974 + f->middle = (p[0] & 0x10) >> 4; 975 + } 976 + 977 + if (pkt_id == V7_PACKET_ID_TWO) 978 + f->fingers = alps_get_mt_count(f->mt); 979 + else if (pkt_id == V7_PACKET_ID_MULTI) 980 + f->fingers = 3 + (p[5] & 0x03); 981 + 982 + return 0; 983 + } 984 + 985 + static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) 986 + { 987 + struct alps_data *priv = psmouse->private; 988 + unsigned char *packet = psmouse->packet; 989 + struct input_dev *dev2 = priv->dev2; 990 + int x, y, z, left, right, middle; 853 991 854 992 /* 855 - * If there were no contacts in the bitmap, use ST 856 - * points in MT reports. 857 - * If there were two contacts or more, report MT data. 993 + * b7 b6 b5 b4 b3 b2 b1 b0 994 + * Byte0 0 1 0 0 1 0 0 0 995 + * Byte1 1 1 * * 1 M R L 996 + * Byte2 X7 1 X5 X4 X3 X2 X1 X0 997 + * Byte3 Z6 1 Y6 X6 1 Y2 Y1 Y0 998 + * Byte4 Y7 0 Y5 Y4 Y3 1 1 0 999 + * Byte5 T&P 0 Z5 Z4 Z3 Z2 Z1 Z0 1000 + * M / R / L: Middle / Right / Left button 858 1001 */ 859 - if (priv->fingers < 2) { 860 - x1 = x; 861 - y1 = y; 862 - fingers = z > 0 ? 1 : 0; 863 - } else { 864 - fingers = priv->fingers; 865 - x1 = priv->x1; 866 - x2 = priv->x2; 867 - y1 = priv->y1; 868 - y2 = priv->y2; 869 - } 870 1002 871 - if (z >= 64) 872 - input_report_key(dev, BTN_TOUCH, 1); 873 - else 874 - input_report_key(dev, BTN_TOUCH, 0); 1003 + x = ((packet[2] & 0xbf)) | ((packet[3] & 0x10) << 2); 1004 + y = (packet[3] & 0x07) | (packet[4] & 0xb8) | 1005 + ((packet[3] & 0x20) << 1); 1006 + z = (packet[5] & 0x3f) | ((packet[3] & 0x80) >> 1); 875 1007 876 - alps_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); 1008 + left = (packet[1] & 0x01); 1009 + right = (packet[1] & 0x02) >> 1; 1010 + middle = (packet[1] & 0x04) >> 2; 877 1011 878 - input_mt_report_finger_count(dev, fingers); 1012 + /* Divide 2 since trackpoint's speed is too fast */ 1013 + input_report_rel(dev2, REL_X, (char)x / 2); 1014 + input_report_rel(dev2, REL_Y, -((char)y / 2)); 879 1015 880 - input_report_key(dev, BTN_LEFT, left); 881 - input_report_key(dev, BTN_RIGHT, right); 1016 + input_report_key(dev2, BTN_LEFT, left); 1017 + input_report_key(dev2, BTN_RIGHT, right); 1018 + input_report_key(dev2, BTN_MIDDLE, middle); 882 1019 883 - if (z > 0) { 884 - input_report_abs(dev, ABS_X, x); 885 - input_report_abs(dev, ABS_Y, y); 886 - } 887 - input_report_abs(dev, ABS_PRESSURE, z); 1020 + input_sync(dev2); 1021 + } 1022 + 1023 + static void alps_process_touchpad_packet_v7(struct psmouse *psmouse) 1024 + { 1025 + struct alps_data *priv = psmouse->private; 1026 + struct input_dev *dev = psmouse->dev; 1027 + struct alps_fields *f = &priv->f; 1028 + 1029 + memset(f, 0, sizeof(*f)); 1030 + 1031 + if (priv->decode_fields(f, psmouse->packet, psmouse)) 1032 + return; 1033 + 1034 + alps_report_mt_data(psmouse, alps_get_mt_count(f->mt)); 1035 + 1036 + input_mt_report_finger_count(dev, f->fingers); 1037 + 1038 + input_report_key(dev, BTN_LEFT, f->left); 1039 + input_report_key(dev, BTN_RIGHT, f->right); 1040 + input_report_key(dev, BTN_MIDDLE, f->middle); 888 1041 889 1042 input_sync(dev); 1043 + } 1044 + 1045 + static void alps_process_packet_v7(struct psmouse *psmouse) 1046 + { 1047 + unsigned char *packet = psmouse->packet; 1048 + 1049 + if (packet[0] == 0x48 && (packet[4] & 0x47) == 0x06) 1050 + alps_process_trackstick_packet_v7(psmouse); 1051 + else 1052 + alps_process_touchpad_packet_v7(psmouse); 890 1053 } 891 1054 892 1055 static void alps_report_bare_ps2_packet(struct psmouse *psmouse, ··· 1189 1080 return PSMOUSE_BAD_DATA; 1190 1081 } 1191 1082 1083 + if (priv->proto_version == ALPS_PROTO_V7 && 1084 + !alps_is_valid_package_v7(psmouse)) { 1085 + psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", 1086 + psmouse->pktcnt - 1, 1087 + psmouse->packet[psmouse->pktcnt - 1]); 1088 + return PSMOUSE_BAD_DATA; 1089 + } 1090 + 1192 1091 if (psmouse->pktcnt == psmouse->pktsize) { 1193 1092 priv->process_packet(psmouse); 1194 1093 return PSMOUSE_FULL_PACKET; ··· 1309 1192 return 0; 1310 1193 } 1311 1194 1195 + static bool alps_check_valid_firmware_id(unsigned char id[]) 1196 + { 1197 + if (id[0] == 0x73) 1198 + return true; 1199 + 1200 + if (id[0] == 0x88 && 1201 + (id[1] == 0x07 || 1202 + id[1] == 0x08 || 1203 + (id[1] & 0xf0) == 0xb0 || 1204 + (id[1] & 0xf0) == 0xc0)) { 1205 + return true; 1206 + } 1207 + 1208 + return false; 1209 + } 1210 + 1312 1211 static int alps_enter_command_mode(struct psmouse *psmouse) 1313 1212 { 1314 1213 unsigned char param[4]; ··· 1334 1201 return -1; 1335 1202 } 1336 1203 1337 - if ((param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) && 1338 - param[0] != 0x73) { 1204 + if (!alps_check_valid_firmware_id(param)) { 1339 1205 psmouse_dbg(psmouse, 1340 1206 "unknown response while entering command mode\n"); 1341 1207 return -1; ··· 1792 1660 return -1; 1793 1661 } 1794 1662 1663 + static int alps_get_v3_v7_resolution(struct psmouse *psmouse, int reg_pitch) 1664 + { 1665 + int reg, x_pitch, y_pitch, x_electrode, y_electrode, x_phys, y_phys; 1666 + struct alps_data *priv = psmouse->private; 1667 + 1668 + reg = alps_command_mode_read_reg(psmouse, reg_pitch); 1669 + if (reg < 0) 1670 + return reg; 1671 + 1672 + x_pitch = (char)(reg << 4) >> 4; /* sign extend lower 4 bits */ 1673 + x_pitch = 50 + 2 * x_pitch; /* In 0.1 mm units */ 1674 + 1675 + y_pitch = (char)reg >> 4; /* sign extend upper 4 bits */ 1676 + y_pitch = 36 + 2 * y_pitch; /* In 0.1 mm units */ 1677 + 1678 + reg = alps_command_mode_read_reg(psmouse, reg_pitch + 1); 1679 + if (reg < 0) 1680 + return reg; 1681 + 1682 + x_electrode = (char)(reg << 4) >> 4; /* sign extend lower 4 bits */ 1683 + x_electrode = 17 + x_electrode; 1684 + 1685 + y_electrode = (char)reg >> 4; /* sign extend upper 4 bits */ 1686 + y_electrode = 13 + y_electrode; 1687 + 1688 + x_phys = x_pitch * (x_electrode - 1); /* In 0.1 mm units */ 1689 + y_phys = y_pitch * (y_electrode - 1); /* In 0.1 mm units */ 1690 + 1691 + priv->x_res = priv->x_max * 10 / x_phys; /* units / mm */ 1692 + priv->y_res = priv->y_max * 10 / y_phys; /* units / mm */ 1693 + 1694 + psmouse_dbg(psmouse, 1695 + "pitch %dx%d num-electrodes %dx%d physical size %dx%d mm res %dx%d\n", 1696 + x_pitch, y_pitch, x_electrode, y_electrode, 1697 + x_phys / 10, y_phys / 10, priv->x_res, priv->y_res); 1698 + 1699 + return 0; 1700 + } 1701 + 1795 1702 static int alps_hw_init_rushmore_v3(struct psmouse *psmouse) 1796 1703 { 1797 1704 struct alps_data *priv = psmouse->private; ··· 1849 1678 if (alps_enter_command_mode(psmouse) || 1850 1679 alps_command_mode_read_reg(psmouse, 0xc2d9) == -1 || 1851 1680 alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00)) 1681 + goto error; 1682 + 1683 + if (alps_get_v3_v7_resolution(psmouse, 0xc2da)) 1852 1684 goto error; 1853 1685 1854 1686 reg_val = alps_command_mode_read_reg(psmouse, 0xc2c6); ··· 2030 1856 return 0; 2031 1857 } 2032 1858 1859 + static int alps_hw_init_v7(struct psmouse *psmouse) 1860 + { 1861 + struct ps2dev *ps2dev = &psmouse->ps2dev; 1862 + int reg_val, ret = -1; 1863 + 1864 + if (alps_enter_command_mode(psmouse) || 1865 + alps_command_mode_read_reg(psmouse, 0xc2d9) == -1) 1866 + goto error; 1867 + 1868 + if (alps_get_v3_v7_resolution(psmouse, 0xc397)) 1869 + goto error; 1870 + 1871 + if (alps_command_mode_write_reg(psmouse, 0xc2c9, 0x64)) 1872 + goto error; 1873 + 1874 + reg_val = alps_command_mode_read_reg(psmouse, 0xc2c4); 1875 + if (reg_val == -1) 1876 + goto error; 1877 + if (__alps_command_mode_write_reg(psmouse, reg_val | 0x02)) 1878 + goto error; 1879 + 1880 + alps_exit_command_mode(psmouse); 1881 + return ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE); 1882 + 1883 + error: 1884 + alps_exit_command_mode(psmouse); 1885 + return ret; 1886 + } 1887 + 2033 1888 static void alps_set_defaults(struct alps_data *priv) 2034 1889 { 2035 1890 priv->byte0 = 0x8f; ··· 2116 1913 priv->nibble_commands = alps_v6_nibble_commands; 2117 1914 priv->x_max = 2047; 2118 1915 priv->y_max = 1535; 1916 + break; 1917 + case ALPS_PROTO_V7: 1918 + priv->hw_init = alps_hw_init_v7; 1919 + priv->process_packet = alps_process_packet_v7; 1920 + priv->decode_fields = alps_decode_packet_v7; 1921 + priv->set_abs_params = alps_set_abs_params_mt; 1922 + priv->nibble_commands = alps_v3_nibble_commands; 1923 + priv->addr_command = PSMOUSE_CMD_RESET_WRAP; 1924 + priv->x_max = 0xfff; 1925 + priv->y_max = 0x7ff; 1926 + priv->byte0 = 0x48; 1927 + priv->mask0 = 0x48; 1928 + 1929 + if (priv->fw_ver[1] != 0xba) 1930 + priv->flags |= ALPS_BUTTONPAD; 2119 1931 break; 2120 1932 } 2121 1933 } ··· 2190 1972 alps_exit_command_mode(psmouse)) 2191 1973 return -EIO; 2192 1974 1975 + /* Save the Firmware version */ 1976 + memcpy(priv->fw_ver, ec, 3); 1977 + 2193 1978 if (alps_match_table(psmouse, priv, e7, ec) == 0) { 2194 1979 return 0; 2195 1980 } else if (e7[0] == 0x73 && e7[1] == 0x03 && e7[2] == 0x50 && ··· 2203 1982 return -EIO; 2204 1983 else 2205 1984 return 0; 1985 + } else if (ec[0] == 0x88 && 1986 + ((ec[1] & 0xf0) == 0xb0 || (ec[1] & 0xf0) == 0xc0)) { 1987 + priv->proto_version = ALPS_PROTO_V7; 1988 + alps_set_defaults(priv); 1989 + 1990 + return 0; 2206 1991 } else if (ec[0] == 0x88 && ec[1] == 0x08) { 2207 1992 priv->proto_version = ALPS_PROTO_V3; 2208 1993 alps_set_defaults(priv); ··· 2217 1990 priv->decode_fields = alps_decode_rushmore; 2218 1991 priv->x_bits = 16; 2219 1992 priv->y_bits = 12; 1993 + priv->flags |= ALPS_IS_RUSHMORE; 2220 1994 2221 1995 /* hack to make addr_command, nibble_command available */ 2222 1996 psmouse->private = priv; ··· 2272 2044 static void alps_set_abs_params_mt(struct alps_data *priv, 2273 2045 struct input_dev *dev1) 2274 2046 { 2275 - set_bit(INPUT_PROP_SEMI_MT, dev1->propbit); 2276 - input_mt_init_slots(dev1, 2, 0); 2277 2047 input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0); 2278 2048 input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0); 2279 2049 2280 - set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); 2050 + input_abs_set_res(dev1, ABS_MT_POSITION_X, priv->x_res); 2051 + input_abs_set_res(dev1, ABS_MT_POSITION_Y, priv->y_res); 2052 + 2053 + input_mt_init_slots(dev1, MAX_TOUCHES, INPUT_MT_POINTER | 2054 + INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK | INPUT_MT_SEMI_MT); 2055 + 2281 2056 set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); 2282 2057 set_bit(BTN_TOOL_QUADTAP, dev1->keybit); 2283 2058 2284 - input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0); 2285 - input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0); 2059 + /* V7 is real multi-touch */ 2060 + if (priv->proto_version == ALPS_PROTO_V7) 2061 + clear_bit(INPUT_PROP_SEMI_MT, dev1->propbit); 2286 2062 } 2287 2063 2288 2064 int alps_init(struct psmouse *psmouse) ··· 2332 2100 dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS); 2333 2101 2334 2102 priv->set_abs_params(priv, dev1); 2335 - input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); 2103 + /* No pressure on V7 */ 2104 + if (priv->proto_version != ALPS_PROTO_V7) 2105 + input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); 2336 2106 2337 2107 if (priv->flags & ALPS_WHEEL) { 2338 2108 dev1->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL); ··· 2351 2117 dev1->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1); 2352 2118 dev1->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2); 2353 2119 dev1->keybit[BIT_WORD(BTN_3)] |= BIT_MASK(BTN_3); 2120 + } else if (priv->flags & ALPS_BUTTONPAD) { 2121 + set_bit(INPUT_PROP_BUTTONPAD, dev1->propbit); 2122 + clear_bit(BTN_RIGHT, dev1->keybit); 2354 2123 } else { 2355 2124 dev1->keybit[BIT_WORD(BTN_MIDDLE)] |= BIT_MASK(BTN_MIDDLE); 2356 2125 }
+44 -16
drivers/input/mouse/alps.h
··· 12 12 #ifndef _ALPS_H 13 13 #define _ALPS_H 14 14 15 + #include <linux/input/mt.h> 16 + 15 17 #define ALPS_PROTO_V1 1 16 18 #define ALPS_PROTO_V2 2 17 19 #define ALPS_PROTO_V3 3 18 20 #define ALPS_PROTO_V4 4 19 21 #define ALPS_PROTO_V5 5 20 22 #define ALPS_PROTO_V6 6 23 + #define ALPS_PROTO_V7 7 /* t3btl t4s */ 24 + 25 + #define MAX_TOUCHES 2 21 26 22 27 #define DOLPHIN_COUNT_PER_ELECTRODE 64 23 28 #define DOLPHIN_PROFILE_XOFFSET 8 /* x-electrode offset */ 24 29 #define DOLPHIN_PROFILE_YOFFSET 1 /* y-electrode offset */ 30 + 31 + /* 32 + * enum V7_PACKET_ID - defines the packet type for V7 33 + * V7_PACKET_ID_IDLE: There's no finger and no button activity. 34 + * V7_PACKET_ID_TWO: There's one or two non-resting fingers on touchpad 35 + * or there's button activities. 36 + * V7_PACKET_ID_MULTI: There are at least three non-resting fingers. 37 + * V7_PACKET_ID_NEW: The finger position in slot is not continues from 38 + * previous packet. 39 + */ 40 + enum V7_PACKET_ID { 41 + V7_PACKET_ID_IDLE, 42 + V7_PACKET_ID_TWO, 43 + V7_PACKET_ID_MULTI, 44 + V7_PACKET_ID_NEW, 45 + V7_PACKET_ID_UNKNOWN, 46 + }; 25 47 26 48 /** 27 49 * struct alps_model_info - touchpad ID table ··· 68 46 unsigned char command_mode_resp; 69 47 unsigned char proto_version; 70 48 unsigned char byte0, mask0; 71 - unsigned char flags; 49 + int flags; 72 50 }; 73 51 74 52 /** ··· 87 65 unsigned char data; 88 66 }; 89 67 68 + struct alps_bitmap_point { 69 + int start_bit; 70 + int num_bits; 71 + }; 72 + 90 73 /** 91 74 * struct alps_fields - decoded version of the report packet 92 75 * @x_map: Bitmap of active X positions for MT. 93 76 * @y_map: Bitmap of active Y positions for MT. 94 77 * @fingers: Number of fingers for MT. 95 - * @x: X position for ST. 96 - * @y: Y position for ST. 97 - * @z: Z position for ST. 78 + * @pressure: Pressure. 79 + * @st: position for ST. 80 + * @mt: position for MT. 98 81 * @first_mp: Packet is the first of a multi-packet report. 99 82 * @is_mp: Packet is part of a multi-packet report. 100 83 * @left: Left touchpad button is active. ··· 113 86 unsigned int x_map; 114 87 unsigned int y_map; 115 88 unsigned int fingers; 116 - unsigned int x; 117 - unsigned int y; 118 - unsigned int z; 89 + 90 + int pressure; 91 + struct input_mt_pos st; 92 + struct input_mt_pos mt[MAX_TOUCHES]; 93 + 119 94 unsigned int first_mp:1; 120 95 unsigned int is_mp:1; 121 96 ··· 142 113 * known format for this model. The first byte of the report, ANDed with 143 114 * mask0, should match byte0. 144 115 * @mask0: The mask used to check the first byte of the report. 116 + * @fw_ver: cached copy of firmware version (EC report) 145 117 * @flags: Additional device capabilities (passthrough port, trackstick, etc.). 146 118 * @x_max: Largest possible X position value. 147 119 * @y_max: Largest possible Y position value. ··· 155 125 * @prev_fin: Finger bit from previous packet. 156 126 * @multi_packet: Multi-packet data in progress. 157 127 * @multi_data: Saved multi-packet data. 158 - * @x1: First X coordinate from last MT report. 159 - * @x2: Second X coordinate from last MT report. 160 - * @y1: First Y coordinate from last MT report. 161 - * @y2: Second Y coordinate from last MT report. 162 - * @fingers: Number of fingers from last MT report. 128 + * @f: Decoded packet data fields. 163 129 * @quirks: Bitmap of ALPS_QUIRK_*. 164 130 * @timer: Timer for flushing out the final report packet in the stream. 165 131 */ ··· 168 142 int addr_command; 169 143 unsigned char proto_version; 170 144 unsigned char byte0, mask0; 171 - unsigned char flags; 145 + unsigned char fw_ver[3]; 146 + int flags; 172 147 int x_max; 173 148 int y_max; 174 149 int x_bits; 175 150 int y_bits; 151 + unsigned int x_res; 152 + unsigned int y_res; 176 153 177 154 int (*hw_init)(struct psmouse *psmouse); 178 155 void (*process_packet)(struct psmouse *psmouse); 179 - void (*decode_fields)(struct alps_fields *f, unsigned char *p, 156 + int (*decode_fields)(struct alps_fields *f, unsigned char *p, 180 157 struct psmouse *psmouse); 181 158 void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1); 182 159 183 160 int prev_fin; 184 161 int multi_packet; 185 162 unsigned char multi_data[6]; 186 - int x1, x2, y1, y2; 187 - int fingers; 163 + struct alps_fields f; 188 164 u8 quirks; 189 165 struct timer_list timer; 190 166 };
+13
drivers/input/serio/hyperv-keyboard.c
··· 170 170 serio_interrupt(kbd_dev->hv_serio, scan_code, 0); 171 171 } 172 172 spin_unlock_irqrestore(&kbd_dev->lock, flags); 173 + 174 + /* 175 + * Only trigger a wakeup on key down, otherwise 176 + * "echo freeze > /sys/power/state" can't really enter the 177 + * state because the Enter-UP can trigger a wakeup at once. 178 + */ 179 + if (!(info & IS_BREAK)) 180 + pm_wakeup_event(&hv_dev->device, 0); 181 + 173 182 break; 174 183 175 184 default: ··· 385 376 goto err_close_vmbus; 386 377 387 378 serio_register_port(kbd_dev->hv_serio); 379 + 380 + device_init_wakeup(&hv_dev->device, true); 381 + 388 382 return 0; 389 383 390 384 err_close_vmbus: ··· 402 390 { 403 391 struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev); 404 392 393 + device_init_wakeup(&hv_dev->device, false); 405 394 serio_unregister_port(kbd_dev->hv_serio); 406 395 vmbus_close(hv_dev->channel); 407 396 kfree(kbd_dev);
+6 -12
drivers/input/tablet/Kconfig
··· 73 73 To compile this driver as a module, choose M here: the 74 74 module will be called kbtab. 75 75 76 - config TABLET_USB_WACOM 77 - tristate "Wacom Intuos/Graphire tablet support (USB)" 78 - depends on USB_ARCH_HAS_HCD 79 - select POWER_SUPPLY 80 - select USB 81 - select NEW_LEDS 82 - select LEDS_CLASS 76 + config TABLET_SERIAL_WACOM4 77 + tristate "Wacom protocol 4 serial tablet support" 78 + select SERIO 83 79 help 84 - Say Y here if you want to use the USB version of the Wacom Intuos 85 - or Graphire tablet. Make sure to say Y to "Mouse support" 86 - (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support" 87 - (CONFIG_INPUT_EVDEV) as well. 80 + Say Y here if you want to use Wacom protocol 4 serial tablets. 81 + E.g. serial versions of the Cintiq, Graphire or Penpartner. 88 82 89 83 To compile this driver as a module, choose M here: the 90 - module will be called wacom. 84 + module will be called wacom_serial4. 91 85 92 86 endif
+1 -3
drivers/input/tablet/Makefile
··· 2 2 # Makefile for the tablet drivers 3 3 # 4 4 5 - # Multipart objects. 6 - wacom-objs := wacom_wac.o wacom_sys.o 7 5 8 6 obj-$(CONFIG_TABLET_USB_ACECAD) += acecad.o 9 7 obj-$(CONFIG_TABLET_USB_AIPTEK) += aiptek.o 10 8 obj-$(CONFIG_TABLET_USB_GTCO) += gtco.o 11 9 obj-$(CONFIG_TABLET_USB_HANWANG) += hanwang.o 12 10 obj-$(CONFIG_TABLET_USB_KBTAB) += kbtab.o 13 - obj-$(CONFIG_TABLET_USB_WACOM) += wacom.o 11 + obj-$(CONFIG_TABLET_SERIAL_WACOM4) += wacom_serial4.o
+17 -10
drivers/input/tablet/wacom.h drivers/hid/wacom.h
··· 12 12 * Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com> 13 13 * Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be> 14 14 * Copyright (c) 2002-2011 Ping Cheng <pingc@wacom.com> 15 + * Copyright (c) 2014 Benjamin Tissoires <benjamin.tissoires@redhat.com> 15 16 * 16 17 * ChangeLog: 17 18 * v0.1 (vp) - Initial release ··· 73 72 * v1.52 (pc) - Query Wacom data upon system resume 74 73 * - add defines for features->type 75 74 * - add new devices (0x9F, 0xE2, and 0XE3) 75 + * v2.00 (bt) - conversion to a HID driver 76 + * - integration of the Bluetooth devices 76 77 */ 77 78 78 79 /* ··· 96 93 /* 97 94 * Version Information 98 95 */ 99 - #define DRIVER_VERSION "v1.53" 96 + #define DRIVER_VERSION "v2.00" 100 97 #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" 101 98 #define DRIVER_DESC "USB Wacom tablet driver" 102 99 #define DRIVER_LICENSE "GPL" 103 - 104 - MODULE_AUTHOR(DRIVER_AUTHOR); 105 - MODULE_DESCRIPTION(DRIVER_DESC); 106 - MODULE_LICENSE(DRIVER_LICENSE); 107 100 108 101 #define USB_VENDOR_ID_WACOM 0x056a 109 102 #define USB_VENDOR_ID_LENOVO 0x17ef 110 103 111 104 struct wacom { 112 - dma_addr_t data_dma; 113 105 struct usb_device *usbdev; 114 106 struct usb_interface *intf; 115 - struct urb *irq; 116 107 struct wacom_wac wacom_wac; 108 + struct hid_device *hdev; 117 109 struct mutex lock; 118 110 struct work_struct work; 119 - bool open; 120 - char phys[32]; 121 111 struct wacom_led { 122 112 u8 select[2]; /* status led selector (0..3) */ 123 113 u8 llv; /* status led brightness no button (1..127) */ 124 114 u8 hlv; /* status led brightness button pressed (1..127) */ 125 115 u8 img_lum; /* OLED matrix display brightness */ 126 116 } led; 117 + bool led_initialized; 127 118 struct power_supply battery; 119 + struct power_supply ac; 128 120 }; 129 121 130 122 static inline void wacom_schedule_work(struct wacom_wac *wacom_wac) ··· 128 130 schedule_work(&wacom->work); 129 131 } 130 132 131 - extern const struct usb_device_id wacom_ids[]; 133 + static inline void wacom_notify_battery(struct wacom_wac *wacom_wac) 134 + { 135 + struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); 136 + 137 + power_supply_changed(&wacom->battery); 138 + } 139 + 140 + extern const struct hid_device_id wacom_ids[]; 132 141 133 142 void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); 134 143 void wacom_setup_device_quirks(struct wacom_features *features); 135 144 int wacom_setup_input_capabilities(struct input_dev *input_dev, 136 145 struct wacom_wac *wacom_wac); 146 + int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, 147 + struct wacom_wac *wacom_wac); 137 148 #endif
+620
drivers/input/tablet/wacom_serial4.c
··· 1 + /* 2 + * Wacom protocol 4 serial tablet driver 3 + * 4 + * Copyright 2014 Hans de Goede <hdegoede@redhat.com> 5 + * Copyright 2011-2012 Julian Squires <julian@cipht.net> 6 + * 7 + * This program is free software; you can redistribute it and/or modify it 8 + * under the terms of the GNU General Public License as published by the 9 + * Free Software Foundation; either version of 2 of the License, or (at your 10 + * option) any later version. See the file COPYING in the main directory of 11 + * this archive for more details. 12 + * 13 + * Many thanks to Bill Seremetis, without whom PenPartner support 14 + * would not have been possible. Thanks to Patrick Mahoney. 15 + * 16 + * This driver was developed with reference to much code written by others, 17 + * particularly: 18 + * - elo, gunze drivers by Vojtech Pavlik <vojtech@ucw.cz>; 19 + * - wacom_w8001 driver by Jaya Kumar <jayakumar.lkml@gmail.com>; 20 + * - the USB wacom input driver, credited to many people 21 + * (see drivers/input/tablet/wacom.h); 22 + * - new and old versions of linuxwacom / xf86-input-wacom credited to 23 + * Frederic Lepied, France. <Lepied@XFree86.org> and 24 + * Ping Cheng, Wacom. <pingc@wacom.com>; 25 + * - and xf86wacom.c (a presumably ancient version of the linuxwacom code), 26 + * by Frederic Lepied and Raph Levien <raph@gtk.org>. 27 + * 28 + * To do: 29 + * - support pad buttons; (requires access to a model with pad buttons) 30 + * - support (protocol 4-style) tilt (requires access to a > 1.4 rom model) 31 + */ 32 + 33 + /* 34 + * Wacom serial protocol 4 documentation taken from linuxwacom-0.9.9 code, 35 + * protocol 4 uses 7 or 9 byte of data in the following format: 36 + * 37 + * Byte 1 38 + * bit 7 Sync bit always 1 39 + * bit 6 Pointing device detected 40 + * bit 5 Cursor = 0 / Stylus = 1 41 + * bit 4 Reserved 42 + * bit 3 1 if a button on the pointing device has been pressed 43 + * bit 2 P0 (optional) 44 + * bit 1 X15 45 + * bit 0 X14 46 + * 47 + * Byte 2 48 + * bit 7 Always 0 49 + * bits 6-0 = X13 - X7 50 + * 51 + * Byte 3 52 + * bit 7 Always 0 53 + * bits 6-0 = X6 - X0 54 + * 55 + * Byte 4 56 + * bit 7 Always 0 57 + * bit 6 B3 58 + * bit 5 B2 59 + * bit 4 B1 60 + * bit 3 B0 61 + * bit 2 P1 (optional) 62 + * bit 1 Y15 63 + * bit 0 Y14 64 + * 65 + * Byte 5 66 + * bit 7 Always 0 67 + * bits 6-0 = Y13 - Y7 68 + * 69 + * Byte 6 70 + * bit 7 Always 0 71 + * bits 6-0 = Y6 - Y0 72 + * 73 + * Byte 7 74 + * bit 7 Always 0 75 + * bit 6 Sign of pressure data; or wheel-rel for cursor tool 76 + * bit 5 P7; or REL1 for cursor tool 77 + * bit 4 P6; or REL0 for cursor tool 78 + * bit 3 P5 79 + * bit 2 P4 80 + * bit 1 P3 81 + * bit 0 P2 82 + * 83 + * byte 8 and 9 are optional and present only 84 + * in tilt mode. 85 + * 86 + * Byte 8 87 + * bit 7 Always 0 88 + * bit 6 Sign of tilt X 89 + * bit 5 Xt6 90 + * bit 4 Xt5 91 + * bit 3 Xt4 92 + * bit 2 Xt3 93 + * bit 1 Xt2 94 + * bit 0 Xt1 95 + * 96 + * Byte 9 97 + * bit 7 Always 0 98 + * bit 6 Sign of tilt Y 99 + * bit 5 Yt6 100 + * bit 4 Yt5 101 + * bit 3 Yt4 102 + * bit 2 Yt3 103 + * bit 1 Yt2 104 + * bit 0 Yt1 105 + */ 106 + 107 + #include <linux/completion.h> 108 + #include <linux/init.h> 109 + #include <linux/input.h> 110 + #include <linux/interrupt.h> 111 + #include <linux/kernel.h> 112 + #include <linux/module.h> 113 + #include <linux/serio.h> 114 + #include <linux/slab.h> 115 + #include <linux/string.h> 116 + 117 + MODULE_AUTHOR("Julian Squires <julian@cipht.net>, Hans de Goede <hdegoede@redhat.com>"); 118 + MODULE_DESCRIPTION("Wacom protocol 4 serial tablet driver"); 119 + MODULE_LICENSE("GPL"); 120 + 121 + #define REQUEST_MODEL_AND_ROM_VERSION "~#" 122 + #define REQUEST_MAX_COORDINATES "~C\r" 123 + #define REQUEST_CONFIGURATION_STRING "~R\r" 124 + #define REQUEST_RESET_TO_PROTOCOL_IV "\r#" 125 + /* 126 + * Note: sending "\r$\r" causes at least the Digitizer II to send 127 + * packets in ASCII instead of binary. "\r#" seems to undo that. 128 + */ 129 + 130 + #define COMMAND_START_SENDING_PACKETS "ST\r" 131 + #define COMMAND_STOP_SENDING_PACKETS "SP\r" 132 + #define COMMAND_MULTI_MODE_INPUT "MU1\r" 133 + #define COMMAND_ORIGIN_IN_UPPER_LEFT "OC1\r" 134 + #define COMMAND_ENABLE_ALL_MACRO_BUTTONS "~M0\r" 135 + #define COMMAND_DISABLE_GROUP_1_MACRO_BUTTONS "~M1\r" 136 + #define COMMAND_TRANSMIT_AT_MAX_RATE "IT0\r" 137 + #define COMMAND_DISABLE_INCREMENTAL_MODE "IN0\r" 138 + #define COMMAND_ENABLE_CONTINUOUS_MODE "SR\r" 139 + #define COMMAND_ENABLE_PRESSURE_MODE "PH1\r" 140 + #define COMMAND_Z_FILTER "ZF1\r" 141 + 142 + /* Note that this is a protocol 4 packet without tilt information. */ 143 + #define PACKET_LENGTH 7 144 + #define DATA_SIZE 32 145 + 146 + /* flags */ 147 + #define F_COVERS_SCREEN 0x01 148 + #define F_HAS_STYLUS2 0x02 149 + #define F_HAS_SCROLLWHEEL 0x04 150 + 151 + /* device IDs */ 152 + #define STYLUS_DEVICE_ID 0x02 153 + #define CURSOR_DEVICE_ID 0x06 154 + #define ERASER_DEVICE_ID 0x0A 155 + 156 + enum { STYLUS = 1, ERASER, CURSOR }; 157 + 158 + static const struct { 159 + int device_id; 160 + int input_id; 161 + } tools[] = { 162 + { 0, 0 }, 163 + { STYLUS_DEVICE_ID, BTN_TOOL_PEN }, 164 + { ERASER_DEVICE_ID, BTN_TOOL_RUBBER }, 165 + { CURSOR_DEVICE_ID, BTN_TOOL_MOUSE }, 166 + }; 167 + 168 + struct wacom { 169 + struct input_dev *dev; 170 + struct completion cmd_done; 171 + int result; 172 + u8 expect; 173 + u8 eraser_mask; 174 + unsigned int extra_z_bits; 175 + unsigned int flags; 176 + unsigned int res_x, res_y; 177 + unsigned int max_x, max_y; 178 + unsigned int tool; 179 + unsigned int idx; 180 + u8 data[DATA_SIZE]; 181 + char phys[32]; 182 + }; 183 + 184 + enum { 185 + MODEL_CINTIQ = 0x504C, /* PL */ 186 + MODEL_CINTIQ2 = 0x4454, /* DT */ 187 + MODEL_DIGITIZER_II = 0x5544, /* UD */ 188 + MODEL_GRAPHIRE = 0x4554, /* ET */ 189 + MODEL_PENPARTNER = 0x4354, /* CT */ 190 + }; 191 + 192 + static void wacom_handle_model_response(struct wacom *wacom) 193 + { 194 + int major_v, minor_v, r = 0; 195 + char *p; 196 + 197 + p = strrchr(wacom->data, 'V'); 198 + if (p) 199 + r = sscanf(p + 1, "%u.%u", &major_v, &minor_v); 200 + if (r != 2) 201 + major_v = minor_v = 0; 202 + 203 + switch (wacom->data[2] << 8 | wacom->data[3]) { 204 + case MODEL_CINTIQ: /* UNTESTED */ 205 + case MODEL_CINTIQ2: 206 + if ((wacom->data[2] << 8 | wacom->data[3]) == MODEL_CINTIQ) { 207 + wacom->dev->name = "Wacom Cintiq"; 208 + wacom->dev->id.version = MODEL_CINTIQ; 209 + } else { 210 + wacom->dev->name = "Wacom Cintiq II"; 211 + wacom->dev->id.version = MODEL_CINTIQ2; 212 + } 213 + wacom->res_x = 508; 214 + wacom->res_y = 508; 215 + 216 + switch (wacom->data[5] << 8 | wacom->data[6]) { 217 + case 0x3731: /* PL-710 */ 218 + wacom->res_x = 2540; 219 + wacom->res_y = 2540; 220 + /* fall through */ 221 + case 0x3535: /* PL-550 */ 222 + case 0x3830: /* PL-800 */ 223 + wacom->extra_z_bits = 2; 224 + } 225 + 226 + wacom->flags = F_COVERS_SCREEN; 227 + break; 228 + 229 + case MODEL_PENPARTNER: 230 + wacom->dev->name = "Wacom Penpartner"; 231 + wacom->dev->id.version = MODEL_PENPARTNER; 232 + wacom->res_x = 1000; 233 + wacom->res_y = 1000; 234 + break; 235 + 236 + case MODEL_GRAPHIRE: 237 + wacom->dev->name = "Wacom Graphire"; 238 + wacom->dev->id.version = MODEL_GRAPHIRE; 239 + wacom->res_x = 1016; 240 + wacom->res_y = 1016; 241 + wacom->max_x = 5103; 242 + wacom->max_y = 3711; 243 + wacom->extra_z_bits = 2; 244 + wacom->eraser_mask = 0x08; 245 + wacom->flags = F_HAS_STYLUS2 | F_HAS_SCROLLWHEEL; 246 + break; 247 + 248 + case MODEL_DIGITIZER_II: 249 + wacom->dev->name = "Wacom Digitizer II"; 250 + wacom->dev->id.version = MODEL_DIGITIZER_II; 251 + if (major_v == 1 && minor_v <= 2) 252 + wacom->extra_z_bits = 0; /* UNTESTED */ 253 + break; 254 + 255 + default: 256 + dev_err(&wacom->dev->dev, "Unsupported Wacom model %s\n", 257 + wacom->data); 258 + wacom->result = -ENODEV; 259 + return; 260 + } 261 + 262 + dev_info(&wacom->dev->dev, "%s tablet, version %u.%u\n", 263 + wacom->dev->name, major_v, minor_v); 264 + } 265 + 266 + static void wacom_handle_configuration_response(struct wacom *wacom) 267 + { 268 + int r, skip; 269 + 270 + dev_dbg(&wacom->dev->dev, "Configuration string: %s\n", wacom->data); 271 + r = sscanf(wacom->data, "~R%x,%u,%u,%u,%u", &skip, &skip, &skip, 272 + &wacom->res_x, &wacom->res_y); 273 + if (r != 5) 274 + dev_warn(&wacom->dev->dev, "could not get resolution\n"); 275 + } 276 + 277 + static void wacom_handle_coordinates_response(struct wacom *wacom) 278 + { 279 + int r; 280 + 281 + dev_dbg(&wacom->dev->dev, "Coordinates string: %s\n", wacom->data); 282 + r = sscanf(wacom->data, "~C%u,%u", &wacom->max_x, &wacom->max_y); 283 + if (r != 2) 284 + dev_warn(&wacom->dev->dev, "could not get max coordinates\n"); 285 + } 286 + 287 + static void wacom_handle_response(struct wacom *wacom) 288 + { 289 + if (wacom->data[0] != '~' || wacom->data[1] != wacom->expect) { 290 + dev_err(&wacom->dev->dev, 291 + "Wacom got an unexpected response: %s\n", wacom->data); 292 + wacom->result = -EIO; 293 + } else { 294 + wacom->result = 0; 295 + 296 + switch (wacom->data[1]) { 297 + case '#': 298 + wacom_handle_model_response(wacom); 299 + break; 300 + case 'R': 301 + wacom_handle_configuration_response(wacom); 302 + break; 303 + case 'C': 304 + wacom_handle_coordinates_response(wacom); 305 + break; 306 + } 307 + } 308 + 309 + complete(&wacom->cmd_done); 310 + } 311 + 312 + static void wacom_handle_packet(struct wacom *wacom) 313 + { 314 + u8 in_proximity_p, stylus_p, button; 315 + unsigned int tool; 316 + int x, y, z; 317 + 318 + in_proximity_p = wacom->data[0] & 0x40; 319 + stylus_p = wacom->data[0] & 0x20; 320 + button = (wacom->data[3] & 0x78) >> 3; 321 + x = (wacom->data[0] & 3) << 14 | wacom->data[1]<<7 | wacom->data[2]; 322 + y = (wacom->data[3] & 3) << 14 | wacom->data[4]<<7 | wacom->data[5]; 323 + 324 + if (in_proximity_p && stylus_p) { 325 + z = wacom->data[6] & 0x7f; 326 + if (wacom->extra_z_bits >= 1) 327 + z = z << 1 | (wacom->data[3] & 0x4) >> 2; 328 + if (wacom->extra_z_bits > 1) 329 + z = z << 1 | (wacom->data[0] & 0x4) >> 2; 330 + z = z ^ (0x40 << wacom->extra_z_bits); 331 + } else { 332 + z = -1; 333 + } 334 + 335 + if (stylus_p) 336 + tool = (button & wacom->eraser_mask) ? ERASER : STYLUS; 337 + else 338 + tool = CURSOR; 339 + 340 + if (tool != wacom->tool && wacom->tool != 0) { 341 + input_report_key(wacom->dev, tools[wacom->tool].input_id, 0); 342 + input_sync(wacom->dev); 343 + } 344 + wacom->tool = tool; 345 + 346 + input_report_key(wacom->dev, tools[tool].input_id, in_proximity_p); 347 + input_report_abs(wacom->dev, ABS_MISC, 348 + in_proximity_p ? tools[tool].device_id : 0); 349 + input_report_abs(wacom->dev, ABS_X, x); 350 + input_report_abs(wacom->dev, ABS_Y, y); 351 + input_report_abs(wacom->dev, ABS_PRESSURE, z); 352 + if (stylus_p) { 353 + input_report_key(wacom->dev, BTN_TOUCH, button & 1); 354 + input_report_key(wacom->dev, BTN_STYLUS, button & 2); 355 + input_report_key(wacom->dev, BTN_STYLUS2, button & 4); 356 + } else { 357 + input_report_key(wacom->dev, BTN_LEFT, button & 1); 358 + input_report_key(wacom->dev, BTN_RIGHT, button & 2); 359 + input_report_key(wacom->dev, BTN_MIDDLE, button & 4); 360 + /* handle relative wheel for non-stylus device */ 361 + z = (wacom->data[6] & 0x30) >> 4; 362 + if (wacom->data[6] & 0x40) 363 + z = -z; 364 + input_report_rel(wacom->dev, REL_WHEEL, z); 365 + } 366 + input_sync(wacom->dev); 367 + } 368 + 369 + static void wacom_clear_data_buf(struct wacom *wacom) 370 + { 371 + memset(wacom->data, 0, DATA_SIZE); 372 + wacom->idx = 0; 373 + } 374 + 375 + static irqreturn_t wacom_interrupt(struct serio *serio, unsigned char data, 376 + unsigned int flags) 377 + { 378 + struct wacom *wacom = serio_get_drvdata(serio); 379 + 380 + if (data & 0x80) 381 + wacom->idx = 0; 382 + 383 + /* 384 + * We're either expecting a carriage return-terminated ASCII 385 + * response string, or a seven-byte packet with the MSB set on 386 + * the first byte. 387 + * 388 + * Note however that some tablets (the PenPartner, for 389 + * example) don't send a carriage return at the end of a 390 + * command. We handle these by waiting for timeout. 391 + */ 392 + if (data == '\r' && !(wacom->data[0] & 0x80)) { 393 + wacom_handle_response(wacom); 394 + wacom_clear_data_buf(wacom); 395 + return IRQ_HANDLED; 396 + } 397 + 398 + /* Leave place for 0 termination */ 399 + if (wacom->idx > (DATA_SIZE - 2)) { 400 + dev_dbg(&wacom->dev->dev, 401 + "throwing away %d bytes of garbage\n", wacom->idx); 402 + wacom_clear_data_buf(wacom); 403 + } 404 + wacom->data[wacom->idx++] = data; 405 + 406 + if (wacom->idx == PACKET_LENGTH && (wacom->data[0] & 0x80)) { 407 + wacom_handle_packet(wacom); 408 + wacom_clear_data_buf(wacom); 409 + } 410 + 411 + return IRQ_HANDLED; 412 + } 413 + 414 + static void wacom_disconnect(struct serio *serio) 415 + { 416 + struct wacom *wacom = serio_get_drvdata(serio); 417 + 418 + serio_close(serio); 419 + serio_set_drvdata(serio, NULL); 420 + input_unregister_device(wacom->dev); 421 + kfree(wacom); 422 + } 423 + 424 + static int wacom_send(struct serio *serio, const u8 *command) 425 + { 426 + int err = 0; 427 + 428 + for (; !err && *command; command++) 429 + err = serio_write(serio, *command); 430 + 431 + return err; 432 + } 433 + 434 + static int wacom_send_setup_string(struct wacom *wacom, struct serio *serio) 435 + { 436 + const u8 *cmd; 437 + 438 + switch (wacom->dev->id.version) { 439 + case MODEL_CINTIQ: /* UNTESTED */ 440 + cmd = COMMAND_ORIGIN_IN_UPPER_LEFT 441 + COMMAND_TRANSMIT_AT_MAX_RATE 442 + COMMAND_ENABLE_CONTINUOUS_MODE 443 + COMMAND_START_SENDING_PACKETS; 444 + break; 445 + 446 + case MODEL_PENPARTNER: 447 + cmd = COMMAND_ENABLE_PRESSURE_MODE 448 + COMMAND_START_SENDING_PACKETS; 449 + break; 450 + 451 + default: 452 + cmd = COMMAND_MULTI_MODE_INPUT 453 + COMMAND_ORIGIN_IN_UPPER_LEFT 454 + COMMAND_ENABLE_ALL_MACRO_BUTTONS 455 + COMMAND_DISABLE_GROUP_1_MACRO_BUTTONS 456 + COMMAND_TRANSMIT_AT_MAX_RATE 457 + COMMAND_DISABLE_INCREMENTAL_MODE 458 + COMMAND_ENABLE_CONTINUOUS_MODE 459 + COMMAND_Z_FILTER 460 + COMMAND_START_SENDING_PACKETS; 461 + break; 462 + } 463 + 464 + return wacom_send(serio, cmd); 465 + } 466 + 467 + static int wacom_send_and_wait(struct wacom *wacom, struct serio *serio, 468 + const u8 *cmd, const char *desc) 469 + { 470 + int err; 471 + unsigned long u; 472 + 473 + wacom->expect = cmd[1]; 474 + init_completion(&wacom->cmd_done); 475 + 476 + err = wacom_send(serio, cmd); 477 + if (err) 478 + return err; 479 + 480 + u = wait_for_completion_timeout(&wacom->cmd_done, HZ); 481 + if (u == 0) { 482 + /* Timeout, process what we've received. */ 483 + wacom_handle_response(wacom); 484 + } 485 + 486 + wacom->expect = 0; 487 + return wacom->result; 488 + } 489 + 490 + static int wacom_setup(struct wacom *wacom, struct serio *serio) 491 + { 492 + int err; 493 + 494 + /* Note that setting the link speed is the job of inputattach. 495 + * We assume that reset negotiation has already happened, 496 + * here. */ 497 + err = wacom_send_and_wait(wacom, serio, REQUEST_MODEL_AND_ROM_VERSION, 498 + "model and version"); 499 + if (err) 500 + return err; 501 + 502 + if (!(wacom->res_x && wacom->res_y)) { 503 + err = wacom_send_and_wait(wacom, serio, 504 + REQUEST_CONFIGURATION_STRING, 505 + "configuration string"); 506 + if (err) 507 + return err; 508 + } 509 + 510 + if (!(wacom->max_x && wacom->max_y)) { 511 + err = wacom_send_and_wait(wacom, serio, 512 + REQUEST_MAX_COORDINATES, 513 + "coordinates string"); 514 + if (err) 515 + return err; 516 + } 517 + 518 + return wacom_send_setup_string(wacom, serio); 519 + } 520 + 521 + static int wacom_connect(struct serio *serio, struct serio_driver *drv) 522 + { 523 + struct wacom *wacom; 524 + struct input_dev *input_dev; 525 + int err = -ENOMEM; 526 + 527 + wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); 528 + input_dev = input_allocate_device(); 529 + if (!wacom || !input_dev) 530 + goto free_device; 531 + 532 + wacom->dev = input_dev; 533 + wacom->extra_z_bits = 1; 534 + wacom->eraser_mask = 0x04; 535 + wacom->tool = wacom->idx = 0; 536 + snprintf(wacom->phys, sizeof(wacom->phys), "%s/input0", serio->phys); 537 + input_dev->phys = wacom->phys; 538 + input_dev->id.bustype = BUS_RS232; 539 + input_dev->id.vendor = SERIO_WACOM_IV; 540 + input_dev->id.product = serio->id.extra; 541 + input_dev->dev.parent = &serio->dev; 542 + 543 + input_dev->evbit[0] = 544 + BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | BIT_MASK(EV_REL); 545 + set_bit(ABS_MISC, input_dev->absbit); 546 + set_bit(BTN_TOOL_PEN, input_dev->keybit); 547 + set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 548 + set_bit(BTN_TOOL_MOUSE, input_dev->keybit); 549 + set_bit(BTN_TOUCH, input_dev->keybit); 550 + set_bit(BTN_STYLUS, input_dev->keybit); 551 + set_bit(BTN_LEFT, input_dev->keybit); 552 + set_bit(BTN_RIGHT, input_dev->keybit); 553 + set_bit(BTN_MIDDLE, input_dev->keybit); 554 + 555 + serio_set_drvdata(serio, wacom); 556 + 557 + err = serio_open(serio, drv); 558 + if (err) 559 + goto free_device; 560 + 561 + err = wacom_setup(wacom, serio); 562 + if (err) 563 + goto close_serio; 564 + 565 + set_bit(INPUT_PROP_DIRECT, input_dev->propbit); 566 + if (!(wacom->flags & F_COVERS_SCREEN)) 567 + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); 568 + 569 + if (wacom->flags & F_HAS_STYLUS2) 570 + __set_bit(BTN_STYLUS2, input_dev->keybit); 571 + 572 + if (wacom->flags & F_HAS_SCROLLWHEEL) 573 + __set_bit(REL_WHEEL, input_dev->relbit); 574 + 575 + input_abs_set_res(wacom->dev, ABS_X, wacom->res_x); 576 + input_abs_set_res(wacom->dev, ABS_Y, wacom->res_y); 577 + input_set_abs_params(wacom->dev, ABS_X, 0, wacom->max_x, 0, 0); 578 + input_set_abs_params(wacom->dev, ABS_Y, 0, wacom->max_y, 0, 0); 579 + input_set_abs_params(wacom->dev, ABS_PRESSURE, -1, 580 + (1 << (7 + wacom->extra_z_bits)) - 1, 0, 0); 581 + 582 + err = input_register_device(wacom->dev); 583 + if (err) 584 + goto close_serio; 585 + 586 + return 0; 587 + 588 + close_serio: 589 + serio_close(serio); 590 + free_device: 591 + serio_set_drvdata(serio, NULL); 592 + input_free_device(input_dev); 593 + kfree(wacom); 594 + return err; 595 + } 596 + 597 + static struct serio_device_id wacom_serio_ids[] = { 598 + { 599 + .type = SERIO_RS232, 600 + .proto = SERIO_WACOM_IV, 601 + .id = SERIO_ANY, 602 + .extra = SERIO_ANY, 603 + }, 604 + { 0 } 605 + }; 606 + 607 + MODULE_DEVICE_TABLE(serio, wacom_serio_ids); 608 + 609 + static struct serio_driver wacom_drv = { 610 + .driver = { 611 + .name = "wacom_serial4", 612 + }, 613 + .description = "Wacom protocol 4 serial tablet driver", 614 + .id_table = wacom_serio_ids, 615 + .interrupt = wacom_interrupt, 616 + .connect = wacom_connect, 617 + .disconnect = wacom_disconnect, 618 + }; 619 + 620 + module_serio_driver(wacom_drv);
-1497
drivers/input/tablet/wacom_sys.c
··· 1 - /* 2 - * drivers/input/tablet/wacom_sys.c 3 - * 4 - * USB Wacom tablet support - system specific code 5 - */ 6 - 7 - /* 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License as published by 10 - * the Free Software Foundation; either version 2 of the License, or 11 - * (at your option) any later version. 12 - */ 13 - 14 - #include "wacom_wac.h" 15 - #include "wacom.h" 16 - 17 - /* defines to get HID report descriptor */ 18 - #define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01) 19 - #define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02) 20 - #define HID_USAGE_UNDEFINED 0x00 21 - #define HID_USAGE_PAGE 0x05 22 - #define HID_USAGE_PAGE_DIGITIZER 0x0d 23 - #define HID_USAGE_PAGE_DESKTOP 0x01 24 - #define HID_USAGE 0x09 25 - #define HID_USAGE_X ((HID_USAGE_PAGE_DESKTOP << 16) | 0x30) 26 - #define HID_USAGE_Y ((HID_USAGE_PAGE_DESKTOP << 16) | 0x31) 27 - #define HID_USAGE_PRESSURE ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x30) 28 - #define HID_USAGE_X_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3d) 29 - #define HID_USAGE_Y_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3e) 30 - #define HID_USAGE_FINGER ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x22) 31 - #define HID_USAGE_STYLUS ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x20) 32 - #define HID_USAGE_CONTACTMAX ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x55) 33 - #define HID_COLLECTION 0xa1 34 - #define HID_COLLECTION_LOGICAL 0x02 35 - #define HID_COLLECTION_END 0xc0 36 - 37 - struct hid_descriptor { 38 - struct usb_descriptor_header header; 39 - __le16 bcdHID; 40 - u8 bCountryCode; 41 - u8 bNumDescriptors; 42 - u8 bDescriptorType; 43 - __le16 wDescriptorLength; 44 - } __attribute__ ((packed)); 45 - 46 - /* defines to get/set USB message */ 47 - #define USB_REQ_GET_REPORT 0x01 48 - #define USB_REQ_SET_REPORT 0x09 49 - 50 - #define WAC_HID_FEATURE_REPORT 0x03 51 - #define WAC_MSG_RETRIES 5 52 - 53 - #define WAC_CMD_LED_CONTROL 0x20 54 - #define WAC_CMD_ICON_START 0x21 55 - #define WAC_CMD_ICON_XFER 0x23 56 - #define WAC_CMD_RETRIES 10 57 - 58 - static int wacom_get_report(struct usb_interface *intf, u8 type, u8 id, 59 - void *buf, size_t size, unsigned int retries) 60 - { 61 - struct usb_device *dev = interface_to_usbdev(intf); 62 - int retval; 63 - 64 - do { 65 - retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 66 - USB_REQ_GET_REPORT, 67 - USB_DIR_IN | USB_TYPE_CLASS | 68 - USB_RECIP_INTERFACE, 69 - (type << 8) + id, 70 - intf->altsetting[0].desc.bInterfaceNumber, 71 - buf, size, 100); 72 - } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries); 73 - 74 - return retval; 75 - } 76 - 77 - static int wacom_set_report(struct usb_interface *intf, u8 type, u8 id, 78 - void *buf, size_t size, unsigned int retries) 79 - { 80 - struct usb_device *dev = interface_to_usbdev(intf); 81 - int retval; 82 - 83 - do { 84 - retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 85 - USB_REQ_SET_REPORT, 86 - USB_TYPE_CLASS | USB_RECIP_INTERFACE, 87 - (type << 8) + id, 88 - intf->altsetting[0].desc.bInterfaceNumber, 89 - buf, size, 1000); 90 - } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries); 91 - 92 - return retval; 93 - } 94 - 95 - static void wacom_sys_irq(struct urb *urb) 96 - { 97 - struct wacom *wacom = urb->context; 98 - struct device *dev = &wacom->intf->dev; 99 - int retval; 100 - 101 - switch (urb->status) { 102 - case 0: 103 - /* success */ 104 - break; 105 - case -ECONNRESET: 106 - case -ENOENT: 107 - case -ESHUTDOWN: 108 - /* this urb is terminated, clean up */ 109 - dev_dbg(dev, "%s - urb shutting down with status: %d\n", 110 - __func__, urb->status); 111 - return; 112 - default: 113 - dev_dbg(dev, "%s - nonzero urb status received: %d\n", 114 - __func__, urb->status); 115 - goto exit; 116 - } 117 - 118 - wacom_wac_irq(&wacom->wacom_wac, urb->actual_length); 119 - 120 - exit: 121 - usb_mark_last_busy(wacom->usbdev); 122 - retval = usb_submit_urb(urb, GFP_ATOMIC); 123 - if (retval) 124 - dev_err(dev, "%s - usb_submit_urb failed with result %d\n", 125 - __func__, retval); 126 - } 127 - 128 - static int wacom_open(struct input_dev *dev) 129 - { 130 - struct wacom *wacom = input_get_drvdata(dev); 131 - int retval = 0; 132 - 133 - if (usb_autopm_get_interface(wacom->intf) < 0) 134 - return -EIO; 135 - 136 - mutex_lock(&wacom->lock); 137 - 138 - if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { 139 - retval = -EIO; 140 - goto out; 141 - } 142 - 143 - wacom->open = true; 144 - wacom->intf->needs_remote_wakeup = 1; 145 - 146 - out: 147 - mutex_unlock(&wacom->lock); 148 - usb_autopm_put_interface(wacom->intf); 149 - return retval; 150 - } 151 - 152 - static void wacom_close(struct input_dev *dev) 153 - { 154 - struct wacom *wacom = input_get_drvdata(dev); 155 - int autopm_error; 156 - 157 - autopm_error = usb_autopm_get_interface(wacom->intf); 158 - 159 - mutex_lock(&wacom->lock); 160 - usb_kill_urb(wacom->irq); 161 - wacom->open = false; 162 - wacom->intf->needs_remote_wakeup = 0; 163 - mutex_unlock(&wacom->lock); 164 - 165 - if (!autopm_error) 166 - usb_autopm_put_interface(wacom->intf); 167 - } 168 - 169 - /* 170 - * Calculate the resolution of the X or Y axis, given appropriate HID data. 171 - * This function is little more than hidinput_calc_abs_res stripped down. 172 - */ 173 - static int wacom_calc_hid_res(int logical_extents, int physical_extents, 174 - unsigned char unit, unsigned char exponent) 175 - { 176 - int prev, unit_exponent; 177 - 178 - /* Check if the extents are sane */ 179 - if (logical_extents <= 0 || physical_extents <= 0) 180 - return 0; 181 - 182 - /* Get signed value of nybble-sized twos-compliment exponent */ 183 - unit_exponent = exponent; 184 - if (unit_exponent > 7) 185 - unit_exponent -= 16; 186 - 187 - /* Convert physical_extents to millimeters */ 188 - if (unit == 0x11) { /* If centimeters */ 189 - unit_exponent += 1; 190 - } else if (unit == 0x13) { /* If inches */ 191 - prev = physical_extents; 192 - physical_extents *= 254; 193 - if (physical_extents < prev) 194 - return 0; 195 - unit_exponent -= 1; 196 - } else { 197 - return 0; 198 - } 199 - 200 - /* Apply negative unit exponent */ 201 - for (; unit_exponent < 0; unit_exponent++) { 202 - prev = logical_extents; 203 - logical_extents *= 10; 204 - if (logical_extents < prev) 205 - return 0; 206 - } 207 - /* Apply positive unit exponent */ 208 - for (; unit_exponent > 0; unit_exponent--) { 209 - prev = physical_extents; 210 - physical_extents *= 10; 211 - if (physical_extents < prev) 212 - return 0; 213 - } 214 - 215 - /* Calculate resolution */ 216 - return logical_extents / physical_extents; 217 - } 218 - 219 - static int wacom_parse_logical_collection(unsigned char *report, 220 - struct wacom_features *features) 221 - { 222 - int length = 0; 223 - 224 - if (features->type == BAMBOO_PT) { 225 - 226 - /* Logical collection is only used by 3rd gen Bamboo Touch */ 227 - features->pktlen = WACOM_PKGLEN_BBTOUCH3; 228 - features->device_type = BTN_TOOL_FINGER; 229 - 230 - features->x_max = features->y_max = 231 - get_unaligned_le16(&report[10]); 232 - 233 - length = 11; 234 - } 235 - return length; 236 - } 237 - 238 - static void wacom_retrieve_report_data(struct usb_interface *intf, 239 - struct wacom_features *features) 240 - { 241 - int result = 0; 242 - unsigned char *rep_data; 243 - 244 - rep_data = kmalloc(2, GFP_KERNEL); 245 - if (rep_data) { 246 - 247 - rep_data[0] = 12; 248 - result = wacom_get_report(intf, WAC_HID_FEATURE_REPORT, 249 - rep_data[0], rep_data, 2, 250 - WAC_MSG_RETRIES); 251 - 252 - if (result >= 0 && rep_data[1] > 2) 253 - features->touch_max = rep_data[1]; 254 - 255 - kfree(rep_data); 256 - } 257 - } 258 - 259 - /* 260 - * Interface Descriptor of wacom devices can be incomplete and 261 - * inconsistent so wacom_features table is used to store stylus 262 - * device's packet lengths, various maximum values, and tablet 263 - * resolution based on product ID's. 264 - * 265 - * For devices that contain 2 interfaces, wacom_features table is 266 - * inaccurate for the touch interface. Since the Interface Descriptor 267 - * for touch interfaces has pretty complete data, this function exists 268 - * to query tablet for this missing information instead of hard coding in 269 - * an additional table. 270 - * 271 - * A typical Interface Descriptor for a stylus will contain a 272 - * boot mouse application collection that is not of interest and this 273 - * function will ignore it. 274 - * 275 - * It also contains a digitizer application collection that also is not 276 - * of interest since any information it contains would be duplicate 277 - * of what is in wacom_features. Usually it defines a report of an array 278 - * of bytes that could be used as max length of the stylus packet returned. 279 - * If it happens to define a Digitizer-Stylus Physical Collection then 280 - * the X and Y logical values contain valid data but it is ignored. 281 - * 282 - * A typical Interface Descriptor for a touch interface will contain a 283 - * Digitizer-Finger Physical Collection which will define both logical 284 - * X/Y maximum as well as the physical size of tablet. Since touch 285 - * interfaces haven't supported pressure or distance, this is enough 286 - * information to override invalid values in the wacom_features table. 287 - * 288 - * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical 289 - * Collection. Instead they define a Logical Collection with a single 290 - * Logical Maximum for both X and Y. 291 - * 292 - * Intuos5 touch interface does not contain useful data. We deal with 293 - * this after returning from this function. 294 - */ 295 - static int wacom_parse_hid(struct usb_interface *intf, 296 - struct hid_descriptor *hid_desc, 297 - struct wacom_features *features) 298 - { 299 - struct usb_device *dev = interface_to_usbdev(intf); 300 - char limit = 0; 301 - /* result has to be defined as int for some devices */ 302 - int result = 0, touch_max = 0; 303 - int i = 0, page = 0, finger = 0, pen = 0; 304 - unsigned char *report; 305 - 306 - report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); 307 - if (!report) 308 - return -ENOMEM; 309 - 310 - /* retrive report descriptors */ 311 - do { 312 - result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 313 - USB_REQ_GET_DESCRIPTOR, 314 - USB_RECIP_INTERFACE | USB_DIR_IN, 315 - HID_DEVICET_REPORT << 8, 316 - intf->altsetting[0].desc.bInterfaceNumber, /* interface */ 317 - report, 318 - hid_desc->wDescriptorLength, 319 - 5000); /* 5 secs */ 320 - } while (result < 0 && limit++ < WAC_MSG_RETRIES); 321 - 322 - /* No need to parse the Descriptor. It isn't an error though */ 323 - if (result < 0) 324 - goto out; 325 - 326 - for (i = 0; i < hid_desc->wDescriptorLength; i++) { 327 - 328 - switch (report[i]) { 329 - case HID_USAGE_PAGE: 330 - page = report[i + 1]; 331 - i++; 332 - break; 333 - 334 - case HID_USAGE: 335 - switch (page << 16 | report[i + 1]) { 336 - case HID_USAGE_X: 337 - if (finger) { 338 - features->device_type = BTN_TOOL_FINGER; 339 - /* touch device at least supports one touch point */ 340 - touch_max = 1; 341 - switch (features->type) { 342 - case TABLETPC2FG: 343 - features->pktlen = WACOM_PKGLEN_TPC2FG; 344 - break; 345 - 346 - case MTSCREEN: 347 - case WACOM_24HDT: 348 - features->pktlen = WACOM_PKGLEN_MTOUCH; 349 - break; 350 - 351 - case MTTPC: 352 - case MTTPC_B: 353 - features->pktlen = WACOM_PKGLEN_MTTPC; 354 - break; 355 - 356 - case BAMBOO_PT: 357 - features->pktlen = WACOM_PKGLEN_BBTOUCH; 358 - break; 359 - 360 - default: 361 - features->pktlen = WACOM_PKGLEN_GRAPHIRE; 362 - break; 363 - } 364 - 365 - switch (features->type) { 366 - case BAMBOO_PT: 367 - features->x_phy = 368 - get_unaligned_le16(&report[i + 5]); 369 - features->x_max = 370 - get_unaligned_le16(&report[i + 8]); 371 - i += 15; 372 - break; 373 - 374 - case WACOM_24HDT: 375 - features->x_max = 376 - get_unaligned_le16(&report[i + 3]); 377 - features->x_phy = 378 - get_unaligned_le16(&report[i + 8]); 379 - features->unit = report[i - 1]; 380 - features->unitExpo = report[i - 3]; 381 - i += 12; 382 - break; 383 - 384 - case MTTPC_B: 385 - features->x_max = 386 - get_unaligned_le16(&report[i + 3]); 387 - features->x_phy = 388 - get_unaligned_le16(&report[i + 6]); 389 - features->unit = report[i - 5]; 390 - features->unitExpo = report[i - 3]; 391 - i += 9; 392 - break; 393 - 394 - default: 395 - features->x_max = 396 - get_unaligned_le16(&report[i + 3]); 397 - features->x_phy = 398 - get_unaligned_le16(&report[i + 6]); 399 - features->unit = report[i + 9]; 400 - features->unitExpo = report[i + 11]; 401 - i += 12; 402 - break; 403 - } 404 - } else if (pen) { 405 - /* penabled only accepts exact bytes of data */ 406 - if (features->type >= TABLETPC) 407 - features->pktlen = WACOM_PKGLEN_GRAPHIRE; 408 - features->device_type = BTN_TOOL_PEN; 409 - features->x_max = 410 - get_unaligned_le16(&report[i + 3]); 411 - i += 4; 412 - } 413 - break; 414 - 415 - case HID_USAGE_Y: 416 - if (finger) { 417 - switch (features->type) { 418 - case TABLETPC2FG: 419 - case MTSCREEN: 420 - case MTTPC: 421 - features->y_max = 422 - get_unaligned_le16(&report[i + 3]); 423 - features->y_phy = 424 - get_unaligned_le16(&report[i + 6]); 425 - i += 7; 426 - break; 427 - 428 - case WACOM_24HDT: 429 - features->y_max = 430 - get_unaligned_le16(&report[i + 3]); 431 - features->y_phy = 432 - get_unaligned_le16(&report[i - 2]); 433 - i += 7; 434 - break; 435 - 436 - case BAMBOO_PT: 437 - features->y_phy = 438 - get_unaligned_le16(&report[i + 3]); 439 - features->y_max = 440 - get_unaligned_le16(&report[i + 6]); 441 - i += 12; 442 - break; 443 - 444 - case MTTPC_B: 445 - features->y_max = 446 - get_unaligned_le16(&report[i + 3]); 447 - features->y_phy = 448 - get_unaligned_le16(&report[i + 6]); 449 - i += 9; 450 - break; 451 - 452 - default: 453 - features->y_max = 454 - features->x_max; 455 - features->y_phy = 456 - get_unaligned_le16(&report[i + 3]); 457 - i += 4; 458 - break; 459 - } 460 - } else if (pen) { 461 - features->y_max = 462 - get_unaligned_le16(&report[i + 3]); 463 - i += 4; 464 - } 465 - break; 466 - 467 - case HID_USAGE_FINGER: 468 - finger = 1; 469 - i++; 470 - break; 471 - 472 - /* 473 - * Requiring Stylus Usage will ignore boot mouse 474 - * X/Y values and some cases of invalid Digitizer X/Y 475 - * values commonly reported. 476 - */ 477 - case HID_USAGE_STYLUS: 478 - pen = 1; 479 - i++; 480 - break; 481 - 482 - case HID_USAGE_CONTACTMAX: 483 - /* leave touch_max as is if predefined */ 484 - if (!features->touch_max) 485 - wacom_retrieve_report_data(intf, features); 486 - i++; 487 - break; 488 - 489 - case HID_USAGE_PRESSURE: 490 - if (pen) { 491 - features->pressure_max = 492 - get_unaligned_le16(&report[i + 3]); 493 - i += 4; 494 - } 495 - break; 496 - } 497 - break; 498 - 499 - case HID_COLLECTION_END: 500 - /* reset UsagePage and Finger */ 501 - finger = page = 0; 502 - break; 503 - 504 - case HID_COLLECTION: 505 - i++; 506 - switch (report[i]) { 507 - case HID_COLLECTION_LOGICAL: 508 - i += wacom_parse_logical_collection(&report[i], 509 - features); 510 - break; 511 - } 512 - break; 513 - } 514 - } 515 - 516 - out: 517 - if (!features->touch_max && touch_max) 518 - features->touch_max = touch_max; 519 - result = 0; 520 - kfree(report); 521 - return result; 522 - } 523 - 524 - static int wacom_set_device_mode(struct usb_interface *intf, int report_id, int length, int mode) 525 - { 526 - unsigned char *rep_data; 527 - int error = -ENOMEM, limit = 0; 528 - 529 - rep_data = kzalloc(length, GFP_KERNEL); 530 - if (!rep_data) 531 - return error; 532 - 533 - do { 534 - rep_data[0] = report_id; 535 - rep_data[1] = mode; 536 - 537 - error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT, 538 - report_id, rep_data, length, 1); 539 - } while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES); 540 - 541 - kfree(rep_data); 542 - 543 - return error < 0 ? error : 0; 544 - } 545 - 546 - /* 547 - * Switch the tablet into its most-capable mode. Wacom tablets are 548 - * typically configured to power-up in a mode which sends mouse-like 549 - * reports to the OS. To get absolute position, pressure data, etc. 550 - * from the tablet, it is necessary to switch the tablet out of this 551 - * mode and into one which sends the full range of tablet data. 552 - */ 553 - static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features) 554 - { 555 - if (features->device_type == BTN_TOOL_FINGER) { 556 - if (features->type > TABLETPC) { 557 - /* MT Tablet PC touch */ 558 - return wacom_set_device_mode(intf, 3, 4, 4); 559 - } 560 - else if (features->type == WACOM_24HDT || features->type == CINTIQ_HYBRID) { 561 - return wacom_set_device_mode(intf, 18, 3, 2); 562 - } 563 - } else if (features->device_type == BTN_TOOL_PEN) { 564 - if (features->type <= BAMBOO_PT && features->type != WIRELESS) { 565 - return wacom_set_device_mode(intf, 2, 2, 2); 566 - } 567 - } 568 - 569 - return 0; 570 - } 571 - 572 - static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, 573 - struct wacom_features *features) 574 - { 575 - int error = 0; 576 - struct usb_host_interface *interface = intf->cur_altsetting; 577 - struct hid_descriptor *hid_desc; 578 - 579 - /* default features */ 580 - features->device_type = BTN_TOOL_PEN; 581 - features->x_fuzz = 4; 582 - features->y_fuzz = 4; 583 - features->pressure_fuzz = 0; 584 - features->distance_fuzz = 0; 585 - 586 - /* 587 - * The wireless device HID is basic and layout conflicts with 588 - * other tablets (monitor and touch interface can look like pen). 589 - * Skip the query for this type and modify defaults based on 590 - * interface number. 591 - */ 592 - if (features->type == WIRELESS) { 593 - if (intf->cur_altsetting->desc.bInterfaceNumber == 0) { 594 - features->device_type = 0; 595 - } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) { 596 - features->device_type = BTN_TOOL_FINGER; 597 - features->pktlen = WACOM_PKGLEN_BBTOUCH3; 598 - } 599 - } 600 - 601 - /* only devices that support touch need to retrieve the info */ 602 - if (features->type < BAMBOO_PT) { 603 - goto out; 604 - } 605 - 606 - error = usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc); 607 - if (error) { 608 - error = usb_get_extra_descriptor(&interface->endpoint[0], 609 - HID_DEVICET_REPORT, &hid_desc); 610 - if (error) { 611 - dev_err(&intf->dev, 612 - "can not retrieve extra class descriptor\n"); 613 - goto out; 614 - } 615 - } 616 - error = wacom_parse_hid(intf, hid_desc, features); 617 - 618 - out: 619 - return error; 620 - } 621 - 622 - struct wacom_usbdev_data { 623 - struct list_head list; 624 - struct kref kref; 625 - struct usb_device *dev; 626 - struct wacom_shared shared; 627 - }; 628 - 629 - static LIST_HEAD(wacom_udev_list); 630 - static DEFINE_MUTEX(wacom_udev_list_lock); 631 - 632 - static struct usb_device *wacom_get_sibling(struct usb_device *dev, int vendor, int product) 633 - { 634 - int port1; 635 - struct usb_device *sibling; 636 - 637 - if (vendor == 0 && product == 0) 638 - return dev; 639 - 640 - if (dev->parent == NULL) 641 - return NULL; 642 - 643 - usb_hub_for_each_child(dev->parent, port1, sibling) { 644 - struct usb_device_descriptor *d; 645 - if (sibling == NULL) 646 - continue; 647 - 648 - d = &sibling->descriptor; 649 - if (d->idVendor == vendor && d->idProduct == product) 650 - return sibling; 651 - } 652 - 653 - return NULL; 654 - } 655 - 656 - static struct wacom_usbdev_data *wacom_get_usbdev_data(struct usb_device *dev) 657 - { 658 - struct wacom_usbdev_data *data; 659 - 660 - list_for_each_entry(data, &wacom_udev_list, list) { 661 - if (data->dev == dev) { 662 - kref_get(&data->kref); 663 - return data; 664 - } 665 - } 666 - 667 - return NULL; 668 - } 669 - 670 - static int wacom_add_shared_data(struct wacom_wac *wacom, 671 - struct usb_device *dev) 672 - { 673 - struct wacom_usbdev_data *data; 674 - int retval = 0; 675 - 676 - mutex_lock(&wacom_udev_list_lock); 677 - 678 - data = wacom_get_usbdev_data(dev); 679 - if (!data) { 680 - data = kzalloc(sizeof(struct wacom_usbdev_data), GFP_KERNEL); 681 - if (!data) { 682 - retval = -ENOMEM; 683 - goto out; 684 - } 685 - 686 - kref_init(&data->kref); 687 - data->dev = dev; 688 - list_add_tail(&data->list, &wacom_udev_list); 689 - } 690 - 691 - wacom->shared = &data->shared; 692 - 693 - out: 694 - mutex_unlock(&wacom_udev_list_lock); 695 - return retval; 696 - } 697 - 698 - static void wacom_release_shared_data(struct kref *kref) 699 - { 700 - struct wacom_usbdev_data *data = 701 - container_of(kref, struct wacom_usbdev_data, kref); 702 - 703 - mutex_lock(&wacom_udev_list_lock); 704 - list_del(&data->list); 705 - mutex_unlock(&wacom_udev_list_lock); 706 - 707 - kfree(data); 708 - } 709 - 710 - static void wacom_remove_shared_data(struct wacom_wac *wacom) 711 - { 712 - struct wacom_usbdev_data *data; 713 - 714 - if (wacom->shared) { 715 - data = container_of(wacom->shared, struct wacom_usbdev_data, shared); 716 - kref_put(&data->kref, wacom_release_shared_data); 717 - wacom->shared = NULL; 718 - } 719 - } 720 - 721 - static int wacom_led_control(struct wacom *wacom) 722 - { 723 - unsigned char *buf; 724 - int retval; 725 - 726 - buf = kzalloc(9, GFP_KERNEL); 727 - if (!buf) 728 - return -ENOMEM; 729 - 730 - if (wacom->wacom_wac.features.type >= INTUOS5S && 731 - wacom->wacom_wac.features.type <= INTUOSPL) { 732 - /* 733 - * Touch Ring and crop mark LED luminance may take on 734 - * one of four values: 735 - * 0 = Low; 1 = Medium; 2 = High; 3 = Off 736 - */ 737 - int ring_led = wacom->led.select[0] & 0x03; 738 - int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03; 739 - int crop_lum = 0; 740 - 741 - buf[0] = WAC_CMD_LED_CONTROL; 742 - buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led); 743 - } 744 - else { 745 - int led = wacom->led.select[0] | 0x4; 746 - 747 - if (wacom->wacom_wac.features.type == WACOM_21UX2 || 748 - wacom->wacom_wac.features.type == WACOM_24HD) 749 - led |= (wacom->led.select[1] << 4) | 0x40; 750 - 751 - buf[0] = WAC_CMD_LED_CONTROL; 752 - buf[1] = led; 753 - buf[2] = wacom->led.llv; 754 - buf[3] = wacom->led.hlv; 755 - buf[4] = wacom->led.img_lum; 756 - } 757 - 758 - retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL, 759 - buf, 9, WAC_CMD_RETRIES); 760 - kfree(buf); 761 - 762 - return retval; 763 - } 764 - 765 - static int wacom_led_putimage(struct wacom *wacom, int button_id, const void *img) 766 - { 767 - unsigned char *buf; 768 - int i, retval; 769 - 770 - buf = kzalloc(259, GFP_KERNEL); 771 - if (!buf) 772 - return -ENOMEM; 773 - 774 - /* Send 'start' command */ 775 - buf[0] = WAC_CMD_ICON_START; 776 - buf[1] = 1; 777 - retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START, 778 - buf, 2, WAC_CMD_RETRIES); 779 - if (retval < 0) 780 - goto out; 781 - 782 - buf[0] = WAC_CMD_ICON_XFER; 783 - buf[1] = button_id & 0x07; 784 - for (i = 0; i < 4; i++) { 785 - buf[2] = i; 786 - memcpy(buf + 3, img + i * 256, 256); 787 - 788 - retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_XFER, 789 - buf, 259, WAC_CMD_RETRIES); 790 - if (retval < 0) 791 - break; 792 - } 793 - 794 - /* Send 'stop' */ 795 - buf[0] = WAC_CMD_ICON_START; 796 - buf[1] = 0; 797 - wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START, 798 - buf, 2, WAC_CMD_RETRIES); 799 - 800 - out: 801 - kfree(buf); 802 - return retval; 803 - } 804 - 805 - static ssize_t wacom_led_select_store(struct device *dev, int set_id, 806 - const char *buf, size_t count) 807 - { 808 - struct wacom *wacom = dev_get_drvdata(dev); 809 - unsigned int id; 810 - int err; 811 - 812 - err = kstrtouint(buf, 10, &id); 813 - if (err) 814 - return err; 815 - 816 - mutex_lock(&wacom->lock); 817 - 818 - wacom->led.select[set_id] = id & 0x3; 819 - err = wacom_led_control(wacom); 820 - 821 - mutex_unlock(&wacom->lock); 822 - 823 - return err < 0 ? err : count; 824 - } 825 - 826 - #define DEVICE_LED_SELECT_ATTR(SET_ID) \ 827 - static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \ 828 - struct device_attribute *attr, const char *buf, size_t count) \ 829 - { \ 830 - return wacom_led_select_store(dev, SET_ID, buf, count); \ 831 - } \ 832 - static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \ 833 - struct device_attribute *attr, char *buf) \ 834 - { \ 835 - struct wacom *wacom = dev_get_drvdata(dev); \ 836 - return snprintf(buf, 2, "%d\n", wacom->led.select[SET_ID]); \ 837 - } \ 838 - static DEVICE_ATTR(status_led##SET_ID##_select, S_IWUSR | S_IRUSR, \ 839 - wacom_led##SET_ID##_select_show, \ 840 - wacom_led##SET_ID##_select_store) 841 - 842 - DEVICE_LED_SELECT_ATTR(0); 843 - DEVICE_LED_SELECT_ATTR(1); 844 - 845 - static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest, 846 - const char *buf, size_t count) 847 - { 848 - unsigned int value; 849 - int err; 850 - 851 - err = kstrtouint(buf, 10, &value); 852 - if (err) 853 - return err; 854 - 855 - mutex_lock(&wacom->lock); 856 - 857 - *dest = value & 0x7f; 858 - err = wacom_led_control(wacom); 859 - 860 - mutex_unlock(&wacom->lock); 861 - 862 - return err < 0 ? err : count; 863 - } 864 - 865 - #define DEVICE_LUMINANCE_ATTR(name, field) \ 866 - static ssize_t wacom_##name##_luminance_store(struct device *dev, \ 867 - struct device_attribute *attr, const char *buf, size_t count) \ 868 - { \ 869 - struct wacom *wacom = dev_get_drvdata(dev); \ 870 - \ 871 - return wacom_luminance_store(wacom, &wacom->led.field, \ 872 - buf, count); \ 873 - } \ 874 - static DEVICE_ATTR(name##_luminance, S_IWUSR, \ 875 - NULL, wacom_##name##_luminance_store) 876 - 877 - DEVICE_LUMINANCE_ATTR(status0, llv); 878 - DEVICE_LUMINANCE_ATTR(status1, hlv); 879 - DEVICE_LUMINANCE_ATTR(buttons, img_lum); 880 - 881 - static ssize_t wacom_button_image_store(struct device *dev, int button_id, 882 - const char *buf, size_t count) 883 - { 884 - struct wacom *wacom = dev_get_drvdata(dev); 885 - int err; 886 - 887 - if (count != 1024) 888 - return -EINVAL; 889 - 890 - mutex_lock(&wacom->lock); 891 - 892 - err = wacom_led_putimage(wacom, button_id, buf); 893 - 894 - mutex_unlock(&wacom->lock); 895 - 896 - return err < 0 ? err : count; 897 - } 898 - 899 - #define DEVICE_BTNIMG_ATTR(BUTTON_ID) \ 900 - static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \ 901 - struct device_attribute *attr, const char *buf, size_t count) \ 902 - { \ 903 - return wacom_button_image_store(dev, BUTTON_ID, buf, count); \ 904 - } \ 905 - static DEVICE_ATTR(button##BUTTON_ID##_rawimg, S_IWUSR, \ 906 - NULL, wacom_btnimg##BUTTON_ID##_store) 907 - 908 - DEVICE_BTNIMG_ATTR(0); 909 - DEVICE_BTNIMG_ATTR(1); 910 - DEVICE_BTNIMG_ATTR(2); 911 - DEVICE_BTNIMG_ATTR(3); 912 - DEVICE_BTNIMG_ATTR(4); 913 - DEVICE_BTNIMG_ATTR(5); 914 - DEVICE_BTNIMG_ATTR(6); 915 - DEVICE_BTNIMG_ATTR(7); 916 - 917 - static struct attribute *cintiq_led_attrs[] = { 918 - &dev_attr_status_led0_select.attr, 919 - &dev_attr_status_led1_select.attr, 920 - NULL 921 - }; 922 - 923 - static struct attribute_group cintiq_led_attr_group = { 924 - .name = "wacom_led", 925 - .attrs = cintiq_led_attrs, 926 - }; 927 - 928 - static struct attribute *intuos4_led_attrs[] = { 929 - &dev_attr_status0_luminance.attr, 930 - &dev_attr_status1_luminance.attr, 931 - &dev_attr_status_led0_select.attr, 932 - &dev_attr_buttons_luminance.attr, 933 - &dev_attr_button0_rawimg.attr, 934 - &dev_attr_button1_rawimg.attr, 935 - &dev_attr_button2_rawimg.attr, 936 - &dev_attr_button3_rawimg.attr, 937 - &dev_attr_button4_rawimg.attr, 938 - &dev_attr_button5_rawimg.attr, 939 - &dev_attr_button6_rawimg.attr, 940 - &dev_attr_button7_rawimg.attr, 941 - NULL 942 - }; 943 - 944 - static struct attribute_group intuos4_led_attr_group = { 945 - .name = "wacom_led", 946 - .attrs = intuos4_led_attrs, 947 - }; 948 - 949 - static struct attribute *intuos5_led_attrs[] = { 950 - &dev_attr_status0_luminance.attr, 951 - &dev_attr_status_led0_select.attr, 952 - NULL 953 - }; 954 - 955 - static struct attribute_group intuos5_led_attr_group = { 956 - .name = "wacom_led", 957 - .attrs = intuos5_led_attrs, 958 - }; 959 - 960 - static int wacom_initialize_leds(struct wacom *wacom) 961 - { 962 - int error; 963 - 964 - /* Initialize default values */ 965 - switch (wacom->wacom_wac.features.type) { 966 - case INTUOS4S: 967 - case INTUOS4: 968 - case INTUOS4L: 969 - wacom->led.select[0] = 0; 970 - wacom->led.select[1] = 0; 971 - wacom->led.llv = 10; 972 - wacom->led.hlv = 20; 973 - wacom->led.img_lum = 10; 974 - error = sysfs_create_group(&wacom->intf->dev.kobj, 975 - &intuos4_led_attr_group); 976 - break; 977 - 978 - case WACOM_24HD: 979 - case WACOM_21UX2: 980 - wacom->led.select[0] = 0; 981 - wacom->led.select[1] = 0; 982 - wacom->led.llv = 0; 983 - wacom->led.hlv = 0; 984 - wacom->led.img_lum = 0; 985 - 986 - error = sysfs_create_group(&wacom->intf->dev.kobj, 987 - &cintiq_led_attr_group); 988 - break; 989 - 990 - case INTUOS5S: 991 - case INTUOS5: 992 - case INTUOS5L: 993 - case INTUOSPS: 994 - case INTUOSPM: 995 - case INTUOSPL: 996 - if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN) { 997 - wacom->led.select[0] = 0; 998 - wacom->led.select[1] = 0; 999 - wacom->led.llv = 32; 1000 - wacom->led.hlv = 0; 1001 - wacom->led.img_lum = 0; 1002 - 1003 - error = sysfs_create_group(&wacom->intf->dev.kobj, 1004 - &intuos5_led_attr_group); 1005 - } else 1006 - return 0; 1007 - break; 1008 - 1009 - default: 1010 - return 0; 1011 - } 1012 - 1013 - if (error) { 1014 - dev_err(&wacom->intf->dev, 1015 - "cannot create sysfs group err: %d\n", error); 1016 - return error; 1017 - } 1018 - wacom_led_control(wacom); 1019 - 1020 - return 0; 1021 - } 1022 - 1023 - static void wacom_destroy_leds(struct wacom *wacom) 1024 - { 1025 - switch (wacom->wacom_wac.features.type) { 1026 - case INTUOS4S: 1027 - case INTUOS4: 1028 - case INTUOS4L: 1029 - sysfs_remove_group(&wacom->intf->dev.kobj, 1030 - &intuos4_led_attr_group); 1031 - break; 1032 - 1033 - case WACOM_24HD: 1034 - case WACOM_21UX2: 1035 - sysfs_remove_group(&wacom->intf->dev.kobj, 1036 - &cintiq_led_attr_group); 1037 - break; 1038 - 1039 - case INTUOS5S: 1040 - case INTUOS5: 1041 - case INTUOS5L: 1042 - case INTUOSPS: 1043 - case INTUOSPM: 1044 - case INTUOSPL: 1045 - if (wacom->wacom_wac.features.device_type == BTN_TOOL_PEN) 1046 - sysfs_remove_group(&wacom->intf->dev.kobj, 1047 - &intuos5_led_attr_group); 1048 - break; 1049 - } 1050 - } 1051 - 1052 - static enum power_supply_property wacom_battery_props[] = { 1053 - POWER_SUPPLY_PROP_SCOPE, 1054 - POWER_SUPPLY_PROP_CAPACITY 1055 - }; 1056 - 1057 - static int wacom_battery_get_property(struct power_supply *psy, 1058 - enum power_supply_property psp, 1059 - union power_supply_propval *val) 1060 - { 1061 - struct wacom *wacom = container_of(psy, struct wacom, battery); 1062 - int ret = 0; 1063 - 1064 - switch (psp) { 1065 - case POWER_SUPPLY_PROP_SCOPE: 1066 - val->intval = POWER_SUPPLY_SCOPE_DEVICE; 1067 - break; 1068 - case POWER_SUPPLY_PROP_CAPACITY: 1069 - val->intval = 1070 - wacom->wacom_wac.battery_capacity * 100 / 31; 1071 - break; 1072 - default: 1073 - ret = -EINVAL; 1074 - break; 1075 - } 1076 - 1077 - return ret; 1078 - } 1079 - 1080 - static int wacom_initialize_battery(struct wacom *wacom) 1081 - { 1082 - int error = 0; 1083 - 1084 - if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR) { 1085 - wacom->battery.properties = wacom_battery_props; 1086 - wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props); 1087 - wacom->battery.get_property = wacom_battery_get_property; 1088 - wacom->battery.name = "wacom_battery"; 1089 - wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY; 1090 - wacom->battery.use_for_apm = 0; 1091 - 1092 - error = power_supply_register(&wacom->usbdev->dev, 1093 - &wacom->battery); 1094 - 1095 - if (!error) 1096 - power_supply_powers(&wacom->battery, 1097 - &wacom->usbdev->dev); 1098 - } 1099 - 1100 - return error; 1101 - } 1102 - 1103 - static void wacom_destroy_battery(struct wacom *wacom) 1104 - { 1105 - if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR && 1106 - wacom->battery.dev) { 1107 - power_supply_unregister(&wacom->battery); 1108 - wacom->battery.dev = NULL; 1109 - } 1110 - } 1111 - 1112 - static int wacom_register_input(struct wacom *wacom) 1113 - { 1114 - struct input_dev *input_dev; 1115 - struct usb_interface *intf = wacom->intf; 1116 - struct usb_device *dev = interface_to_usbdev(intf); 1117 - struct wacom_wac *wacom_wac = &(wacom->wacom_wac); 1118 - int error; 1119 - 1120 - input_dev = input_allocate_device(); 1121 - if (!input_dev) { 1122 - error = -ENOMEM; 1123 - goto fail1; 1124 - } 1125 - 1126 - input_dev->name = wacom_wac->name; 1127 - input_dev->dev.parent = &intf->dev; 1128 - input_dev->open = wacom_open; 1129 - input_dev->close = wacom_close; 1130 - usb_to_input_id(dev, &input_dev->id); 1131 - input_set_drvdata(input_dev, wacom); 1132 - 1133 - wacom_wac->input = input_dev; 1134 - error = wacom_setup_input_capabilities(input_dev, wacom_wac); 1135 - if (error) 1136 - goto fail1; 1137 - 1138 - error = input_register_device(input_dev); 1139 - if (error) 1140 - goto fail2; 1141 - 1142 - return 0; 1143 - 1144 - fail2: 1145 - input_free_device(input_dev); 1146 - wacom_wac->input = NULL; 1147 - fail1: 1148 - return error; 1149 - } 1150 - 1151 - static void wacom_wireless_work(struct work_struct *work) 1152 - { 1153 - struct wacom *wacom = container_of(work, struct wacom, work); 1154 - struct usb_device *usbdev = wacom->usbdev; 1155 - struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1156 - struct wacom *wacom1, *wacom2; 1157 - struct wacom_wac *wacom_wac1, *wacom_wac2; 1158 - int error; 1159 - 1160 - /* 1161 - * Regardless if this is a disconnect or a new tablet, 1162 - * remove any existing input and battery devices. 1163 - */ 1164 - 1165 - wacom_destroy_battery(wacom); 1166 - 1167 - /* Stylus interface */ 1168 - wacom1 = usb_get_intfdata(usbdev->config->interface[1]); 1169 - wacom_wac1 = &(wacom1->wacom_wac); 1170 - if (wacom_wac1->input) 1171 - input_unregister_device(wacom_wac1->input); 1172 - wacom_wac1->input = NULL; 1173 - 1174 - /* Touch interface */ 1175 - wacom2 = usb_get_intfdata(usbdev->config->interface[2]); 1176 - wacom_wac2 = &(wacom2->wacom_wac); 1177 - if (wacom_wac2->input) 1178 - input_unregister_device(wacom_wac2->input); 1179 - wacom_wac2->input = NULL; 1180 - 1181 - if (wacom_wac->pid == 0) { 1182 - dev_info(&wacom->intf->dev, "wireless tablet disconnected\n"); 1183 - } else { 1184 - const struct usb_device_id *id = wacom_ids; 1185 - 1186 - dev_info(&wacom->intf->dev, 1187 - "wireless tablet connected with PID %x\n", 1188 - wacom_wac->pid); 1189 - 1190 - while (id->match_flags) { 1191 - if (id->idVendor == USB_VENDOR_ID_WACOM && 1192 - id->idProduct == wacom_wac->pid) 1193 - break; 1194 - id++; 1195 - } 1196 - 1197 - if (!id->match_flags) { 1198 - dev_info(&wacom->intf->dev, 1199 - "ignoring unknown PID.\n"); 1200 - return; 1201 - } 1202 - 1203 - /* Stylus interface */ 1204 - wacom_wac1->features = 1205 - *((struct wacom_features *)id->driver_info); 1206 - wacom_wac1->features.device_type = BTN_TOOL_PEN; 1207 - snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen", 1208 - wacom_wac1->features.name); 1209 - wacom_wac1->shared->touch_max = wacom_wac1->features.touch_max; 1210 - wacom_wac1->shared->type = wacom_wac1->features.type; 1211 - error = wacom_register_input(wacom1); 1212 - if (error) 1213 - goto fail; 1214 - 1215 - /* Touch interface */ 1216 - if (wacom_wac1->features.touch_max || 1217 - wacom_wac1->features.type == INTUOSHT) { 1218 - wacom_wac2->features = 1219 - *((struct wacom_features *)id->driver_info); 1220 - wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3; 1221 - wacom_wac2->features.device_type = BTN_TOOL_FINGER; 1222 - wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096; 1223 - if (wacom_wac2->features.touch_max) 1224 - snprintf(wacom_wac2->name, WACOM_NAME_MAX, 1225 - "%s (WL) Finger",wacom_wac2->features.name); 1226 - else 1227 - snprintf(wacom_wac2->name, WACOM_NAME_MAX, 1228 - "%s (WL) Pad",wacom_wac2->features.name); 1229 - error = wacom_register_input(wacom2); 1230 - if (error) 1231 - goto fail; 1232 - 1233 - if (wacom_wac1->features.type == INTUOSHT && 1234 - wacom_wac1->features.touch_max) 1235 - wacom_wac->shared->touch_input = wacom_wac2->input; 1236 - } 1237 - 1238 - error = wacom_initialize_battery(wacom); 1239 - if (error) 1240 - goto fail; 1241 - } 1242 - 1243 - return; 1244 - 1245 - fail: 1246 - if (wacom_wac2->input) { 1247 - input_unregister_device(wacom_wac2->input); 1248 - wacom_wac2->input = NULL; 1249 - } 1250 - 1251 - if (wacom_wac1->input) { 1252 - input_unregister_device(wacom_wac1->input); 1253 - wacom_wac1->input = NULL; 1254 - } 1255 - return; 1256 - } 1257 - 1258 - /* 1259 - * Not all devices report physical dimensions from HID. 1260 - * Compute the default from hardcoded logical dimension 1261 - * and resolution before driver overwrites them. 1262 - */ 1263 - static void wacom_set_default_phy(struct wacom_features *features) 1264 - { 1265 - if (features->x_resolution) { 1266 - features->x_phy = (features->x_max * 100) / 1267 - features->x_resolution; 1268 - features->y_phy = (features->y_max * 100) / 1269 - features->y_resolution; 1270 - } 1271 - } 1272 - 1273 - static void wacom_calculate_res(struct wacom_features *features) 1274 - { 1275 - features->x_resolution = wacom_calc_hid_res(features->x_max, 1276 - features->x_phy, 1277 - features->unit, 1278 - features->unitExpo); 1279 - features->y_resolution = wacom_calc_hid_res(features->y_max, 1280 - features->y_phy, 1281 - features->unit, 1282 - features->unitExpo); 1283 - } 1284 - 1285 - static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) 1286 - { 1287 - struct usb_device *dev = interface_to_usbdev(intf); 1288 - struct usb_endpoint_descriptor *endpoint; 1289 - struct wacom *wacom; 1290 - struct wacom_wac *wacom_wac; 1291 - struct wacom_features *features; 1292 - int error; 1293 - 1294 - if (!id->driver_info) 1295 - return -EINVAL; 1296 - 1297 - wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); 1298 - if (!wacom) 1299 - return -ENOMEM; 1300 - 1301 - wacom_wac = &wacom->wacom_wac; 1302 - wacom_wac->features = *((struct wacom_features *)id->driver_info); 1303 - features = &wacom_wac->features; 1304 - if (features->pktlen > WACOM_PKGLEN_MAX) { 1305 - error = -EINVAL; 1306 - goto fail1; 1307 - } 1308 - 1309 - wacom_wac->data = usb_alloc_coherent(dev, WACOM_PKGLEN_MAX, 1310 - GFP_KERNEL, &wacom->data_dma); 1311 - if (!wacom_wac->data) { 1312 - error = -ENOMEM; 1313 - goto fail1; 1314 - } 1315 - 1316 - wacom->irq = usb_alloc_urb(0, GFP_KERNEL); 1317 - if (!wacom->irq) { 1318 - error = -ENOMEM; 1319 - goto fail2; 1320 - } 1321 - 1322 - wacom->usbdev = dev; 1323 - wacom->intf = intf; 1324 - mutex_init(&wacom->lock); 1325 - INIT_WORK(&wacom->work, wacom_wireless_work); 1326 - usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); 1327 - strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); 1328 - 1329 - endpoint = &intf->cur_altsetting->endpoint[0].desc; 1330 - 1331 - /* set the default size in case we do not get them from hid */ 1332 - wacom_set_default_phy(features); 1333 - 1334 - /* Retrieve the physical and logical size for touch devices */ 1335 - error = wacom_retrieve_hid_descriptor(intf, features); 1336 - if (error) 1337 - goto fail3; 1338 - 1339 - /* 1340 - * Intuos5 has no useful data about its touch interface in its 1341 - * HID descriptor. If this is the touch interface (wMaxPacketSize 1342 - * of WACOM_PKGLEN_BBTOUCH3), override the table values. 1343 - */ 1344 - if (features->type >= INTUOS5S && features->type <= INTUOSHT) { 1345 - if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) { 1346 - features->device_type = BTN_TOOL_FINGER; 1347 - features->pktlen = WACOM_PKGLEN_BBTOUCH3; 1348 - 1349 - features->x_max = 4096; 1350 - features->y_max = 4096; 1351 - } else { 1352 - features->device_type = BTN_TOOL_PEN; 1353 - } 1354 - } 1355 - 1356 - wacom_setup_device_quirks(features); 1357 - 1358 - /* set unit to "100th of a mm" for devices not reported by HID */ 1359 - if (!features->unit) { 1360 - features->unit = 0x11; 1361 - features->unitExpo = 16 - 3; 1362 - } 1363 - wacom_calculate_res(features); 1364 - 1365 - strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); 1366 - 1367 - if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { 1368 - struct usb_device *other_dev; 1369 - 1370 - /* Append the device type to the name */ 1371 - if (features->device_type != BTN_TOOL_FINGER) 1372 - strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX); 1373 - else if (features->touch_max) 1374 - strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX); 1375 - else 1376 - strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX); 1377 - 1378 - other_dev = wacom_get_sibling(dev, features->oVid, features->oPid); 1379 - if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL) 1380 - other_dev = dev; 1381 - error = wacom_add_shared_data(wacom_wac, other_dev); 1382 - if (error) 1383 - goto fail3; 1384 - } 1385 - 1386 - usb_fill_int_urb(wacom->irq, dev, 1387 - usb_rcvintpipe(dev, endpoint->bEndpointAddress), 1388 - wacom_wac->data, features->pktlen, 1389 - wacom_sys_irq, wacom, endpoint->bInterval); 1390 - wacom->irq->transfer_dma = wacom->data_dma; 1391 - wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1392 - 1393 - error = wacom_initialize_leds(wacom); 1394 - if (error) 1395 - goto fail4; 1396 - 1397 - if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) { 1398 - error = wacom_register_input(wacom); 1399 - if (error) 1400 - goto fail5; 1401 - } 1402 - 1403 - /* Note that if query fails it is not a hard failure */ 1404 - wacom_query_tablet_data(intf, features); 1405 - 1406 - usb_set_intfdata(intf, wacom); 1407 - 1408 - if (features->quirks & WACOM_QUIRK_MONITOR) { 1409 - if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { 1410 - error = -EIO; 1411 - goto fail5; 1412 - } 1413 - } 1414 - 1415 - if (wacom_wac->features.type == INTUOSHT && wacom_wac->features.touch_max) { 1416 - if (wacom_wac->features.device_type == BTN_TOOL_FINGER) 1417 - wacom_wac->shared->touch_input = wacom_wac->input; 1418 - } 1419 - 1420 - return 0; 1421 - 1422 - fail5: wacom_destroy_leds(wacom); 1423 - fail4: wacom_remove_shared_data(wacom_wac); 1424 - fail3: usb_free_urb(wacom->irq); 1425 - fail2: usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma); 1426 - fail1: kfree(wacom); 1427 - return error; 1428 - } 1429 - 1430 - static void wacom_disconnect(struct usb_interface *intf) 1431 - { 1432 - struct wacom *wacom = usb_get_intfdata(intf); 1433 - 1434 - usb_set_intfdata(intf, NULL); 1435 - 1436 - usb_kill_urb(wacom->irq); 1437 - cancel_work_sync(&wacom->work); 1438 - if (wacom->wacom_wac.input) 1439 - input_unregister_device(wacom->wacom_wac.input); 1440 - wacom_destroy_battery(wacom); 1441 - wacom_destroy_leds(wacom); 1442 - usb_free_urb(wacom->irq); 1443 - usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX, 1444 - wacom->wacom_wac.data, wacom->data_dma); 1445 - wacom_remove_shared_data(&wacom->wacom_wac); 1446 - kfree(wacom); 1447 - } 1448 - 1449 - static int wacom_suspend(struct usb_interface *intf, pm_message_t message) 1450 - { 1451 - struct wacom *wacom = usb_get_intfdata(intf); 1452 - 1453 - mutex_lock(&wacom->lock); 1454 - usb_kill_urb(wacom->irq); 1455 - mutex_unlock(&wacom->lock); 1456 - 1457 - return 0; 1458 - } 1459 - 1460 - static int wacom_resume(struct usb_interface *intf) 1461 - { 1462 - struct wacom *wacom = usb_get_intfdata(intf); 1463 - struct wacom_features *features = &wacom->wacom_wac.features; 1464 - int rv = 0; 1465 - 1466 - mutex_lock(&wacom->lock); 1467 - 1468 - /* switch to wacom mode first */ 1469 - wacom_query_tablet_data(intf, features); 1470 - wacom_led_control(wacom); 1471 - 1472 - if ((wacom->open || (features->quirks & WACOM_QUIRK_MONITOR)) && 1473 - usb_submit_urb(wacom->irq, GFP_NOIO) < 0) 1474 - rv = -EIO; 1475 - 1476 - mutex_unlock(&wacom->lock); 1477 - 1478 - return rv; 1479 - } 1480 - 1481 - static int wacom_reset_resume(struct usb_interface *intf) 1482 - { 1483 - return wacom_resume(intf); 1484 - } 1485 - 1486 - static struct usb_driver wacom_driver = { 1487 - .name = "wacom", 1488 - .id_table = wacom_ids, 1489 - .probe = wacom_probe, 1490 - .disconnect = wacom_disconnect, 1491 - .suspend = wacom_suspend, 1492 - .resume = wacom_resume, 1493 - .reset_resume = wacom_reset_resume, 1494 - .supports_autosuspend = 1, 1495 - }; 1496 - 1497 - module_usb_driver(wacom_driver);
+712 -476
drivers/input/tablet/wacom_wac.c drivers/hid/wacom_wac.c
··· 25 25 #define WACOM_INTUOS_RES 100 26 26 #define WACOM_INTUOS3_RES 200 27 27 28 - /* Scale factor relating reported contact size to logical contact area. 28 + /* 29 + * Scale factor relating reported contact size to logical contact area. 29 30 * 2^14/pi is a good approximation on Intuos5 and 3rd-gen Bamboo 30 31 */ 31 32 #define WACOM_CONTACT_AREA_SCALE 2607 33 + 34 + /* 35 + * Percent of battery capacity for Graphire. 36 + * 8th value means AC online and show 100% capacity. 37 + */ 38 + static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 }; 39 + 40 + /* 41 + * Percent of battery capacity for Intuos4 WL, AC has a separate bit. 42 + */ 43 + static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 }; 32 44 33 45 static int wacom_penpartner_irq(struct wacom_wac *wacom) 34 46 { ··· 229 217 "%s: received unknown report #%d", __func__, data[0]); 230 218 return 0; 231 219 } else if (data[0] == WACOM_REPORT_DTUSPAD) { 220 + input = wacom->pad_input; 232 221 input_report_key(input, BTN_0, (data[1] & 0x01)); 233 222 input_report_key(input, BTN_1, (data[1] & 0x02)); 234 223 input_report_key(input, BTN_2, (data[1] & 0x04)); 235 224 input_report_key(input, BTN_3, (data[1] & 0x08)); 236 225 input_report_abs(input, ABS_MISC, 237 226 data[1] & 0x0f ? PAD_DEVICE_ID : 0); 238 - /* 239 - * Serial number is required when expresskeys are 240 - * reported through pen interface. 241 - */ 242 - input_event(input, EV_MSC, MSC_SERIAL, 0xf0); 243 227 return 1; 244 228 } else { 245 229 prox = data[1] & 0x80; ··· 265 257 wacom->id[0] = 0; 266 258 input_report_key(input, wacom->tool[0], prox); 267 259 input_report_abs(input, ABS_MISC, wacom->id[0]); 268 - input_event(input, EV_MSC, MSC_SERIAL, 1); 269 260 return 1; 270 261 } 271 262 } ··· 274 267 struct wacom_features *features = &wacom->features; 275 268 unsigned char *data = wacom->data; 276 269 struct input_dev *input = wacom->input; 270 + struct input_dev *pad_input = wacom->pad_input; 271 + int battery_capacity, ps_connected; 277 272 int prox; 278 273 int rw = 0; 279 274 int retval = 0; 280 275 281 - if (data[0] != WACOM_REPORT_PENABLED) { 276 + if (features->type == GRAPHIRE_BT) { 277 + if (data[0] != WACOM_REPORT_PENABLED_BT) { 278 + dev_dbg(input->dev.parent, 279 + "%s: received unknown report #%d\n", __func__, 280 + data[0]); 281 + goto exit; 282 + } 283 + } else if (data[0] != WACOM_REPORT_PENABLED) { 282 284 dev_dbg(input->dev.parent, 283 285 "%s: received unknown report #%d\n", __func__, data[0]); 284 286 goto exit; ··· 321 305 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); 322 306 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); 323 307 if (wacom->tool[0] != BTN_TOOL_MOUSE) { 324 - input_report_abs(input, ABS_PRESSURE, data[6] | ((data[7] & 0x03) << 8)); 308 + if (features->type == GRAPHIRE_BT) 309 + input_report_abs(input, ABS_PRESSURE, data[6] | 310 + (((__u16) (data[1] & 0x08)) << 5)); 311 + else 312 + input_report_abs(input, ABS_PRESSURE, data[6] | 313 + ((data[7] & 0x03) << 8)); 325 314 input_report_key(input, BTN_TOUCH, data[1] & 0x01); 326 315 input_report_key(input, BTN_STYLUS, data[1] & 0x02); 327 316 input_report_key(input, BTN_STYLUS2, data[1] & 0x04); ··· 337 316 features->type == WACOM_MO) { 338 317 input_report_abs(input, ABS_DISTANCE, data[6] & 0x3f); 339 318 rw = (data[7] & 0x04) - (data[7] & 0x03); 319 + } else if (features->type == GRAPHIRE_BT) { 320 + /* Compute distance between mouse and tablet */ 321 + rw = 44 - (data[6] >> 2); 322 + rw = clamp_val(rw, 0, 31); 323 + input_report_abs(input, ABS_DISTANCE, rw); 324 + if (((data[1] >> 5) & 3) == 2) { 325 + /* Mouse with wheel */ 326 + input_report_key(input, BTN_MIDDLE, 327 + data[1] & 0x04); 328 + rw = (data[6] & 0x01) ? -1 : 329 + (data[6] & 0x02) ? 1 : 0; 330 + } else { 331 + rw = 0; 332 + } 340 333 } else { 341 334 input_report_abs(input, ABS_DISTANCE, data[7] & 0x3f); 342 335 rw = -(signed char)data[6]; ··· 362 327 wacom->id[0] = 0; 363 328 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ 364 329 input_report_key(input, wacom->tool[0], prox); 365 - input_event(input, EV_MSC, MSC_SERIAL, 1); 366 330 input_sync(input); /* sync last event */ 367 331 } 368 332 ··· 371 337 prox = data[7] & 0xf8; 372 338 if (prox || wacom->id[1]) { 373 339 wacom->id[1] = PAD_DEVICE_ID; 374 - input_report_key(input, BTN_BACK, (data[7] & 0x40)); 375 - input_report_key(input, BTN_FORWARD, (data[7] & 0x80)); 340 + input_report_key(pad_input, BTN_BACK, (data[7] & 0x40)); 341 + input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x80)); 376 342 rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); 377 - input_report_rel(input, REL_WHEEL, rw); 343 + input_report_rel(pad_input, REL_WHEEL, rw); 378 344 if (!prox) 379 345 wacom->id[1] = 0; 380 - input_report_abs(input, ABS_MISC, wacom->id[1]); 381 - input_event(input, EV_MSC, MSC_SERIAL, 0xf0); 346 + input_report_abs(pad_input, ABS_MISC, wacom->id[1]); 382 347 retval = 1; 383 348 } 384 349 break; ··· 386 353 prox = (data[7] & 0xf8) || data[8]; 387 354 if (prox || wacom->id[1]) { 388 355 wacom->id[1] = PAD_DEVICE_ID; 389 - input_report_key(input, BTN_BACK, (data[7] & 0x08)); 390 - input_report_key(input, BTN_LEFT, (data[7] & 0x20)); 391 - input_report_key(input, BTN_FORWARD, (data[7] & 0x10)); 392 - input_report_key(input, BTN_RIGHT, (data[7] & 0x40)); 393 - input_report_abs(input, ABS_WHEEL, (data[8] & 0x7f)); 356 + input_report_key(pad_input, BTN_BACK, (data[7] & 0x08)); 357 + input_report_key(pad_input, BTN_LEFT, (data[7] & 0x20)); 358 + input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x10)); 359 + input_report_key(pad_input, BTN_RIGHT, (data[7] & 0x40)); 360 + input_report_abs(pad_input, ABS_WHEEL, (data[8] & 0x7f)); 394 361 if (!prox) 395 362 wacom->id[1] = 0; 396 - input_report_abs(input, ABS_MISC, wacom->id[1]); 397 - input_event(input, EV_MSC, MSC_SERIAL, 0xf0); 363 + input_report_abs(pad_input, ABS_MISC, wacom->id[1]); 398 364 retval = 1; 399 365 } 400 366 break; 367 + case GRAPHIRE_BT: 368 + prox = data[7] & 0x03; 369 + if (prox || wacom->id[1]) { 370 + wacom->id[1] = PAD_DEVICE_ID; 371 + input_report_key(pad_input, BTN_0, (data[7] & 0x02)); 372 + input_report_key(pad_input, BTN_1, (data[7] & 0x01)); 373 + if (!prox) 374 + wacom->id[1] = 0; 375 + input_report_abs(pad_input, ABS_MISC, wacom->id[1]); 376 + retval = 1; 377 + } 378 + break; 379 + } 380 + 381 + /* Store current battery capacity and power supply state */ 382 + if (features->type == GRAPHIRE_BT) { 383 + rw = (data[7] >> 2 & 0x07); 384 + battery_capacity = batcap_gr[rw]; 385 + ps_connected = rw == 7; 386 + if ((wacom->battery_capacity != battery_capacity) || 387 + (wacom->ps_connected != ps_connected)) { 388 + wacom->battery_capacity = battery_capacity; 389 + wacom->ps_connected = ps_connected; 390 + wacom_notify_battery(wacom); 391 + } 401 392 } 402 393 exit: 403 394 return retval; ··· 641 584 642 585 /* pad packets. Works as a second tool and is always in prox */ 643 586 if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD) { 587 + input = wacom->pad_input; 644 588 if (features->type >= INTUOS4S && features->type <= INTUOS4L) { 645 589 input_report_key(input, BTN_0, (data[2] & 0x01)); 646 590 input_report_key(input, BTN_1, (data[3] & 0x01)); ··· 831 773 input_report_abs(input, ABS_MISC, 0); 832 774 } 833 775 } 834 - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); 835 776 return 1; 836 777 } 837 778 ··· 956 899 int y = y2 - y1; 957 900 958 901 return int_sqrt(x*x + y*y); 902 + } 903 + 904 + static void wacom_intuos_bt_process_data(struct wacom_wac *wacom, 905 + unsigned char *data) 906 + { 907 + memcpy(wacom->data, data, 10); 908 + wacom_intuos_irq(wacom); 909 + 910 + input_sync(wacom->input); 911 + if (wacom->pad_input) 912 + input_sync(wacom->pad_input); 913 + } 914 + 915 + static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len) 916 + { 917 + unsigned char data[WACOM_PKGLEN_MAX]; 918 + int i = 1; 919 + unsigned power_raw, battery_capacity, bat_charging, ps_connected; 920 + 921 + memcpy(data, wacom->data, len); 922 + 923 + switch (data[0]) { 924 + case 0x04: 925 + wacom_intuos_bt_process_data(wacom, data + i); 926 + i += 10; 927 + /* fall through */ 928 + case 0x03: 929 + wacom_intuos_bt_process_data(wacom, data + i); 930 + i += 10; 931 + wacom_intuos_bt_process_data(wacom, data + i); 932 + i += 10; 933 + power_raw = data[i]; 934 + bat_charging = (power_raw & 0x08) ? 1 : 0; 935 + ps_connected = (power_raw & 0x10) ? 1 : 0; 936 + battery_capacity = batcap_i4[power_raw & 0x07]; 937 + if ((wacom->battery_capacity != battery_capacity) || 938 + (wacom->bat_charging != bat_charging) || 939 + (wacom->ps_connected != ps_connected)) { 940 + wacom->battery_capacity = battery_capacity; 941 + wacom->bat_charging = bat_charging; 942 + wacom->ps_connected = ps_connected; 943 + wacom_notify_battery(wacom); 944 + } 945 + 946 + break; 947 + default: 948 + dev_dbg(wacom->input->dev.parent, 949 + "Unknown report: %d,%d size:%zu\n", 950 + data[0], data[1], len); 951 + return 0; 952 + } 953 + return 0; 959 954 } 960 955 961 956 static int wacom_24hdt_irq(struct wacom_wac *wacom) ··· 1202 1093 input_report_key(input, BTN_STYLUS2, data[1] & 0x10); 1203 1094 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); 1204 1095 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); 1205 - input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x03) << 8) | data[6]); 1096 + input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x07) << 8) | data[6]); 1206 1097 input_report_key(input, BTN_TOUCH, data[1] & 0x05); 1207 1098 input_report_key(input, wacom->tool[0], prox); 1208 1099 return 1; ··· 1252 1143 { 1253 1144 struct wacom_features *features = &wacom->features; 1254 1145 struct input_dev *input = wacom->input; 1146 + struct input_dev *pad_input = wacom->pad_input; 1255 1147 unsigned char *data = wacom->data; 1256 1148 int i; 1257 1149 ··· 1287 1177 1288 1178 input_mt_report_pointer_emulation(input, true); 1289 1179 1290 - input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); 1291 - input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0); 1292 - input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0); 1293 - input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0); 1180 + input_report_key(pad_input, BTN_LEFT, (data[1] & 0x08) != 0); 1181 + input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0); 1182 + input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0); 1183 + input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0); 1294 1184 1295 - input_sync(input); 1296 - 1297 - return 0; 1185 + return 1; 1298 1186 } 1299 1187 1300 1188 static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) ··· 1340 1232 1341 1233 static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) 1342 1234 { 1343 - struct input_dev *input = wacom->input; 1235 + struct input_dev *input = wacom->pad_input; 1344 1236 struct wacom_features *features = &wacom->features; 1345 1237 1346 1238 if (features->type == INTUOSHT) { ··· 1377 1269 } 1378 1270 input_mt_report_pointer_emulation(input, true); 1379 1271 1380 - input_sync(input); 1381 - 1382 - return 0; 1272 + return 1; 1383 1273 } 1384 1274 1385 1275 static int wacom_bpt_pen(struct wacom_wac *wacom) ··· 1481 1375 1482 1376 connected = data[1] & 0x01; 1483 1377 if (connected) { 1484 - int pid, battery; 1378 + int pid, battery, ps_connected; 1485 1379 1486 1380 if ((wacom->shared->type == INTUOSHT) && 1487 1381 wacom->shared->touch_max) { ··· 1491 1385 } 1492 1386 1493 1387 pid = get_unaligned_be16(&data[6]); 1494 - battery = data[5] & 0x3f; 1388 + battery = (data[5] & 0x3f) * 100 / 31; 1389 + ps_connected = !!(data[5] & 0x80); 1495 1390 if (wacom->pid != pid) { 1496 1391 wacom->pid = pid; 1497 1392 wacom_schedule_work(wacom); 1498 1393 } 1499 - wacom->battery_capacity = battery; 1394 + 1395 + if (wacom->shared->type && 1396 + (battery != wacom->battery_capacity || 1397 + ps_connected != wacom->ps_connected)) { 1398 + wacom->battery_capacity = battery; 1399 + wacom->ps_connected = ps_connected; 1400 + wacom->bat_charging = ps_connected && 1401 + wacom->battery_capacity < 100; 1402 + wacom_notify_battery(wacom); 1403 + } 1500 1404 } else if (wacom->pid != 0) { 1501 1405 /* disconnected while previously connected */ 1502 1406 wacom->pid = 0; 1503 1407 wacom_schedule_work(wacom); 1504 1408 wacom->battery_capacity = 0; 1409 + wacom->bat_charging = 0; 1410 + wacom->ps_connected = 0; 1505 1411 } 1506 1412 1507 1413 return 0; ··· 1534 1416 1535 1417 case WACOM_G4: 1536 1418 case GRAPHIRE: 1419 + case GRAPHIRE_BT: 1537 1420 case WACOM_MO: 1538 1421 sync = wacom_graphire_irq(wacom_wac); 1539 1422 break; ··· 1567 1448 case DTK: 1568 1449 case CINTIQ_HYBRID: 1569 1450 sync = wacom_intuos_irq(wacom_wac); 1451 + break; 1452 + 1453 + case INTUOS4WL: 1454 + sync = wacom_intuos_bt_irq(wacom_wac, len); 1570 1455 break; 1571 1456 1572 1457 case WACOM_24HDT: ··· 1612 1489 break; 1613 1490 } 1614 1491 1615 - if (sync) 1492 + if (sync) { 1616 1493 input_sync(wacom_wac->input); 1494 + if (wacom_wac->pad_input) 1495 + input_sync(wacom_wac->pad_input); 1496 + } 1617 1497 } 1618 1498 1619 1499 static void wacom_setup_cintiq(struct wacom_wac *wacom_wac) ··· 1691 1565 features->quirks |= WACOM_QUIRK_NO_INPUT; 1692 1566 1693 1567 /* must be monitor interface if no device_type set */ 1694 - if (!features->device_type) 1568 + if (!features->device_type) { 1695 1569 features->quirks |= WACOM_QUIRK_MONITOR; 1570 + features->quirks |= WACOM_QUIRK_BATTERY; 1571 + } 1696 1572 } 1697 1573 } 1698 1574 ··· 1743 1615 struct wacom_wac *wacom_wac) 1744 1616 { 1745 1617 struct wacom_features *features = &wacom_wac->features; 1746 - int i; 1747 1618 1748 1619 input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 1749 1620 ··· 1757 1630 /* fall through */ 1758 1631 1759 1632 case WACOM_G4: 1760 - input_set_capability(input_dev, EV_MSC, MSC_SERIAL); 1761 - 1762 - __set_bit(BTN_BACK, input_dev->keybit); 1763 - __set_bit(BTN_FORWARD, input_dev->keybit); 1764 1633 /* fall through */ 1765 1634 1766 1635 case GRAPHIRE: ··· 1775 1652 __set_bit(INPUT_PROP_POINTER, input_dev->propbit); 1776 1653 break; 1777 1654 1655 + case GRAPHIRE_BT: 1656 + __clear_bit(ABS_MISC, input_dev->absbit); 1657 + input_set_abs_params(input_dev, ABS_DISTANCE, 0, 1658 + features->distance_max, 1659 + 0, 0); 1660 + 1661 + input_set_capability(input_dev, EV_REL, REL_WHEEL); 1662 + 1663 + __set_bit(BTN_LEFT, input_dev->keybit); 1664 + __set_bit(BTN_RIGHT, input_dev->keybit); 1665 + __set_bit(BTN_MIDDLE, input_dev->keybit); 1666 + 1667 + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 1668 + __set_bit(BTN_TOOL_PEN, input_dev->keybit); 1669 + __set_bit(BTN_TOOL_MOUSE, input_dev->keybit); 1670 + __set_bit(BTN_STYLUS, input_dev->keybit); 1671 + __set_bit(BTN_STYLUS2, input_dev->keybit); 1672 + 1673 + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); 1674 + break; 1675 + 1778 1676 case WACOM_24HD: 1779 - __set_bit(BTN_A, input_dev->keybit); 1780 - __set_bit(BTN_B, input_dev->keybit); 1781 - __set_bit(BTN_C, input_dev->keybit); 1782 - __set_bit(BTN_X, input_dev->keybit); 1783 - __set_bit(BTN_Y, input_dev->keybit); 1784 - __set_bit(BTN_Z, input_dev->keybit); 1785 - 1786 - for (i = 6; i < 10; i++) 1787 - __set_bit(BTN_0 + i, input_dev->keybit); 1788 - 1789 - __set_bit(KEY_PROG1, input_dev->keybit); 1790 - __set_bit(KEY_PROG2, input_dev->keybit); 1791 - __set_bit(KEY_PROG3, input_dev->keybit); 1792 - 1793 1677 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 1794 1678 input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0); 1795 1679 /* fall through */ 1796 1680 1797 1681 case DTK: 1798 - for (i = 0; i < 6; i++) 1799 - __set_bit(BTN_0 + i, input_dev->keybit); 1800 - 1801 1682 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); 1802 1683 1803 1684 wacom_setup_cintiq(wacom_wac); 1804 1685 break; 1805 1686 1806 1687 case WACOM_22HD: 1807 - __set_bit(KEY_PROG1, input_dev->keybit); 1808 - __set_bit(KEY_PROG2, input_dev->keybit); 1809 - __set_bit(KEY_PROG3, input_dev->keybit); 1810 - /* fall through */ 1811 - 1812 1688 case WACOM_21UX2: 1813 - __set_bit(BTN_A, input_dev->keybit); 1814 - __set_bit(BTN_B, input_dev->keybit); 1815 - __set_bit(BTN_C, input_dev->keybit); 1816 - __set_bit(BTN_X, input_dev->keybit); 1817 - __set_bit(BTN_Y, input_dev->keybit); 1818 - __set_bit(BTN_Z, input_dev->keybit); 1819 - __set_bit(BTN_BASE, input_dev->keybit); 1820 - __set_bit(BTN_BASE2, input_dev->keybit); 1821 - /* fall through */ 1822 - 1823 1689 case WACOM_BEE: 1824 - __set_bit(BTN_8, input_dev->keybit); 1825 - __set_bit(BTN_9, input_dev->keybit); 1826 - /* fall through */ 1827 - 1828 1690 case CINTIQ: 1829 - for (i = 0; i < 8; i++) 1830 - __set_bit(BTN_0 + i, input_dev->keybit); 1831 - 1832 - input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); 1833 - input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); 1834 1691 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 1835 1692 1836 1693 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); ··· 1819 1716 break; 1820 1717 1821 1718 case WACOM_13HD: 1822 - for (i = 0; i < 9; i++) 1823 - __set_bit(BTN_0 + i, input_dev->keybit); 1824 - 1825 1719 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 1826 1720 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); 1827 1721 wacom_setup_cintiq(wacom_wac); ··· 1826 1726 1827 1727 case INTUOS3: 1828 1728 case INTUOS3L: 1829 - __set_bit(BTN_4, input_dev->keybit); 1830 - __set_bit(BTN_5, input_dev->keybit); 1831 - __set_bit(BTN_6, input_dev->keybit); 1832 - __set_bit(BTN_7, input_dev->keybit); 1833 - 1834 - input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); 1835 - /* fall through */ 1836 - 1837 1729 case INTUOS3S: 1838 - __set_bit(BTN_0, input_dev->keybit); 1839 - __set_bit(BTN_1, input_dev->keybit); 1840 - __set_bit(BTN_2, input_dev->keybit); 1841 - __set_bit(BTN_3, input_dev->keybit); 1842 - 1843 - input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); 1844 1730 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 1845 1731 /* fall through */ 1846 1732 ··· 1840 1754 case INTUOS5L: 1841 1755 case INTUOSPM: 1842 1756 case INTUOSPL: 1843 - if (features->device_type == BTN_TOOL_PEN) { 1844 - __set_bit(BTN_7, input_dev->keybit); 1845 - __set_bit(BTN_8, input_dev->keybit); 1846 - } 1847 - /* fall through */ 1848 - 1849 1757 case INTUOS5S: 1850 1758 case INTUOSPS: 1851 1759 __set_bit(INPUT_PROP_POINTER, input_dev->propbit); 1852 1760 1853 1761 if (features->device_type == BTN_TOOL_PEN) { 1854 - for (i = 0; i < 7; i++) 1855 - __set_bit(BTN_0 + i, input_dev->keybit); 1856 - 1857 1762 input_set_abs_params(input_dev, ABS_DISTANCE, 0, 1858 1763 features->distance_max, 1859 1764 0, 0); ··· 1864 1787 break; 1865 1788 1866 1789 case INTUOS4: 1790 + case INTUOS4WL: 1867 1791 case INTUOS4L: 1868 - __set_bit(BTN_7, input_dev->keybit); 1869 - __set_bit(BTN_8, input_dev->keybit); 1870 - /* fall through */ 1871 - 1872 1792 case INTUOS4S: 1873 - for (i = 0; i < 7; i++) 1874 - __set_bit(BTN_0 + i, input_dev->keybit); 1875 - 1876 1793 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 1877 1794 wacom_setup_intuos(wacom_wac); 1878 1795 ··· 1904 1833 case DTUS: 1905 1834 case PL: 1906 1835 case DTU: 1907 - if (features->type == DTUS) { 1908 - input_set_capability(input_dev, EV_MSC, MSC_SERIAL); 1909 - for (i = 0; i < 4; i++) 1910 - __set_bit(BTN_0 + i, input_dev->keybit); 1911 - } 1912 1836 __set_bit(BTN_TOOL_PEN, input_dev->keybit); 1913 1837 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 1914 1838 __set_bit(BTN_STYLUS, input_dev->keybit); ··· 1937 1871 1938 1872 if (features->device_type == BTN_TOOL_FINGER) { 1939 1873 1940 - __set_bit(BTN_LEFT, input_dev->keybit); 1941 - __set_bit(BTN_FORWARD, input_dev->keybit); 1942 - __set_bit(BTN_BACK, input_dev->keybit); 1943 - __set_bit(BTN_RIGHT, input_dev->keybit); 1944 - 1945 1874 if (features->touch_max) { 1946 1875 if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { 1947 1876 input_set_abs_params(input_dev, ··· 1966 1905 break; 1967 1906 1968 1907 case CINTIQ_HYBRID: 1969 - __set_bit(BTN_1, input_dev->keybit); 1970 - __set_bit(BTN_2, input_dev->keybit); 1971 - __set_bit(BTN_3, input_dev->keybit); 1972 - __set_bit(BTN_4, input_dev->keybit); 1973 - 1974 - __set_bit(BTN_5, input_dev->keybit); 1975 - __set_bit(BTN_6, input_dev->keybit); 1976 - __set_bit(BTN_7, input_dev->keybit); 1977 - __set_bit(BTN_8, input_dev->keybit); 1978 - __set_bit(BTN_0, input_dev->keybit); 1979 - 1980 1908 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 1981 1909 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); 1982 1910 ··· 1975 1925 return 0; 1976 1926 } 1977 1927 1928 + int wacom_setup_pad_input_capabilities(struct input_dev *input_dev, 1929 + struct wacom_wac *wacom_wac) 1930 + { 1931 + struct wacom_features *features = &wacom_wac->features; 1932 + int i; 1933 + 1934 + input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 1935 + 1936 + /* kept for making legacy xf86-input-wacom working with the wheels */ 1937 + __set_bit(ABS_MISC, input_dev->absbit); 1938 + 1939 + /* kept for making legacy xf86-input-wacom accepting the pad */ 1940 + input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0); 1941 + input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0); 1942 + 1943 + switch (features->type) { 1944 + case GRAPHIRE_BT: 1945 + __set_bit(BTN_0, input_dev->keybit); 1946 + __set_bit(BTN_1, input_dev->keybit); 1947 + break; 1948 + 1949 + case WACOM_MO: 1950 + __set_bit(BTN_BACK, input_dev->keybit); 1951 + __set_bit(BTN_LEFT, input_dev->keybit); 1952 + __set_bit(BTN_FORWARD, input_dev->keybit); 1953 + __set_bit(BTN_RIGHT, input_dev->keybit); 1954 + input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 1955 + break; 1956 + 1957 + case WACOM_G4: 1958 + __set_bit(BTN_BACK, input_dev->keybit); 1959 + __set_bit(BTN_LEFT, input_dev->keybit); 1960 + __set_bit(BTN_FORWARD, input_dev->keybit); 1961 + __set_bit(BTN_RIGHT, input_dev->keybit); 1962 + input_set_capability(input_dev, EV_REL, REL_WHEEL); 1963 + break; 1964 + 1965 + case WACOM_24HD: 1966 + __set_bit(BTN_A, input_dev->keybit); 1967 + __set_bit(BTN_B, input_dev->keybit); 1968 + __set_bit(BTN_C, input_dev->keybit); 1969 + __set_bit(BTN_X, input_dev->keybit); 1970 + __set_bit(BTN_Y, input_dev->keybit); 1971 + __set_bit(BTN_Z, input_dev->keybit); 1972 + 1973 + for (i = 0; i < 10; i++) 1974 + __set_bit(BTN_0 + i, input_dev->keybit); 1975 + 1976 + __set_bit(KEY_PROG1, input_dev->keybit); 1977 + __set_bit(KEY_PROG2, input_dev->keybit); 1978 + __set_bit(KEY_PROG3, input_dev->keybit); 1979 + 1980 + input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 1981 + input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0); 1982 + break; 1983 + 1984 + case DTK: 1985 + for (i = 0; i < 6; i++) 1986 + __set_bit(BTN_0 + i, input_dev->keybit); 1987 + 1988 + break; 1989 + 1990 + case WACOM_22HD: 1991 + __set_bit(KEY_PROG1, input_dev->keybit); 1992 + __set_bit(KEY_PROG2, input_dev->keybit); 1993 + __set_bit(KEY_PROG3, input_dev->keybit); 1994 + /* fall through */ 1995 + 1996 + case WACOM_21UX2: 1997 + __set_bit(BTN_A, input_dev->keybit); 1998 + __set_bit(BTN_B, input_dev->keybit); 1999 + __set_bit(BTN_C, input_dev->keybit); 2000 + __set_bit(BTN_X, input_dev->keybit); 2001 + __set_bit(BTN_Y, input_dev->keybit); 2002 + __set_bit(BTN_Z, input_dev->keybit); 2003 + __set_bit(BTN_BASE, input_dev->keybit); 2004 + __set_bit(BTN_BASE2, input_dev->keybit); 2005 + /* fall through */ 2006 + 2007 + case WACOM_BEE: 2008 + __set_bit(BTN_8, input_dev->keybit); 2009 + __set_bit(BTN_9, input_dev->keybit); 2010 + /* fall through */ 2011 + 2012 + case CINTIQ: 2013 + for (i = 0; i < 8; i++) 2014 + __set_bit(BTN_0 + i, input_dev->keybit); 2015 + 2016 + input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); 2017 + input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); 2018 + break; 2019 + 2020 + case WACOM_13HD: 2021 + for (i = 0; i < 9; i++) 2022 + __set_bit(BTN_0 + i, input_dev->keybit); 2023 + 2024 + input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 2025 + break; 2026 + 2027 + case INTUOS3: 2028 + case INTUOS3L: 2029 + __set_bit(BTN_4, input_dev->keybit); 2030 + __set_bit(BTN_5, input_dev->keybit); 2031 + __set_bit(BTN_6, input_dev->keybit); 2032 + __set_bit(BTN_7, input_dev->keybit); 2033 + 2034 + input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); 2035 + /* fall through */ 2036 + 2037 + case INTUOS3S: 2038 + __set_bit(BTN_0, input_dev->keybit); 2039 + __set_bit(BTN_1, input_dev->keybit); 2040 + __set_bit(BTN_2, input_dev->keybit); 2041 + __set_bit(BTN_3, input_dev->keybit); 2042 + 2043 + input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); 2044 + break; 2045 + 2046 + case INTUOS5: 2047 + case INTUOS5L: 2048 + case INTUOSPM: 2049 + case INTUOSPL: 2050 + __set_bit(BTN_7, input_dev->keybit); 2051 + __set_bit(BTN_8, input_dev->keybit); 2052 + /* fall through */ 2053 + 2054 + case INTUOS5S: 2055 + case INTUOSPS: 2056 + /* touch interface does not have the pad device */ 2057 + if (features->device_type != BTN_TOOL_PEN) 2058 + return 1; 2059 + 2060 + for (i = 0; i < 7; i++) 2061 + __set_bit(BTN_0 + i, input_dev->keybit); 2062 + 2063 + input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 2064 + break; 2065 + 2066 + case INTUOS4WL: 2067 + /* 2068 + * For Bluetooth devices, the udev rule does not work correctly 2069 + * for pads unless we add a stylus capability, which forces 2070 + * ID_INPUT_TABLET to be set. 2071 + */ 2072 + __set_bit(BTN_STYLUS, input_dev->keybit); 2073 + /* fall through */ 2074 + 2075 + case INTUOS4: 2076 + case INTUOS4L: 2077 + __set_bit(BTN_7, input_dev->keybit); 2078 + __set_bit(BTN_8, input_dev->keybit); 2079 + /* fall through */ 2080 + 2081 + case INTUOS4S: 2082 + for (i = 0; i < 7; i++) 2083 + __set_bit(BTN_0 + i, input_dev->keybit); 2084 + 2085 + input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 2086 + break; 2087 + 2088 + case CINTIQ_HYBRID: 2089 + for (i = 0; i < 9; i++) 2090 + __set_bit(BTN_0 + i, input_dev->keybit); 2091 + 2092 + break; 2093 + 2094 + case DTUS: 2095 + for (i = 0; i < 4; i++) 2096 + __set_bit(BTN_0 + i, input_dev->keybit); 2097 + break; 2098 + 2099 + case INTUOSHT: 2100 + case BAMBOO_PT: 2101 + /* pad device is on the touch interface */ 2102 + if (features->device_type != BTN_TOOL_FINGER) 2103 + return 1; 2104 + 2105 + __clear_bit(ABS_MISC, input_dev->absbit); 2106 + 2107 + __set_bit(BTN_LEFT, input_dev->keybit); 2108 + __set_bit(BTN_FORWARD, input_dev->keybit); 2109 + __set_bit(BTN_BACK, input_dev->keybit); 2110 + __set_bit(BTN_RIGHT, input_dev->keybit); 2111 + 2112 + break; 2113 + 2114 + default: 2115 + /* no pad supported */ 2116 + return 1; 2117 + } 2118 + return 0; 2119 + } 2120 + 1978 2121 static const struct wacom_features wacom_features_0x00 = 1979 - { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255, 1980 - 0, PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; 2122 + { "Wacom Penpartner", 5040, 3780, 255, 0, 2123 + PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; 1981 2124 static const struct wacom_features wacom_features_0x10 = 1982 - { "Wacom Graphire", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, 1983 - 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2125 + { "Wacom Graphire", 10206, 7422, 511, 63, 2126 + GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2127 + static const struct wacom_features wacom_features_0x81 = 2128 + { "Wacom Graphire BT", 16704, 12064, 511, 32, 2129 + GRAPHIRE_BT, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 1984 2130 static const struct wacom_features wacom_features_0x11 = 1985 - { "Wacom Graphire2 4x5", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, 1986 - 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2131 + { "Wacom Graphire2 4x5", 10206, 7422, 511, 63, 2132 + GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 1987 2133 static const struct wacom_features wacom_features_0x12 = 1988 - { "Wacom Graphire2 5x7", WACOM_PKGLEN_GRAPHIRE, 13918, 10206, 511, 1989 - 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2134 + { "Wacom Graphire2 5x7", 13918, 10206, 511, 63, 2135 + GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 1990 2136 static const struct wacom_features wacom_features_0x13 = 1991 - { "Wacom Graphire3", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, 1992 - 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2137 + { "Wacom Graphire3", 10208, 7424, 511, 63, 2138 + GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 1993 2139 static const struct wacom_features wacom_features_0x14 = 1994 - { "Wacom Graphire3 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 1995 - 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2140 + { "Wacom Graphire3 6x8", 16704, 12064, 511, 63, 2141 + GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 1996 2142 static const struct wacom_features wacom_features_0x15 = 1997 - { "Wacom Graphire4 4x5", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, 1998 - 63, WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2143 + { "Wacom Graphire4 4x5", 10208, 7424, 511, 63, 2144 + WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 1999 2145 static const struct wacom_features wacom_features_0x16 = 2000 - { "Wacom Graphire4 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 2001 - 63, WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2146 + { "Wacom Graphire4 6x8", 16704, 12064, 511, 63, 2147 + WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2002 2148 static const struct wacom_features wacom_features_0x17 = 2003 - { "Wacom BambooFun 4x5", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 2004 - 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2149 + { "Wacom BambooFun 4x5", 14760, 9225, 511, 63, 2150 + WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2005 2151 static const struct wacom_features wacom_features_0x18 = 2006 - { "Wacom BambooFun 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 511, 2007 - 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2152 + { "Wacom BambooFun 6x8", 21648, 13530, 511, 63, 2153 + WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2008 2154 static const struct wacom_features wacom_features_0x19 = 2009 - { "Wacom Bamboo1 Medium", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, 2010 - 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2155 + { "Wacom Bamboo1 Medium", 16704, 12064, 511, 63, 2156 + GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; 2011 2157 static const struct wacom_features wacom_features_0x60 = 2012 - { "Wacom Volito", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 2013 - 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2158 + { "Wacom Volito", 5104, 3712, 511, 63, 2159 + GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2014 2160 static const struct wacom_features wacom_features_0x61 = 2015 - { "Wacom PenStation2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 255, 2016 - 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2161 + { "Wacom PenStation2", 3250, 2320, 255, 63, 2162 + GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2017 2163 static const struct wacom_features wacom_features_0x62 = 2018 - { "Wacom Volito2 4x5", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 2019 - 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2164 + { "Wacom Volito2 4x5", 5104, 3712, 511, 63, 2165 + GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2020 2166 static const struct wacom_features wacom_features_0x63 = 2021 - { "Wacom Volito2 2x3", WACOM_PKGLEN_GRAPHIRE, 3248, 2320, 511, 2022 - 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2167 + { "Wacom Volito2 2x3", 3248, 2320, 511, 63, 2168 + GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2023 2169 static const struct wacom_features wacom_features_0x64 = 2024 - { "Wacom PenPartner2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 511, 2025 - 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2170 + { "Wacom PenPartner2", 3250, 2320, 511, 63, 2171 + GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; 2026 2172 static const struct wacom_features wacom_features_0x65 = 2027 - { "Wacom Bamboo", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, 2028 - 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2173 + { "Wacom Bamboo", 14760, 9225, 511, 63, 2174 + WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2029 2175 static const struct wacom_features wacom_features_0x69 = 2030 - { "Wacom Bamboo1", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, 2031 - 63, GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; 2176 + { "Wacom Bamboo1", 5104, 3712, 511, 63, 2177 + GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; 2032 2178 static const struct wacom_features wacom_features_0x6A = 2033 - { "Wacom Bamboo1 4x6", WACOM_PKGLEN_GRAPHIRE, 14760, 9225, 1023, 2034 - 63, GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2179 + { "Wacom Bamboo1 4x6", 14760, 9225, 1023, 63, 2180 + GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2035 2181 static const struct wacom_features wacom_features_0x6B = 2036 - { "Wacom Bamboo1 5x8", WACOM_PKGLEN_GRAPHIRE, 21648, 13530, 1023, 2037 - 63, GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2182 + { "Wacom Bamboo1 5x8", 21648, 13530, 1023, 63, 2183 + GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2038 2184 static const struct wacom_features wacom_features_0x20 = 2039 - { "Wacom Intuos 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, 2040 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2185 + { "Wacom Intuos 4x5", 12700, 10600, 1023, 31, 2186 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2041 2187 static const struct wacom_features wacom_features_0x21 = 2042 - { "Wacom Intuos 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 2043 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2188 + { "Wacom Intuos 6x8", 20320, 16240, 1023, 31, 2189 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2044 2190 static const struct wacom_features wacom_features_0x22 = 2045 - { "Wacom Intuos 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, 2046 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2191 + { "Wacom Intuos 9x12", 30480, 24060, 1023, 31, 2192 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2047 2193 static const struct wacom_features wacom_features_0x23 = 2048 - { "Wacom Intuos 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, 2049 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2194 + { "Wacom Intuos 12x12", 30480, 31680, 1023, 31, 2195 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2050 2196 static const struct wacom_features wacom_features_0x24 = 2051 - { "Wacom Intuos 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, 2052 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2197 + { "Wacom Intuos 12x18", 45720, 31680, 1023, 31, 2198 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2053 2199 static const struct wacom_features wacom_features_0x30 = 2054 - { "Wacom PL400", WACOM_PKGLEN_GRAPHIRE, 5408, 4056, 255, 2055 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2200 + { "Wacom PL400", 5408, 4056, 255, 0, 2201 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2056 2202 static const struct wacom_features wacom_features_0x31 = 2057 - { "Wacom PL500", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 255, 2058 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2203 + { "Wacom PL500", 6144, 4608, 255, 0, 2204 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2059 2205 static const struct wacom_features wacom_features_0x32 = 2060 - { "Wacom PL600", WACOM_PKGLEN_GRAPHIRE, 6126, 4604, 255, 2061 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2206 + { "Wacom PL600", 6126, 4604, 255, 0, 2207 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2062 2208 static const struct wacom_features wacom_features_0x33 = 2063 - { "Wacom PL600SX", WACOM_PKGLEN_GRAPHIRE, 6260, 5016, 255, 2064 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2209 + { "Wacom PL600SX", 6260, 5016, 255, 0, 2210 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2065 2211 static const struct wacom_features wacom_features_0x34 = 2066 - { "Wacom PL550", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 511, 2067 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2212 + { "Wacom PL550", 6144, 4608, 511, 0, 2213 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2068 2214 static const struct wacom_features wacom_features_0x35 = 2069 - { "Wacom PL800", WACOM_PKGLEN_GRAPHIRE, 7220, 5780, 511, 2070 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2215 + { "Wacom PL800", 7220, 5780, 511, 0, 2216 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2071 2217 static const struct wacom_features wacom_features_0x37 = 2072 - { "Wacom PL700", WACOM_PKGLEN_GRAPHIRE, 6758, 5406, 511, 2073 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2218 + { "Wacom PL700", 6758, 5406, 511, 0, 2219 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2074 2220 static const struct wacom_features wacom_features_0x38 = 2075 - { "Wacom PL510", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, 2076 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2221 + { "Wacom PL510", 6282, 4762, 511, 0, 2222 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2077 2223 static const struct wacom_features wacom_features_0x39 = 2078 - { "Wacom DTU710", WACOM_PKGLEN_GRAPHIRE, 34080, 27660, 511, 2079 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2224 + { "Wacom DTU710", 34080, 27660, 511, 0, 2225 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2080 2226 static const struct wacom_features wacom_features_0xC4 = 2081 - { "Wacom DTF521", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, 2082 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2227 + { "Wacom DTF521", 6282, 4762, 511, 0, 2228 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2083 2229 static const struct wacom_features wacom_features_0xC0 = 2084 - { "Wacom DTF720", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, 2085 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2230 + { "Wacom DTF720", 6858, 5506, 511, 0, 2231 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2086 2232 static const struct wacom_features wacom_features_0xC2 = 2087 - { "Wacom DTF720a", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, 2088 - 0, PL, WACOM_PL_RES, WACOM_PL_RES }; 2233 + { "Wacom DTF720a", 6858, 5506, 511, 0, 2234 + PL, WACOM_PL_RES, WACOM_PL_RES }; 2089 2235 static const struct wacom_features wacom_features_0x03 = 2090 - { "Wacom Cintiq Partner", WACOM_PKGLEN_GRAPHIRE, 20480, 15360, 511, 2091 - 0, PTU, WACOM_PL_RES, WACOM_PL_RES }; 2236 + { "Wacom Cintiq Partner", 20480, 15360, 511, 0, 2237 + PTU, WACOM_PL_RES, WACOM_PL_RES }; 2092 2238 static const struct wacom_features wacom_features_0x41 = 2093 - { "Wacom Intuos2 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, 2094 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2239 + { "Wacom Intuos2 4x5", 12700, 10600, 1023, 31, 2240 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2095 2241 static const struct wacom_features wacom_features_0x42 = 2096 - { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 2097 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2242 + { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31, 2243 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2098 2244 static const struct wacom_features wacom_features_0x43 = 2099 - { "Wacom Intuos2 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, 2100 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2245 + { "Wacom Intuos2 9x12", 30480, 24060, 1023, 31, 2246 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2101 2247 static const struct wacom_features wacom_features_0x44 = 2102 - { "Wacom Intuos2 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, 2103 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2248 + { "Wacom Intuos2 12x12", 30480, 31680, 1023, 31, 2249 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2104 2250 static const struct wacom_features wacom_features_0x45 = 2105 - { "Wacom Intuos2 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, 2106 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2251 + { "Wacom Intuos2 12x18", 45720, 31680, 1023, 31, 2252 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2107 2253 static const struct wacom_features wacom_features_0xB0 = 2108 - { "Wacom Intuos3 4x5", WACOM_PKGLEN_INTUOS, 25400, 20320, 1023, 2109 - 63, INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2254 + { "Wacom Intuos3 4x5", 25400, 20320, 1023, 63, 2255 + INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2110 2256 static const struct wacom_features wacom_features_0xB1 = 2111 - { "Wacom Intuos3 6x8", WACOM_PKGLEN_INTUOS, 40640, 30480, 1023, 2112 - 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2257 + { "Wacom Intuos3 6x8", 40640, 30480, 1023, 63, 2258 + INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2113 2259 static const struct wacom_features wacom_features_0xB2 = 2114 - { "Wacom Intuos3 9x12", WACOM_PKGLEN_INTUOS, 60960, 45720, 1023, 2115 - 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2260 + { "Wacom Intuos3 9x12", 60960, 45720, 1023, 63, 2261 + INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2116 2262 static const struct wacom_features wacom_features_0xB3 = 2117 - { "Wacom Intuos3 12x12", WACOM_PKGLEN_INTUOS, 60960, 60960, 1023, 2118 - 63, INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2263 + { "Wacom Intuos3 12x12", 60960, 60960, 1023, 63, 2264 + INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2119 2265 static const struct wacom_features wacom_features_0xB4 = 2120 - { "Wacom Intuos3 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 1023, 2121 - 63, INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2266 + { "Wacom Intuos3 12x19", 97536, 60960, 1023, 63, 2267 + INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2122 2268 static const struct wacom_features wacom_features_0xB5 = 2123 - { "Wacom Intuos3 6x11", WACOM_PKGLEN_INTUOS, 54204, 31750, 1023, 2124 - 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2269 + { "Wacom Intuos3 6x11", 54204, 31750, 1023, 63, 2270 + INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2125 2271 static const struct wacom_features wacom_features_0xB7 = 2126 - { "Wacom Intuos3 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 1023, 2127 - 63, INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2272 + { "Wacom Intuos3 4x6", 31496, 19685, 1023, 63, 2273 + INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2128 2274 static const struct wacom_features wacom_features_0xB8 = 2129 - { "Wacom Intuos4 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, 2130 - 63, INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2275 + { "Wacom Intuos4 4x6", 31496, 19685, 2047, 63, 2276 + INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2131 2277 static const struct wacom_features wacom_features_0xB9 = 2132 - { "Wacom Intuos4 6x9", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, 2133 - 63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2278 + { "Wacom Intuos4 6x9", 44704, 27940, 2047, 63, 2279 + INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2134 2280 static const struct wacom_features wacom_features_0xBA = 2135 - { "Wacom Intuos4 8x13", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, 2136 - 63, INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2281 + { "Wacom Intuos4 8x13", 65024, 40640, 2047, 63, 2282 + INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2137 2283 static const struct wacom_features wacom_features_0xBB = 2138 - { "Wacom Intuos4 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 2047, 2139 - 63, INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2284 + { "Wacom Intuos4 12x19", 97536, 60960, 2047, 63, 2285 + INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2140 2286 static const struct wacom_features wacom_features_0xBC = 2141 - { "Wacom Intuos4 WL", WACOM_PKGLEN_INTUOS, 40640, 25400, 2047, 2142 - 63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2287 + { "Wacom Intuos4 WL", 40640, 25400, 2047, 63, 2288 + INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2289 + static const struct wacom_features wacom_features_0xBD = 2290 + { "Wacom Intuos4 WL", 40640, 25400, 2047, 63, 2291 + INTUOS4WL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2143 2292 static const struct wacom_features wacom_features_0x26 = 2144 - { "Wacom Intuos5 touch S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, 2145 - 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 2146 - .touch_max = 16 }; 2293 + { "Wacom Intuos5 touch S", 31496, 19685, 2047, 63, 2294 + INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16 }; 2147 2295 static const struct wacom_features wacom_features_0x27 = 2148 - { "Wacom Intuos5 touch M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, 2149 - 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 2150 - .touch_max = 16 }; 2296 + { "Wacom Intuos5 touch M", 44704, 27940, 2047, 63, 2297 + INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16 }; 2151 2298 static const struct wacom_features wacom_features_0x28 = 2152 - { "Wacom Intuos5 touch L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, 2153 - 63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 2154 - .touch_max = 16 }; 2299 + { "Wacom Intuos5 touch L", 65024, 40640, 2047, 63, 2300 + INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16 }; 2155 2301 static const struct wacom_features wacom_features_0x29 = 2156 - { "Wacom Intuos5 S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, 2157 - 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2302 + { "Wacom Intuos5 S", 31496, 19685, 2047, 63, 2303 + INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2158 2304 static const struct wacom_features wacom_features_0x2A = 2159 - { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, 2160 - 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2305 + { "Wacom Intuos5 M", 44704, 27940, 2047, 63, 2306 + INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2161 2307 static const struct wacom_features wacom_features_0x314 = 2162 - { "Wacom Intuos Pro S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, 2163 - 63, INTUOSPS, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 2164 - .touch_max = 16 }; 2308 + { "Wacom Intuos Pro S", 31496, 19685, 2047, 63, 2309 + INTUOSPS, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16, 2310 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2165 2311 static const struct wacom_features wacom_features_0x315 = 2166 - { "Wacom Intuos Pro M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, 2167 - 63, INTUOSPM, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 2168 - .touch_max = 16 }; 2312 + { "Wacom Intuos Pro M", 44704, 27940, 2047, 63, 2313 + INTUOSPM, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16, 2314 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2169 2315 static const struct wacom_features wacom_features_0x317 = 2170 - { "Wacom Intuos Pro L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, 2171 - 63, INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 2172 - .touch_max = 16 }; 2316 + { "Wacom Intuos Pro L", 65024, 40640, 2047, 63, 2317 + INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16, 2318 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2173 2319 static const struct wacom_features wacom_features_0xF4 = 2174 - { "Wacom Cintiq 24HD", WACOM_PKGLEN_INTUOS, 104280, 65400, 2047, 2175 - 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2320 + { "Wacom Cintiq 24HD", 104280, 65400, 2047, 63, 2321 + WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2176 2322 static const struct wacom_features wacom_features_0xF8 = 2177 - { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS, 104280, 65400, 2047, /* Pen */ 2178 - 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2323 + { "Wacom Cintiq 24HD touch", 104280, 65400, 2047, 63, /* Pen */ 2324 + WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2179 2325 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 }; 2180 2326 static const struct wacom_features wacom_features_0xF6 = 2181 2327 { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */ 2182 - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 }; 2328 + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10, 2329 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2183 2330 static const struct wacom_features wacom_features_0x3F = 2184 - { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, 2185 - 63, CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2331 + { "Wacom Cintiq 21UX", 87200, 65600, 1023, 63, 2332 + CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2186 2333 static const struct wacom_features wacom_features_0xC5 = 2187 - { "Wacom Cintiq 20WSX", WACOM_PKGLEN_INTUOS, 86680, 54180, 1023, 2188 - 63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2334 + { "Wacom Cintiq 20WSX", 86680, 54180, 1023, 63, 2335 + WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2189 2336 static const struct wacom_features wacom_features_0xC6 = 2190 - { "Wacom Cintiq 12WX", WACOM_PKGLEN_INTUOS, 53020, 33440, 1023, 2191 - 63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2337 + { "Wacom Cintiq 12WX", 53020, 33440, 1023, 63, 2338 + WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; 2192 2339 static const struct wacom_features wacom_features_0x304 = 2193 - { "Wacom Cintiq 13HD", WACOM_PKGLEN_INTUOS, 59352, 33648, 1023, 2194 - 63, WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2340 + { "Wacom Cintiq 13HD", 59352, 33648, 1023, 63, 2341 + WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2195 2342 static const struct wacom_features wacom_features_0xC7 = 2196 - { "Wacom DTU1931", WACOM_PKGLEN_GRAPHIRE, 37832, 30305, 511, 2197 - 0, PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2343 + { "Wacom DTU1931", 37832, 30305, 511, 0, 2344 + PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2198 2345 static const struct wacom_features wacom_features_0xCE = 2199 - { "Wacom DTU2231", WACOM_PKGLEN_GRAPHIRE, 47864, 27011, 511, 2200 - 0, DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2346 + { "Wacom DTU2231", 47864, 27011, 511, 0, 2347 + DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2348 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBMOUSE }; 2201 2349 static const struct wacom_features wacom_features_0xF0 = 2202 - { "Wacom DTU1631", WACOM_PKGLEN_GRAPHIRE, 34623, 19553, 511, 2203 - 0, DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2350 + { "Wacom DTU1631", 34623, 19553, 511, 0, 2351 + DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2204 2352 static const struct wacom_features wacom_features_0xFB = 2205 - { "Wacom DTU1031", WACOM_PKGLEN_DTUS, 22096, 13960, 511, 2206 - 0, DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2353 + { "Wacom DTU1031", 22096, 13960, 511, 0, 2354 + DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2207 2355 static const struct wacom_features wacom_features_0x57 = 2208 - { "Wacom DTK2241", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047, 2209 - 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2356 + { "Wacom DTK2241", 95640, 54060, 2047, 63, 2357 + DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2210 2358 static const struct wacom_features wacom_features_0x59 = /* Pen */ 2211 - { "Wacom DTH2242", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047, 2212 - 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2359 + { "Wacom DTH2242", 95640, 54060, 2047, 63, 2360 + DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2213 2361 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D }; 2214 2362 static const struct wacom_features wacom_features_0x5D = /* Touch */ 2215 2363 { "Wacom DTH2242", .type = WACOM_24HDT, 2216 - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10 }; 2364 + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10, 2365 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2217 2366 static const struct wacom_features wacom_features_0xCC = 2218 - { "Wacom Cintiq 21UX2", WACOM_PKGLEN_INTUOS, 87000, 65400, 2047, 2219 - 63, WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2367 + { "Wacom Cintiq 21UX2", 87000, 65400, 2047, 63, 2368 + WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2220 2369 static const struct wacom_features wacom_features_0xFA = 2221 - { "Wacom Cintiq 22HD", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047, 2222 - 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2370 + { "Wacom Cintiq 22HD", 95640, 54060, 2047, 63, 2371 + WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200 }; 2223 2372 static const struct wacom_features wacom_features_0x5B = 2224 - { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS, 95640, 54060, 2047, 2225 - 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2373 + { "Wacom Cintiq 22HDT", 95640, 54060, 2047, 63, 2374 + WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2226 2375 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e }; 2227 2376 static const struct wacom_features wacom_features_0x5E = 2228 2377 { "Wacom Cintiq 22HDT", .type = WACOM_24HDT, 2229 - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 }; 2378 + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10, 2379 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2230 2380 static const struct wacom_features wacom_features_0x90 = 2231 - { "Wacom ISDv4 90", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2232 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2381 + { "Wacom ISDv4 90", 26202, 16325, 255, 0, 2382 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2233 2383 static const struct wacom_features wacom_features_0x93 = 2234 - { "Wacom ISDv4 93", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2235 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2384 + { "Wacom ISDv4 93", 26202, 16325, 255, 0, 2385 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2236 2386 static const struct wacom_features wacom_features_0x97 = 2237 - { "Wacom ISDv4 97", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 511, 2238 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2387 + { "Wacom ISDv4 97", 26202, 16325, 511, 0, 2388 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2239 2389 static const struct wacom_features wacom_features_0x9A = 2240 - { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2241 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2390 + { "Wacom ISDv4 9A", 26202, 16325, 255, 0, 2391 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2242 2392 static const struct wacom_features wacom_features_0x9F = 2243 - { "Wacom ISDv4 9F", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2244 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2393 + { "Wacom ISDv4 9F", 26202, 16325, 255, 0, 2394 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2245 2395 static const struct wacom_features wacom_features_0xE2 = 2246 - { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 2247 - 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2248 - .touch_max = 2 }; 2396 + { "Wacom ISDv4 E2", 26202, 16325, 255, 0, 2397 + TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2249 2398 static const struct wacom_features wacom_features_0xE3 = 2250 - { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 2251 - 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2252 - .touch_max = 2 }; 2399 + { "Wacom ISDv4 E3", 26202, 16325, 255, 0, 2400 + TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2253 2401 static const struct wacom_features wacom_features_0xE5 = 2254 - { "Wacom ISDv4 E5", WACOM_PKGLEN_MTOUCH, 26202, 16325, 255, 2255 - 0, MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2402 + { "Wacom ISDv4 E5", 26202, 16325, 255, 0, 2403 + MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2256 2404 static const struct wacom_features wacom_features_0xE6 = 2257 - { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255, 2258 - 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2259 - .touch_max = 2 }; 2405 + { "Wacom ISDv4 E6", 27760, 15694, 255, 0, 2406 + TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2260 2407 static const struct wacom_features wacom_features_0xEC = 2261 - { "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255, 2262 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2408 + { "Wacom ISDv4 EC", 25710, 14500, 255, 0, 2409 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2263 2410 static const struct wacom_features wacom_features_0xED = 2264 - { "Wacom ISDv4 ED", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2265 - 0, TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2411 + { "Wacom ISDv4 ED", 26202, 16325, 255, 0, 2412 + TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2266 2413 static const struct wacom_features wacom_features_0xEF = 2267 - { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2268 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2414 + { "Wacom ISDv4 EF", 26202, 16325, 255, 0, 2415 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2269 2416 static const struct wacom_features wacom_features_0x100 = 2270 - { "Wacom ISDv4 100", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, 2271 - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2417 + { "Wacom ISDv4 100", 26202, 16325, 255, 0, 2418 + MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2272 2419 static const struct wacom_features wacom_features_0x101 = 2273 - { "Wacom ISDv4 101", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, 2274 - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2420 + { "Wacom ISDv4 101", 26202, 16325, 255, 0, 2421 + MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2275 2422 static const struct wacom_features wacom_features_0x10D = 2276 - { "Wacom ISDv4 10D", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, 2277 - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2423 + { "Wacom ISDv4 10D", 26202, 16325, 255, 0, 2424 + MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2278 2425 static const struct wacom_features wacom_features_0x10E = 2279 - { "Wacom ISDv4 10E", WACOM_PKGLEN_MTTPC, 27760, 15694, 255, 2280 - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2426 + { "Wacom ISDv4 10E", 27760, 15694, 255, 0, 2427 + MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2281 2428 static const struct wacom_features wacom_features_0x10F = 2282 - { "Wacom ISDv4 10F", WACOM_PKGLEN_MTTPC, 27760, 15694, 255, 2283 - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2429 + { "Wacom ISDv4 10F", 27760, 15694, 255, 0, 2430 + MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2284 2431 static const struct wacom_features wacom_features_0x116 = 2285 - { "Wacom ISDv4 116", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 2286 - 0, TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2432 + { "Wacom ISDv4 116", 26202, 16325, 255, 0, 2433 + TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2434 + static const struct wacom_features wacom_features_0x12C = 2435 + { "Wacom ISDv4 12C", 27848, 15752, 2047, 0, 2436 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2287 2437 static const struct wacom_features wacom_features_0x4001 = 2288 - { "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, 2289 - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2438 + { "Wacom ISDv4 4001", 26202, 16325, 255, 0, 2439 + MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2290 2440 static const struct wacom_features wacom_features_0x4004 = 2291 - { "Wacom ISDv4 4004", WACOM_PKGLEN_MTTPC, 11060, 6220, 255, 2292 - 0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2441 + { "Wacom ISDv4 4004", 11060, 6220, 255, 0, 2442 + MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2293 2443 static const struct wacom_features wacom_features_0x5000 = 2294 - { "Wacom ISDv4 5000", WACOM_PKGLEN_MTTPC, 27848, 15752, 1023, 2295 - 0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2444 + { "Wacom ISDv4 5000", 27848, 15752, 1023, 0, 2445 + MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2296 2446 static const struct wacom_features wacom_features_0x5002 = 2297 - { "Wacom ISDv4 5002", WACOM_PKGLEN_MTTPC, 29576, 16724, 1023, 2298 - 0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2447 + { "Wacom ISDv4 5002", 29576, 16724, 1023, 0, 2448 + MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2299 2449 static const struct wacom_features wacom_features_0x47 = 2300 - { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 2301 - 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2450 + { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31, 2451 + INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2302 2452 static const struct wacom_features wacom_features_0x84 = 2303 - { "Wacom Wireless Receiver", WACOM_PKGLEN_WIRELESS, 0, 0, 0, 2304 - 0, WIRELESS, 0, 0, .touch_max = 16 }; 2453 + { "Wacom Wireless Receiver", 0, 0, 0, 0, 2454 + WIRELESS, 0, 0, .touch_max = 16 }; 2305 2455 static const struct wacom_features wacom_features_0xD0 = 2306 - { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2307 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2308 - .touch_max = 2 }; 2456 + { "Wacom Bamboo 2FG", 14720, 9200, 1023, 31, 2457 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2309 2458 static const struct wacom_features wacom_features_0xD1 = 2310 - { "Wacom Bamboo 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2311 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2312 - .touch_max = 2 }; 2459 + { "Wacom Bamboo 2FG 4x5", 14720, 9200, 1023, 31, 2460 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2313 2461 static const struct wacom_features wacom_features_0xD2 = 2314 - { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2315 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2316 - .touch_max = 2 }; 2462 + { "Wacom Bamboo Craft", 14720, 9200, 1023, 31, 2463 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2317 2464 static const struct wacom_features wacom_features_0xD3 = 2318 - { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, 2319 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2320 - .touch_max = 2 }; 2465 + { "Wacom Bamboo 2FG 6x8", 21648, 13700, 1023, 31, 2466 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2321 2467 static const struct wacom_features wacom_features_0xD4 = 2322 - { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2323 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2468 + { "Wacom Bamboo Pen", 14720, 9200, 1023, 31, 2469 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2324 2470 static const struct wacom_features wacom_features_0xD5 = 2325 - { "Wacom Bamboo Pen 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, 2326 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2471 + { "Wacom Bamboo Pen 6x8", 21648, 13700, 1023, 31, 2472 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2327 2473 static const struct wacom_features wacom_features_0xD6 = 2328 - { "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2329 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2330 - .touch_max = 2 }; 2474 + { "Wacom BambooPT 2FG 4x5", 14720, 9200, 1023, 31, 2475 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2331 2476 static const struct wacom_features wacom_features_0xD7 = 2332 - { "Wacom BambooPT 2FG Small", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2333 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2334 - .touch_max = 2 }; 2477 + { "Wacom BambooPT 2FG Small", 14720, 9200, 1023, 31, 2478 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2335 2479 static const struct wacom_features wacom_features_0xD8 = 2336 - { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, 2337 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2338 - .touch_max = 2 }; 2480 + { "Wacom Bamboo Comic 2FG", 21648, 13700, 1023, 31, 2481 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2339 2482 static const struct wacom_features wacom_features_0xDA = 2340 - { "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 2341 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2342 - .touch_max = 2 }; 2483 + { "Wacom Bamboo 2FG 4x5 SE", 14720, 9200, 1023, 31, 2484 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2343 2485 static const struct wacom_features wacom_features_0xDB = 2344 - { "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, 2345 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2346 - .touch_max = 2 }; 2486 + { "Wacom Bamboo 2FG 6x8 SE", 21648, 13700, 1023, 31, 2487 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 }; 2347 2488 static const struct wacom_features wacom_features_0xDD = 2348 - { "Wacom Bamboo Connect", WACOM_PKGLEN_BBPEN, 14720, 9200, 1023, 2349 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2489 + { "Wacom Bamboo Connect", 14720, 9200, 1023, 31, 2490 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2350 2491 static const struct wacom_features wacom_features_0xDE = 2351 - { "Wacom Bamboo 16FG 4x5", WACOM_PKGLEN_BBPEN, 14720, 9200, 1023, 2352 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2353 - .touch_max = 16 }; 2492 + { "Wacom Bamboo 16FG 4x5", 14720, 9200, 1023, 31, 2493 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 }; 2354 2494 static const struct wacom_features wacom_features_0xDF = 2355 - { "Wacom Bamboo 16FG 6x8", WACOM_PKGLEN_BBPEN, 21648, 13700, 1023, 2356 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2357 - .touch_max = 16 }; 2495 + { "Wacom Bamboo 16FG 6x8", 21648, 13700, 1023, 31, 2496 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 }; 2358 2497 static const struct wacom_features wacom_features_0x300 = 2359 - { "Wacom Bamboo One S", WACOM_PKGLEN_BBPEN, 14720, 9225, 1023, 2360 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2498 + { "Wacom Bamboo One S", 14720, 9225, 1023, 31, 2499 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2361 2500 static const struct wacom_features wacom_features_0x301 = 2362 - { "Wacom Bamboo One M", WACOM_PKGLEN_BBPEN, 21648, 13530, 1023, 2363 - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2501 + { "Wacom Bamboo One M", 21648, 13530, 1023, 31, 2502 + BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2364 2503 static const struct wacom_features wacom_features_0x302 = 2365 - { "Wacom Intuos PT S", WACOM_PKGLEN_BBPEN, 15200, 9500, 1023, 2366 - 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2367 - .touch_max = 16 }; 2504 + { "Wacom Intuos PT S", 15200, 9500, 1023, 31, 2505 + INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16, 2506 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2368 2507 static const struct wacom_features wacom_features_0x303 = 2369 - { "Wacom Intuos PT M", WACOM_PKGLEN_BBPEN, 21600, 13500, 1023, 2370 - 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2371 - .touch_max = 16 }; 2508 + { "Wacom Intuos PT M", 21600, 13500, 1023, 31, 2509 + INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16, 2510 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2372 2511 static const struct wacom_features wacom_features_0x30E = 2373 - { "Wacom Intuos S", WACOM_PKGLEN_BBPEN, 15200, 9500, 1023, 2374 - 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2512 + { "Wacom Intuos S", 15200, 9500, 1023, 31, 2513 + INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 2514 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2375 2515 static const struct wacom_features wacom_features_0x6004 = 2376 - { "ISD-V4", WACOM_PKGLEN_GRAPHIRE, 12800, 8000, 255, 2377 - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2378 - static const struct wacom_features wacom_features_0x0307 = 2379 - { "Wacom ISDv5 307", WACOM_PKGLEN_INTUOS, 59352, 33648, 2047, 2380 - 63, CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2516 + { "ISD-V4", 12800, 8000, 255, 0, 2517 + TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 2518 + static const struct wacom_features wacom_features_0x307 = 2519 + { "Wacom ISDv5 307", 59352, 33648, 2047, 63, 2520 + CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 200, 200, 2381 2521 .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 }; 2382 - static const struct wacom_features wacom_features_0x0309 = 2522 + static const struct wacom_features wacom_features_0x309 = 2383 2523 { "Wacom ISDv5 309", .type = WACOM_24HDT, /* Touch */ 2384 - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10 }; 2524 + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10, 2525 + .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; 2385 2526 2386 - #define USB_DEVICE_WACOM(prod) \ 2387 - USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ 2388 - .driver_info = (kernel_ulong_t)&wacom_features_##prod 2527 + #define USB_DEVICE_WACOM(prod) \ 2528 + HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ 2529 + .driver_data = (kernel_ulong_t)&wacom_features_##prod 2389 2530 2390 - #define USB_DEVICE_DETAILED(prod, class, sub, proto) \ 2391 - USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_WACOM, prod, class, \ 2392 - sub, proto), \ 2393 - .driver_info = (kernel_ulong_t)&wacom_features_##prod 2531 + #define BT_DEVICE_WACOM(prod) \ 2532 + HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ 2533 + .driver_data = (kernel_ulong_t)&wacom_features_##prod 2394 2534 2395 2535 #define USB_DEVICE_LENOVO(prod) \ 2396 - USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \ 2397 - .driver_info = (kernel_ulong_t)&wacom_features_##prod 2536 + HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \ 2537 + .driver_data = (kernel_ulong_t)&wacom_features_##prod 2398 2538 2399 - const struct usb_device_id wacom_ids[] = { 2539 + const struct hid_device_id wacom_ids[] = { 2400 2540 { USB_DEVICE_WACOM(0x00) }, 2541 + { USB_DEVICE_WACOM(0x03) }, 2401 2542 { USB_DEVICE_WACOM(0x10) }, 2402 2543 { USB_DEVICE_WACOM(0x11) }, 2403 2544 { USB_DEVICE_WACOM(0x12) }, ··· 2599 2358 { USB_DEVICE_WACOM(0x17) }, 2600 2359 { USB_DEVICE_WACOM(0x18) }, 2601 2360 { USB_DEVICE_WACOM(0x19) }, 2602 - { USB_DEVICE_WACOM(0x60) }, 2603 - { USB_DEVICE_WACOM(0x61) }, 2604 - { USB_DEVICE_WACOM(0x62) }, 2605 - { USB_DEVICE_WACOM(0x63) }, 2606 - { USB_DEVICE_WACOM(0x64) }, 2607 - { USB_DEVICE_WACOM(0x65) }, 2608 - { USB_DEVICE_WACOM(0x69) }, 2609 - { USB_DEVICE_WACOM(0x6A) }, 2610 - { USB_DEVICE_WACOM(0x6B) }, 2611 2361 { USB_DEVICE_WACOM(0x20) }, 2612 2362 { USB_DEVICE_WACOM(0x21) }, 2613 2363 { USB_DEVICE_WACOM(0x22) }, 2614 2364 { USB_DEVICE_WACOM(0x23) }, 2615 2365 { USB_DEVICE_WACOM(0x24) }, 2366 + { USB_DEVICE_WACOM(0x26) }, 2367 + { USB_DEVICE_WACOM(0x27) }, 2368 + { USB_DEVICE_WACOM(0x28) }, 2369 + { USB_DEVICE_WACOM(0x29) }, 2370 + { USB_DEVICE_WACOM(0x2A) }, 2616 2371 { USB_DEVICE_WACOM(0x30) }, 2617 2372 { USB_DEVICE_WACOM(0x31) }, 2618 2373 { USB_DEVICE_WACOM(0x32) }, ··· 2618 2381 { USB_DEVICE_WACOM(0x37) }, 2619 2382 { USB_DEVICE_WACOM(0x38) }, 2620 2383 { USB_DEVICE_WACOM(0x39) }, 2621 - { USB_DEVICE_WACOM(0xC4) }, 2622 - { USB_DEVICE_WACOM(0xC0) }, 2623 - { USB_DEVICE_WACOM(0xC2) }, 2624 - { USB_DEVICE_WACOM(0x03) }, 2384 + { USB_DEVICE_WACOM(0x3F) }, 2625 2385 { USB_DEVICE_WACOM(0x41) }, 2626 2386 { USB_DEVICE_WACOM(0x42) }, 2627 2387 { USB_DEVICE_WACOM(0x43) }, 2628 2388 { USB_DEVICE_WACOM(0x44) }, 2629 2389 { USB_DEVICE_WACOM(0x45) }, 2390 + { USB_DEVICE_WACOM(0x47) }, 2630 2391 { USB_DEVICE_WACOM(0x57) }, 2631 2392 { USB_DEVICE_WACOM(0x59) }, 2632 - { USB_DEVICE_DETAILED(0x5D, USB_CLASS_HID, 0, 0) }, 2633 2393 { USB_DEVICE_WACOM(0x5B) }, 2634 - { USB_DEVICE_DETAILED(0x5E, USB_CLASS_HID, 0, 0) }, 2394 + { USB_DEVICE_WACOM(0x5D) }, 2395 + { USB_DEVICE_WACOM(0x5E) }, 2396 + { USB_DEVICE_WACOM(0x60) }, 2397 + { USB_DEVICE_WACOM(0x61) }, 2398 + { USB_DEVICE_WACOM(0x62) }, 2399 + { USB_DEVICE_WACOM(0x63) }, 2400 + { USB_DEVICE_WACOM(0x64) }, 2401 + { USB_DEVICE_WACOM(0x65) }, 2402 + { USB_DEVICE_WACOM(0x69) }, 2403 + { USB_DEVICE_WACOM(0x6A) }, 2404 + { USB_DEVICE_WACOM(0x6B) }, 2405 + { BT_DEVICE_WACOM(0x81) }, 2406 + { USB_DEVICE_WACOM(0x84) }, 2407 + { USB_DEVICE_WACOM(0x90) }, 2408 + { USB_DEVICE_WACOM(0x93) }, 2409 + { USB_DEVICE_WACOM(0x97) }, 2410 + { USB_DEVICE_WACOM(0x9A) }, 2411 + { USB_DEVICE_WACOM(0x9F) }, 2635 2412 { USB_DEVICE_WACOM(0xB0) }, 2636 2413 { USB_DEVICE_WACOM(0xB1) }, 2637 2414 { USB_DEVICE_WACOM(0xB2) }, ··· 2658 2407 { USB_DEVICE_WACOM(0xBA) }, 2659 2408 { USB_DEVICE_WACOM(0xBB) }, 2660 2409 { USB_DEVICE_WACOM(0xBC) }, 2661 - { USB_DEVICE_WACOM(0x26) }, 2662 - { USB_DEVICE_WACOM(0x27) }, 2663 - { USB_DEVICE_WACOM(0x28) }, 2664 - { USB_DEVICE_WACOM(0x29) }, 2665 - { USB_DEVICE_WACOM(0x2A) }, 2666 - { USB_DEVICE_WACOM(0x3F) }, 2410 + { BT_DEVICE_WACOM(0xBD) }, 2411 + { USB_DEVICE_WACOM(0xC0) }, 2412 + { USB_DEVICE_WACOM(0xC2) }, 2413 + { USB_DEVICE_WACOM(0xC4) }, 2667 2414 { USB_DEVICE_WACOM(0xC5) }, 2668 2415 { USB_DEVICE_WACOM(0xC6) }, 2669 2416 { USB_DEVICE_WACOM(0xC7) }, 2670 - /* 2671 - * DTU-2231 has two interfaces on the same configuration, 2672 - * only one is used. 2673 - */ 2674 - { USB_DEVICE_DETAILED(0xCE, USB_CLASS_HID, 2675 - USB_INTERFACE_SUBCLASS_BOOT, 2676 - USB_INTERFACE_PROTOCOL_MOUSE) }, 2677 - { USB_DEVICE_WACOM(0x84) }, 2417 + { USB_DEVICE_WACOM(0xCC) }, 2418 + { USB_DEVICE_WACOM(0xCE) }, 2678 2419 { USB_DEVICE_WACOM(0xD0) }, 2679 2420 { USB_DEVICE_WACOM(0xD1) }, 2680 2421 { USB_DEVICE_WACOM(0xD2) }, ··· 2681 2438 { USB_DEVICE_WACOM(0xDD) }, 2682 2439 { USB_DEVICE_WACOM(0xDE) }, 2683 2440 { USB_DEVICE_WACOM(0xDF) }, 2684 - { USB_DEVICE_WACOM(0xF0) }, 2685 - { USB_DEVICE_WACOM(0xCC) }, 2686 - { USB_DEVICE_WACOM(0x90) }, 2687 - { USB_DEVICE_WACOM(0x93) }, 2688 - { USB_DEVICE_WACOM(0x97) }, 2689 - { USB_DEVICE_WACOM(0x9A) }, 2690 - { USB_DEVICE_WACOM(0x9F) }, 2691 2441 { USB_DEVICE_WACOM(0xE2) }, 2692 2442 { USB_DEVICE_WACOM(0xE3) }, 2693 2443 { USB_DEVICE_WACOM(0xE5) }, ··· 2688 2452 { USB_DEVICE_WACOM(0xEC) }, 2689 2453 { USB_DEVICE_WACOM(0xED) }, 2690 2454 { USB_DEVICE_WACOM(0xEF) }, 2455 + { USB_DEVICE_WACOM(0xF0) }, 2456 + { USB_DEVICE_WACOM(0xF4) }, 2457 + { USB_DEVICE_WACOM(0xF6) }, 2458 + { USB_DEVICE_WACOM(0xF8) }, 2459 + { USB_DEVICE_WACOM(0xFA) }, 2460 + { USB_DEVICE_WACOM(0xFB) }, 2691 2461 { USB_DEVICE_WACOM(0x100) }, 2692 2462 { USB_DEVICE_WACOM(0x101) }, 2693 2463 { USB_DEVICE_WACOM(0x10D) }, 2694 2464 { USB_DEVICE_WACOM(0x10E) }, 2695 2465 { USB_DEVICE_WACOM(0x10F) }, 2696 2466 { USB_DEVICE_WACOM(0x116) }, 2467 + { USB_DEVICE_WACOM(0x12C) }, 2697 2468 { USB_DEVICE_WACOM(0x300) }, 2698 2469 { USB_DEVICE_WACOM(0x301) }, 2699 - { USB_DEVICE_DETAILED(0x302, USB_CLASS_HID, 0, 0) }, 2700 - { USB_DEVICE_DETAILED(0x303, USB_CLASS_HID, 0, 0) }, 2701 - { USB_DEVICE_DETAILED(0x30E, USB_CLASS_HID, 0, 0) }, 2470 + { USB_DEVICE_WACOM(0x302) }, 2471 + { USB_DEVICE_WACOM(0x303) }, 2702 2472 { USB_DEVICE_WACOM(0x304) }, 2703 - { USB_DEVICE_DETAILED(0x314, USB_CLASS_HID, 0, 0) }, 2704 - { USB_DEVICE_DETAILED(0x315, USB_CLASS_HID, 0, 0) }, 2705 - { USB_DEVICE_DETAILED(0x317, USB_CLASS_HID, 0, 0) }, 2473 + { USB_DEVICE_WACOM(0x307) }, 2474 + { USB_DEVICE_WACOM(0x309) }, 2475 + { USB_DEVICE_WACOM(0x30E) }, 2476 + { USB_DEVICE_WACOM(0x314) }, 2477 + { USB_DEVICE_WACOM(0x315) }, 2478 + { USB_DEVICE_WACOM(0x317) }, 2706 2479 { USB_DEVICE_WACOM(0x4001) }, 2707 2480 { USB_DEVICE_WACOM(0x4004) }, 2708 2481 { USB_DEVICE_WACOM(0x5000) }, 2709 2482 { USB_DEVICE_WACOM(0x5002) }, 2710 - { USB_DEVICE_WACOM(0x47) }, 2711 - { USB_DEVICE_WACOM(0xF4) }, 2712 - { USB_DEVICE_WACOM(0xF8) }, 2713 - { USB_DEVICE_DETAILED(0xF6, USB_CLASS_HID, 0, 0) }, 2714 - { USB_DEVICE_WACOM(0xFA) }, 2715 - { USB_DEVICE_WACOM(0xFB) }, 2716 - { USB_DEVICE_WACOM(0x0307) }, 2717 - { USB_DEVICE_DETAILED(0x0309, USB_CLASS_HID, 0, 0) }, 2718 - { USB_DEVICE_LENOVO(0x6004) }, 2719 2483 { } 2720 2484 }; 2721 - MODULE_DEVICE_TABLE(usb, wacom_ids); 2485 + MODULE_DEVICE_TABLE(hid, wacom_ids);
+18 -4
drivers/input/tablet/wacom_wac.h drivers/hid/wacom_wac.h
··· 46 46 47 47 /* wacom data packet report IDs */ 48 48 #define WACOM_REPORT_PENABLED 2 49 + #define WACOM_REPORT_PENABLED_BT 3 49 50 #define WACOM_REPORT_INTUOSREAD 5 50 51 #define WACOM_REPORT_INTUOSWRITE 6 51 52 #define WACOM_REPORT_INTUOSPAD 12 ··· 69 68 #define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002 70 69 #define WACOM_QUIRK_NO_INPUT 0x0004 71 70 #define WACOM_QUIRK_MONITOR 0x0008 71 + #define WACOM_QUIRK_BATTERY 0x0010 72 72 73 73 enum { 74 74 PENPARTNER = 0, 75 75 GRAPHIRE, 76 + GRAPHIRE_BT, 76 77 WACOM_G4, 77 78 PTU, 78 79 PL, ··· 86 83 INTUOS3L, 87 84 INTUOS4S, 88 85 INTUOS4, 86 + INTUOS4WL, 89 87 INTUOS4L, 90 88 INTUOS5S, 91 89 INTUOS5, ··· 118 114 119 115 struct wacom_features { 120 116 const char *name; 121 - int pktlen; 122 117 int x_max; 123 118 int y_max; 124 119 int pressure_max; ··· 130 127 int device_type; 131 128 int x_phy; 132 129 int y_phy; 133 - unsigned char unit; 134 - unsigned char unitExpo; 130 + unsigned unit; 131 + int unitExpo; 135 132 int x_fuzz; 136 133 int y_fuzz; 137 134 int pressure_fuzz; ··· 140 137 unsigned touch_max; 141 138 int oVid; 142 139 int oPid; 140 + int pktlen; 141 + bool check_for_hid_type; 142 + int hid_type; 143 143 }; 144 144 145 145 struct wacom_shared { ··· 156 150 157 151 struct wacom_wac { 158 152 char name[WACOM_NAME_MAX]; 159 - unsigned char *data; 153 + char pad_name[WACOM_NAME_MAX]; 154 + char bat_name[WACOM_NAME_MAX]; 155 + char ac_name[WACOM_NAME_MAX]; 156 + unsigned char data[WACOM_PKGLEN_MAX]; 160 157 int tool[2]; 161 158 int id[2]; 162 159 __u32 serial[2]; 163 160 struct wacom_features features; 164 161 struct wacom_shared *shared; 165 162 struct input_dev *input; 163 + struct input_dev *pad_input; 166 164 int pid; 167 165 int battery_capacity; 168 166 int num_contacts_left; 167 + int bat_charging; 168 + int ps_connected; 169 + u8 bt_features; 170 + u8 bt_high_speed; 169 171 }; 170 172 171 173 #endif
+12
drivers/input/touchscreen/Kconfig
··· 471 471 To compile this driver as a module, choose M here: the 472 472 module will be called jornada720_ts. 473 473 474 + config TOUCHSCREEN_IPAQ_MICRO 475 + tristate "HP iPAQ Atmel Micro ASIC touchscreen" 476 + depends on MFD_IPAQ_MICRO 477 + help 478 + Say Y here to enable support for the touchscreen attached to 479 + the Atmel Micro peripheral controller on iPAQ h3100/h3600/h3700 480 + 481 + If unsure, say N. 482 + 483 + To compile this driver as a module, choose M here: the 484 + module will be called ipaq-micro-ts. 485 + 474 486 config TOUCHSCREEN_HTCPEN 475 487 tristate "HTC Shift X9500 touchscreen" 476 488 depends on ISA
+1
drivers/input/touchscreen/Makefile
··· 46 46 obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o 47 47 obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o 48 48 obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o 49 + obj-$(CONFIG_TOUCHSCREEN_IPAQ_MICRO) += ipaq-micro-ts.o 49 50 obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o 50 51 obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o 51 52 obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o
+4 -2
drivers/input/touchscreen/ads7846.c
··· 1302 1302 pdata = dev_get_platdata(&spi->dev); 1303 1303 if (!pdata) { 1304 1304 pdata = ads7846_probe_dt(&spi->dev); 1305 - if (IS_ERR(pdata)) 1306 - return PTR_ERR(pdata); 1305 + if (IS_ERR(pdata)) { 1306 + err = PTR_ERR(pdata); 1307 + goto err_free_mem; 1308 + } 1307 1309 } 1308 1310 1309 1311 ts->model = pdata->model ? : 7846;
+998 -345
drivers/input/touchscreen/atmel_mxt_ts.c
··· 2 2 * Atmel maXTouch Touchscreen driver 3 3 * 4 4 * Copyright (C) 2010 Samsung Electronics Co.Ltd 5 + * Copyright (C) 2011-2014 Atmel Corporation 5 6 * Copyright (C) 2012 Google, Inc. 6 7 * 7 8 * Author: Joonyoung Shim <jy0922.shim@samsung.com> ··· 23 22 #include <linux/i2c/atmel_mxt_ts.h> 24 23 #include <linux/input/mt.h> 25 24 #include <linux/interrupt.h> 25 + #include <linux/of.h> 26 26 #include <linux/slab.h> 27 27 28 28 /* Version */ ··· 31 29 #define MXT_VER_21 21 32 30 #define MXT_VER_22 22 33 31 34 - /* Firmware */ 32 + /* Firmware files */ 35 33 #define MXT_FW_NAME "maxtouch.fw" 34 + #define MXT_CFG_NAME "maxtouch.cfg" 35 + #define MXT_CFG_MAGIC "OBP_RAW V1" 36 36 37 37 /* Registers */ 38 38 #define MXT_INFO 0x00 ··· 48 44 #define MXT_OBJECT_START 0x07 49 45 50 46 #define MXT_OBJECT_SIZE 6 47 + #define MXT_INFO_CHECKSUM_SIZE 3 48 + #define MXT_MAX_BLOCK_WRITE 256 51 49 52 50 /* Object types */ 53 51 #define MXT_DEBUG_DIAGNOSTIC_T37 37 ··· 80 74 #define MXT_SPT_MESSAGECOUNT_T44 44 81 75 #define MXT_SPT_CTECONFIG_T46 46 82 76 77 + /* MXT_GEN_MESSAGE_T5 object */ 78 + #define MXT_RPTID_NOMSG 0xff 79 + 83 80 /* MXT_GEN_COMMAND_T6 field */ 84 81 #define MXT_COMMAND_RESET 0 85 82 #define MXT_COMMAND_BACKUPNV 1 ··· 92 83 93 84 /* Define for T6 status byte */ 94 85 #define MXT_T6_STATUS_RESET (1 << 7) 86 + #define MXT_T6_STATUS_OFL (1 << 6) 87 + #define MXT_T6_STATUS_SIGERR (1 << 5) 88 + #define MXT_T6_STATUS_CAL (1 << 4) 89 + #define MXT_T6_STATUS_CFGERR (1 << 3) 90 + #define MXT_T6_STATUS_COMSERR (1 << 2) 95 91 96 92 /* MXT_GEN_POWER_T7 field */ 97 - #define MXT_POWER_IDLEACQINT 0 98 - #define MXT_POWER_ACTVACQINT 1 99 - #define MXT_POWER_ACTV2IDLETO 2 93 + struct t7_config { 94 + u8 idle; 95 + u8 active; 96 + } __packed; 97 + 98 + #define MXT_POWER_CFG_RUN 0 99 + #define MXT_POWER_CFG_DEEPSLEEP 1 100 100 101 101 /* MXT_GEN_ACQUIRE_T8 field */ 102 102 #define MXT_ACQUIRE_CHRGTIME 0 ··· 117 99 #define MXT_ACQUIRE_ATCHCALSTHR 7 118 100 119 101 /* MXT_TOUCH_MULTI_T9 field */ 120 - #define MXT_TOUCH_CTRL 0 121 102 #define MXT_T9_ORIENT 9 122 103 #define MXT_T9_RANGE 18 123 104 ··· 234 217 u8 num_report_ids; 235 218 } __packed; 236 219 237 - struct mxt_message { 238 - u8 reportid; 239 - u8 message[7]; 240 - }; 241 - 242 220 /* Each client has this additional data */ 243 221 struct mxt_data { 244 222 struct i2c_client *client; ··· 246 234 unsigned int max_x; 247 235 unsigned int max_y; 248 236 bool in_bootloader; 237 + u16 mem_size; 238 + u8 max_reportid; 249 239 u32 config_crc; 240 + u32 info_crc; 250 241 u8 bootloader_addr; 242 + u8 *msg_buf; 243 + u8 t6_status; 244 + bool update_input; 245 + u8 last_message_count; 246 + u8 num_touchids; 247 + struct t7_config t7_cfg; 251 248 252 249 /* Cached parameters from object table */ 250 + u16 T5_address; 251 + u8 T5_msg_size; 253 252 u8 T6_reportid; 254 253 u16 T6_address; 254 + u16 T7_address; 255 255 u8 T9_reportid_min; 256 256 u8 T9_reportid_max; 257 257 u8 T19_reportid; 258 + u16 T44_address; 258 259 259 260 /* for fw update in bootloader */ 260 261 struct completion bl_completion; ··· 322 297 } 323 298 } 324 299 325 - static bool mxt_object_writable(unsigned int type) 300 + static void mxt_dump_message(struct mxt_data *data, u8 *message) 326 301 { 327 - switch (type) { 328 - case MXT_GEN_COMMAND_T6: 329 - case MXT_GEN_POWER_T7: 330 - case MXT_GEN_ACQUIRE_T8: 331 - case MXT_TOUCH_MULTI_T9: 332 - case MXT_TOUCH_KEYARRAY_T15: 333 - case MXT_TOUCH_PROXIMITY_T23: 334 - case MXT_TOUCH_PROXKEY_T52: 335 - case MXT_PROCI_GRIPFACE_T20: 336 - case MXT_PROCG_NOISE_T22: 337 - case MXT_PROCI_ONETOUCH_T24: 338 - case MXT_PROCI_TWOTOUCH_T27: 339 - case MXT_PROCI_GRIP_T40: 340 - case MXT_PROCI_PALM_T41: 341 - case MXT_PROCI_TOUCHSUPPRESSION_T42: 342 - case MXT_PROCI_STYLUS_T47: 343 - case MXT_PROCG_NOISESUPPRESSION_T48: 344 - case MXT_SPT_COMMSCONFIG_T18: 345 - case MXT_SPT_GPIOPWM_T19: 346 - case MXT_SPT_SELFTEST_T25: 347 - case MXT_SPT_CTECONFIG_T28: 348 - case MXT_SPT_DIGITIZER_T43: 349 - case MXT_SPT_CTECONFIG_T46: 350 - return true; 351 - default: 352 - return false; 353 - } 354 - } 355 - 356 - static void mxt_dump_message(struct device *dev, 357 - struct mxt_message *message) 358 - { 359 - dev_dbg(dev, "reportid: %u\tmessage: %*ph\n", 360 - message->reportid, 7, message->message); 302 + dev_dbg(&data->client->dev, "message: %*ph\n", 303 + data->T5_msg_size, message); 361 304 } 362 305 363 306 static int mxt_wait_for_completion(struct mxt_data *data, ··· 394 401 return ret; 395 402 } 396 403 397 - static int mxt_lookup_bootloader_address(struct mxt_data *data) 404 + static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry) 398 405 { 399 406 u8 appmode = data->client->addr; 400 407 u8 bootloader; ··· 402 409 switch (appmode) { 403 410 case 0x4a: 404 411 case 0x4b: 412 + /* Chips after 1664S use different scheme */ 413 + if (retry || data->info.family_id >= 0xa2) { 414 + bootloader = appmode - 0x24; 415 + break; 416 + } 417 + /* Fall through for normal case */ 405 418 case 0x4c: 406 419 case 0x4d: 407 420 case 0x5a: ··· 422 423 } 423 424 424 425 data->bootloader_addr = bootloader; 426 + return 0; 427 + } 428 + 429 + static int mxt_probe_bootloader(struct mxt_data *data, bool retry) 430 + { 431 + struct device *dev = &data->client->dev; 432 + int ret; 433 + u8 val; 434 + bool crc_failure; 435 + 436 + ret = mxt_lookup_bootloader_address(data, retry); 437 + if (ret) 438 + return ret; 439 + 440 + ret = mxt_bootloader_read(data, &val, 1); 441 + if (ret) 442 + return ret; 443 + 444 + /* Check app crc fail mode */ 445 + crc_failure = (val & ~MXT_BOOT_STATUS_MASK) == MXT_APP_CRC_FAIL; 446 + 447 + dev_err(dev, "Detected bootloader, status:%02X%s\n", 448 + val, crc_failure ? ", APP_CRC_FAIL" : ""); 449 + 425 450 return 0; 426 451 } 427 452 ··· 470 447 } 471 448 } 472 449 473 - static int mxt_check_bootloader(struct mxt_data *data, unsigned int state) 450 + static int mxt_check_bootloader(struct mxt_data *data, unsigned int state, 451 + bool wait) 474 452 { 475 453 struct device *dev = &data->client->dev; 476 454 u8 val; 477 455 int ret; 478 456 479 457 recheck: 480 - if (state != MXT_WAITING_BOOTLOAD_CMD) { 458 + if (wait) { 481 459 /* 482 460 * In application update mode, the interrupt 483 461 * line signals state transitions. We must wait for the ··· 509 485 switch (state) { 510 486 case MXT_WAITING_BOOTLOAD_CMD: 511 487 case MXT_WAITING_FRAME_DATA: 488 + case MXT_APP_CRC_FAIL: 512 489 val &= ~MXT_BOOT_STATUS_MASK; 513 490 break; 514 491 case MXT_FRAME_CRC_PASS: ··· 533 508 return 0; 534 509 } 535 510 536 - static int mxt_unlock_bootloader(struct mxt_data *data) 511 + static int mxt_send_bootloader_cmd(struct mxt_data *data, bool unlock) 537 512 { 538 513 int ret; 539 514 u8 buf[2]; 540 515 541 - buf[0] = MXT_UNLOCK_CMD_LSB; 542 - buf[1] = MXT_UNLOCK_CMD_MSB; 516 + if (unlock) { 517 + buf[0] = MXT_UNLOCK_CMD_LSB; 518 + buf[1] = MXT_UNLOCK_CMD_MSB; 519 + } else { 520 + buf[0] = 0x01; 521 + buf[1] = 0x01; 522 + } 543 523 544 524 ret = mxt_bootloader_write(data, buf, 2); 545 525 if (ret) ··· 635 605 return object; 636 606 } 637 607 638 - dev_err(&data->client->dev, "Invalid object type T%u\n", type); 608 + dev_warn(&data->client->dev, "Invalid object type T%u\n", type); 639 609 return NULL; 640 610 } 641 611 642 - static int mxt_read_message(struct mxt_data *data, 643 - struct mxt_message *message) 612 + static void mxt_proc_t6_messages(struct mxt_data *data, u8 *msg) 644 613 { 645 - struct mxt_object *object; 646 - u16 reg; 614 + struct device *dev = &data->client->dev; 615 + u8 status = msg[1]; 616 + u32 crc = msg[2] | (msg[3] << 8) | (msg[4] << 16); 647 617 648 - object = mxt_get_object(data, MXT_GEN_MESSAGE_T5); 649 - if (!object) 650 - return -EINVAL; 618 + complete(&data->crc_completion); 651 619 652 - reg = object->start_address; 653 - return __mxt_read_reg(data->client, reg, 654 - sizeof(struct mxt_message), message); 620 + if (crc != data->config_crc) { 621 + data->config_crc = crc; 622 + dev_dbg(dev, "T6 Config Checksum: 0x%06X\n", crc); 623 + } 624 + 625 + /* Detect reset */ 626 + if (status & MXT_T6_STATUS_RESET) 627 + complete(&data->reset_completion); 628 + 629 + /* Output debug if status has changed */ 630 + if (status != data->t6_status) 631 + dev_dbg(dev, "T6 Status 0x%02X%s%s%s%s%s%s%s\n", 632 + status, 633 + status == 0 ? " OK" : "", 634 + status & MXT_T6_STATUS_RESET ? " RESET" : "", 635 + status & MXT_T6_STATUS_OFL ? " OFL" : "", 636 + status & MXT_T6_STATUS_SIGERR ? " SIGERR" : "", 637 + status & MXT_T6_STATUS_CAL ? " CAL" : "", 638 + status & MXT_T6_STATUS_CFGERR ? " CFGERR" : "", 639 + status & MXT_T6_STATUS_COMSERR ? " COMSERR" : ""); 640 + 641 + /* Save current status */ 642 + data->t6_status = status; 655 643 } 656 644 657 - static int mxt_write_object(struct mxt_data *data, 658 - u8 type, u8 offset, u8 val) 659 - { 660 - struct mxt_object *object; 661 - u16 reg; 662 - 663 - object = mxt_get_object(data, type); 664 - if (!object || offset >= mxt_obj_size(object)) 665 - return -EINVAL; 666 - 667 - reg = object->start_address; 668 - return mxt_write_reg(data->client, reg + offset, val); 669 - } 670 - 671 - static void mxt_input_button(struct mxt_data *data, struct mxt_message *message) 645 + static void mxt_input_button(struct mxt_data *data, u8 *message) 672 646 { 673 647 struct input_dev *input = data->input_dev; 674 648 const struct mxt_platform_data *pdata = data->pdata; ··· 683 649 for (i = 0; i < pdata->t19_num_keys; i++) { 684 650 if (pdata->t19_keymap[i] == KEY_RESERVED) 685 651 continue; 686 - button = !(message->message[0] & (1 << i)); 652 + button = !(message[1] & (1 << i)); 687 653 input_report_key(input, pdata->t19_keymap[i], button); 688 654 } 689 655 } 690 656 691 - static void mxt_input_sync(struct input_dev *input_dev) 657 + static void mxt_input_sync(struct mxt_data *data) 692 658 { 693 - input_mt_report_pointer_emulation(input_dev, false); 694 - input_sync(input_dev); 659 + input_mt_report_pointer_emulation(data->input_dev, 660 + data->pdata->t19_num_keys); 661 + input_sync(data->input_dev); 695 662 } 696 663 697 - static void mxt_input_touchevent(struct mxt_data *data, 698 - struct mxt_message *message, int id) 664 + static void mxt_proc_t9_message(struct mxt_data *data, u8 *message) 699 665 { 700 666 struct device *dev = &data->client->dev; 701 - u8 status = message->message[0]; 702 667 struct input_dev *input_dev = data->input_dev; 668 + int id; 669 + u8 status; 703 670 int x; 704 671 int y; 705 672 int area; 706 673 int amplitude; 707 674 708 - x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf); 709 - y = (message->message[2] << 4) | ((message->message[3] & 0xf)); 675 + id = message[0] - data->T9_reportid_min; 676 + status = message[1]; 677 + x = (message[2] << 4) | ((message[4] >> 4) & 0xf); 678 + y = (message[3] << 4) | ((message[4] & 0xf)); 710 679 711 680 /* Handle 10/12 bit switching */ 712 681 if (data->max_x < 1024) ··· 717 680 if (data->max_y < 1024) 718 681 y >>= 2; 719 682 720 - area = message->message[4]; 721 - amplitude = message->message[5]; 683 + area = message[5]; 684 + amplitude = message[6]; 722 685 723 686 dev_dbg(dev, 724 687 "[%u] %c%c%c%c%c%c%c%c x: %5u y: %5u area: %3u amp: %3u\n", ··· 744 707 if (status & MXT_T9_RELEASE) { 745 708 input_mt_report_slot_state(input_dev, 746 709 MT_TOOL_FINGER, 0); 747 - mxt_input_sync(input_dev); 710 + mxt_input_sync(data); 748 711 } 749 712 750 713 /* Touch active */ ··· 757 720 /* Touch no longer active, close out slot */ 758 721 input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, 0); 759 722 } 723 + 724 + data->update_input = true; 760 725 } 761 726 762 - static u16 mxt_extract_T6_csum(const u8 *csum) 727 + static int mxt_proc_message(struct mxt_data *data, u8 *message) 763 728 { 764 - return csum[0] | (csum[1] << 8) | (csum[2] << 16); 729 + u8 report_id = message[0]; 730 + 731 + if (report_id == MXT_RPTID_NOMSG) 732 + return 0; 733 + 734 + if (report_id == data->T6_reportid) { 735 + mxt_proc_t6_messages(data, message); 736 + } else if (!data->input_dev) { 737 + /* 738 + * Do not report events if input device 739 + * is not yet registered. 740 + */ 741 + mxt_dump_message(data, message); 742 + } else if (report_id >= data->T9_reportid_min 743 + && report_id <= data->T9_reportid_max) { 744 + mxt_proc_t9_message(data, message); 745 + } else if (report_id == data->T19_reportid) { 746 + mxt_input_button(data, message); 747 + data->update_input = true; 748 + } else { 749 + mxt_dump_message(data, message); 750 + } 751 + 752 + return 1; 765 753 } 766 754 767 - static bool mxt_is_T9_message(struct mxt_data *data, struct mxt_message *msg) 755 + static int mxt_read_and_process_messages(struct mxt_data *data, u8 count) 768 756 { 769 - u8 id = msg->reportid; 770 - return (id >= data->T9_reportid_min && id <= data->T9_reportid_max); 771 - } 772 - 773 - static irqreturn_t mxt_process_messages_until_invalid(struct mxt_data *data) 774 - { 775 - struct mxt_message message; 776 - const u8 *payload = &message.message[0]; 777 757 struct device *dev = &data->client->dev; 778 - u8 reportid; 779 - bool update_input = false; 780 - u32 crc; 758 + int ret; 759 + int i; 760 + u8 num_valid = 0; 781 761 762 + /* Safety check for msg_buf */ 763 + if (count > data->max_reportid) 764 + return -EINVAL; 765 + 766 + /* Process remaining messages if necessary */ 767 + ret = __mxt_read_reg(data->client, data->T5_address, 768 + data->T5_msg_size * count, data->msg_buf); 769 + if (ret) { 770 + dev_err(dev, "Failed to read %u messages (%d)\n", count, ret); 771 + return ret; 772 + } 773 + 774 + for (i = 0; i < count; i++) { 775 + ret = mxt_proc_message(data, 776 + data->msg_buf + data->T5_msg_size * i); 777 + 778 + if (ret == 1) 779 + num_valid++; 780 + } 781 + 782 + /* return number of messages read */ 783 + return num_valid; 784 + } 785 + 786 + static irqreturn_t mxt_process_messages_t44(struct mxt_data *data) 787 + { 788 + struct device *dev = &data->client->dev; 789 + int ret; 790 + u8 count, num_left; 791 + 792 + /* Read T44 and T5 together */ 793 + ret = __mxt_read_reg(data->client, data->T44_address, 794 + data->T5_msg_size + 1, data->msg_buf); 795 + if (ret) { 796 + dev_err(dev, "Failed to read T44 and T5 (%d)\n", ret); 797 + return IRQ_NONE; 798 + } 799 + 800 + count = data->msg_buf[0]; 801 + 802 + if (count == 0) { 803 + dev_warn(dev, "Interrupt triggered but zero messages\n"); 804 + return IRQ_NONE; 805 + } else if (count > data->max_reportid) { 806 + dev_err(dev, "T44 count %d exceeded max report id\n", count); 807 + count = data->max_reportid; 808 + } 809 + 810 + /* Process first message */ 811 + ret = mxt_proc_message(data, data->msg_buf + 1); 812 + if (ret < 0) { 813 + dev_warn(dev, "Unexpected invalid message\n"); 814 + return IRQ_NONE; 815 + } 816 + 817 + num_left = count - 1; 818 + 819 + /* Process remaining messages if necessary */ 820 + if (num_left) { 821 + ret = mxt_read_and_process_messages(data, num_left); 822 + if (ret < 0) 823 + goto end; 824 + else if (ret != num_left) 825 + dev_warn(dev, "Unexpected invalid message\n"); 826 + } 827 + 828 + end: 829 + if (data->update_input) { 830 + mxt_input_sync(data); 831 + data->update_input = false; 832 + } 833 + 834 + return IRQ_HANDLED; 835 + } 836 + 837 + static int mxt_process_messages_until_invalid(struct mxt_data *data) 838 + { 839 + struct device *dev = &data->client->dev; 840 + int count, read; 841 + u8 tries = 2; 842 + 843 + count = data->max_reportid; 844 + 845 + /* Read messages until we force an invalid */ 782 846 do { 783 - if (mxt_read_message(data, &message)) { 784 - dev_err(dev, "Failed to read message\n"); 847 + read = mxt_read_and_process_messages(data, count); 848 + if (read < count) 849 + return 0; 850 + } while (--tries); 851 + 852 + if (data->update_input) { 853 + mxt_input_sync(data); 854 + data->update_input = false; 855 + } 856 + 857 + dev_err(dev, "CHG pin isn't cleared\n"); 858 + return -EBUSY; 859 + } 860 + 861 + static irqreturn_t mxt_process_messages(struct mxt_data *data) 862 + { 863 + int total_handled, num_handled; 864 + u8 count = data->last_message_count; 865 + 866 + if (count < 1 || count > data->max_reportid) 867 + count = 1; 868 + 869 + /* include final invalid message */ 870 + total_handled = mxt_read_and_process_messages(data, count + 1); 871 + if (total_handled < 0) 872 + return IRQ_NONE; 873 + /* if there were invalid messages, then we are done */ 874 + else if (total_handled <= count) 875 + goto update_count; 876 + 877 + /* keep reading two msgs until one is invalid or reportid limit */ 878 + do { 879 + num_handled = mxt_read_and_process_messages(data, 2); 880 + if (num_handled < 0) 785 881 return IRQ_NONE; 786 - } 787 882 788 - reportid = message.reportid; 883 + total_handled += num_handled; 789 884 790 - if (reportid == data->T6_reportid) { 791 - u8 status = payload[0]; 885 + if (num_handled < 2) 886 + break; 887 + } while (total_handled < data->num_touchids); 792 888 793 - crc = mxt_extract_T6_csum(&payload[1]); 794 - if (crc != data->config_crc) { 795 - data->config_crc = crc; 796 - complete(&data->crc_completion); 797 - } 889 + update_count: 890 + data->last_message_count = total_handled; 798 891 799 - dev_dbg(dev, "Status: %02x Config Checksum: %06x\n", 800 - status, data->config_crc); 801 - 802 - if (status & MXT_T6_STATUS_RESET) 803 - complete(&data->reset_completion); 804 - } else if (mxt_is_T9_message(data, &message)) { 805 - int id = reportid - data->T9_reportid_min; 806 - mxt_input_touchevent(data, &message, id); 807 - update_input = true; 808 - } else if (message.reportid == data->T19_reportid) { 809 - mxt_input_button(data, &message); 810 - update_input = true; 811 - } else { 812 - mxt_dump_message(dev, &message); 813 - } 814 - } while (reportid != 0xff); 815 - 816 - if (update_input) 817 - mxt_input_sync(data->input_dev); 892 + if (data->update_input) { 893 + mxt_input_sync(data); 894 + data->update_input = false; 895 + } 818 896 819 897 return IRQ_HANDLED; 820 898 } ··· 944 792 return IRQ_HANDLED; 945 793 } 946 794 947 - return mxt_process_messages_until_invalid(data); 795 + if (!data->object_table) 796 + return IRQ_HANDLED; 797 + 798 + if (data->T44_address) { 799 + return mxt_process_messages_t44(data); 800 + } else { 801 + return mxt_process_messages(data); 802 + } 948 803 } 949 804 950 805 static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset, ··· 1025 866 mxt_wait_for_completion(data, &data->crc_completion, MXT_CRC_TIMEOUT); 1026 867 } 1027 868 1028 - static int mxt_check_reg_init(struct mxt_data *data) 869 + static void mxt_calc_crc24(u32 *crc, u8 firstbyte, u8 secondbyte) 1029 870 { 1030 - const struct mxt_platform_data *pdata = data->pdata; 1031 - struct mxt_object *object; 1032 - struct device *dev = &data->client->dev; 1033 - int index = 0; 1034 - int i, size; 1035 - int ret; 871 + static const unsigned int crcpoly = 0x80001B; 872 + u32 result; 873 + u32 data_word; 1036 874 1037 - if (!pdata->config) { 1038 - dev_dbg(dev, "No cfg data defined, skipping reg init\n"); 1039 - return 0; 875 + data_word = (secondbyte << 8) | firstbyte; 876 + result = ((*crc << 1) ^ data_word); 877 + 878 + if (result & 0x1000000) 879 + result ^= crcpoly; 880 + 881 + *crc = result; 882 + } 883 + 884 + static u32 mxt_calculate_crc(u8 *base, off_t start_off, off_t end_off) 885 + { 886 + u32 crc = 0; 887 + u8 *ptr = base + start_off; 888 + u8 *last_val = base + end_off - 1; 889 + 890 + if (end_off < start_off) 891 + return -EINVAL; 892 + 893 + while (ptr < last_val) { 894 + mxt_calc_crc24(&crc, *ptr, *(ptr + 1)); 895 + ptr += 2; 1040 896 } 897 + 898 + /* if len is odd, fill the last byte with 0 */ 899 + if (ptr == last_val) 900 + mxt_calc_crc24(&crc, *ptr, 0); 901 + 902 + /* Mask to 24-bit */ 903 + crc &= 0x00FFFFFF; 904 + 905 + return crc; 906 + } 907 + 908 + /* 909 + * mxt_update_cfg - download configuration to chip 910 + * 911 + * Atmel Raw Config File Format 912 + * 913 + * The first four lines of the raw config file contain: 914 + * 1) Version 915 + * 2) Chip ID Information (first 7 bytes of device memory) 916 + * 3) Chip Information Block 24-bit CRC Checksum 917 + * 4) Chip Configuration 24-bit CRC Checksum 918 + * 919 + * The rest of the file consists of one line per object instance: 920 + * <TYPE> <INSTANCE> <SIZE> <CONTENTS> 921 + * 922 + * <TYPE> - 2-byte object type as hex 923 + * <INSTANCE> - 2-byte object instance number as hex 924 + * <SIZE> - 2-byte object size as hex 925 + * <CONTENTS> - array of <SIZE> 1-byte hex values 926 + */ 927 + static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg) 928 + { 929 + struct device *dev = &data->client->dev; 930 + struct mxt_info cfg_info; 931 + struct mxt_object *object; 932 + int ret; 933 + int offset; 934 + int data_pos; 935 + int byte_offset; 936 + int i; 937 + int cfg_start_ofs; 938 + u32 info_crc, config_crc, calculated_crc; 939 + u8 *config_mem; 940 + size_t config_mem_size; 941 + unsigned int type, instance, size; 942 + u8 val; 943 + u16 reg; 1041 944 1042 945 mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1); 1043 946 1044 - if (data->config_crc == pdata->config_crc) { 1045 - dev_info(dev, "Config CRC 0x%06X: OK\n", data->config_crc); 1046 - return 0; 947 + if (strncmp(cfg->data, MXT_CFG_MAGIC, strlen(MXT_CFG_MAGIC))) { 948 + dev_err(dev, "Unrecognised config file\n"); 949 + ret = -EINVAL; 950 + goto release; 1047 951 } 1048 952 1049 - dev_info(dev, "Config CRC 0x%06X: does not match 0x%06X\n", 1050 - data->config_crc, pdata->config_crc); 953 + data_pos = strlen(MXT_CFG_MAGIC); 1051 954 1052 - for (i = 0; i < data->info.object_num; i++) { 1053 - object = data->object_table + i; 1054 - 1055 - if (!mxt_object_writable(object->type)) 1056 - continue; 1057 - 1058 - size = mxt_obj_size(object) * mxt_obj_instances(object); 1059 - if (index + size > pdata->config_length) { 1060 - dev_err(dev, "Not enough config data!\n"); 1061 - return -EINVAL; 955 + /* Load information block and check */ 956 + for (i = 0; i < sizeof(struct mxt_info); i++) { 957 + ret = sscanf(cfg->data + data_pos, "%hhx%n", 958 + (unsigned char *)&cfg_info + i, 959 + &offset); 960 + if (ret != 1) { 961 + dev_err(dev, "Bad format\n"); 962 + ret = -EINVAL; 963 + goto release; 1062 964 } 1063 965 1064 - ret = __mxt_write_reg(data->client, object->start_address, 1065 - size, &pdata->config[index]); 1066 - if (ret) 1067 - return ret; 1068 - index += size; 966 + data_pos += offset; 967 + } 968 + 969 + if (cfg_info.family_id != data->info.family_id) { 970 + dev_err(dev, "Family ID mismatch!\n"); 971 + ret = -EINVAL; 972 + goto release; 973 + } 974 + 975 + if (cfg_info.variant_id != data->info.variant_id) { 976 + dev_err(dev, "Variant ID mismatch!\n"); 977 + ret = -EINVAL; 978 + goto release; 979 + } 980 + 981 + /* Read CRCs */ 982 + ret = sscanf(cfg->data + data_pos, "%x%n", &info_crc, &offset); 983 + if (ret != 1) { 984 + dev_err(dev, "Bad format: failed to parse Info CRC\n"); 985 + ret = -EINVAL; 986 + goto release; 987 + } 988 + data_pos += offset; 989 + 990 + ret = sscanf(cfg->data + data_pos, "%x%n", &config_crc, &offset); 991 + if (ret != 1) { 992 + dev_err(dev, "Bad format: failed to parse Config CRC\n"); 993 + ret = -EINVAL; 994 + goto release; 995 + } 996 + data_pos += offset; 997 + 998 + /* 999 + * The Info Block CRC is calculated over mxt_info and the object 1000 + * table. If it does not match then we are trying to load the 1001 + * configuration from a different chip or firmware version, so 1002 + * the configuration CRC is invalid anyway. 1003 + */ 1004 + if (info_crc == data->info_crc) { 1005 + if (config_crc == 0 || data->config_crc == 0) { 1006 + dev_info(dev, "CRC zero, attempting to apply config\n"); 1007 + } else if (config_crc == data->config_crc) { 1008 + dev_dbg(dev, "Config CRC 0x%06X: OK\n", 1009 + data->config_crc); 1010 + ret = 0; 1011 + goto release; 1012 + } else { 1013 + dev_info(dev, "Config CRC 0x%06X: does not match file 0x%06X\n", 1014 + data->config_crc, config_crc); 1015 + } 1016 + } else { 1017 + dev_warn(dev, 1018 + "Warning: Info CRC error - device=0x%06X file=0x%06X\n", 1019 + data->info_crc, info_crc); 1020 + } 1021 + 1022 + /* Malloc memory to store configuration */ 1023 + cfg_start_ofs = MXT_OBJECT_START + 1024 + data->info.object_num * sizeof(struct mxt_object) + 1025 + MXT_INFO_CHECKSUM_SIZE; 1026 + config_mem_size = data->mem_size - cfg_start_ofs; 1027 + config_mem = kzalloc(config_mem_size, GFP_KERNEL); 1028 + if (!config_mem) { 1029 + dev_err(dev, "Failed to allocate memory\n"); 1030 + ret = -ENOMEM; 1031 + goto release; 1032 + } 1033 + 1034 + while (data_pos < cfg->size) { 1035 + /* Read type, instance, length */ 1036 + ret = sscanf(cfg->data + data_pos, "%x %x %x%n", 1037 + &type, &instance, &size, &offset); 1038 + if (ret == 0) { 1039 + /* EOF */ 1040 + break; 1041 + } else if (ret != 3) { 1042 + dev_err(dev, "Bad format: failed to parse object\n"); 1043 + ret = -EINVAL; 1044 + goto release_mem; 1045 + } 1046 + data_pos += offset; 1047 + 1048 + object = mxt_get_object(data, type); 1049 + if (!object) { 1050 + /* Skip object */ 1051 + for (i = 0; i < size; i++) { 1052 + ret = sscanf(cfg->data + data_pos, "%hhx%n", 1053 + &val, 1054 + &offset); 1055 + data_pos += offset; 1056 + } 1057 + continue; 1058 + } 1059 + 1060 + if (size > mxt_obj_size(object)) { 1061 + /* 1062 + * Either we are in fallback mode due to wrong 1063 + * config or config from a later fw version, 1064 + * or the file is corrupt or hand-edited. 1065 + */ 1066 + dev_warn(dev, "Discarding %zu byte(s) in T%u\n", 1067 + size - mxt_obj_size(object), type); 1068 + } else if (mxt_obj_size(object) > size) { 1069 + /* 1070 + * If firmware is upgraded, new bytes may be added to 1071 + * end of objects. It is generally forward compatible 1072 + * to zero these bytes - previous behaviour will be 1073 + * retained. However this does invalidate the CRC and 1074 + * will force fallback mode until the configuration is 1075 + * updated. We warn here but do nothing else - the 1076 + * malloc has zeroed the entire configuration. 1077 + */ 1078 + dev_warn(dev, "Zeroing %zu byte(s) in T%d\n", 1079 + mxt_obj_size(object) - size, type); 1080 + } 1081 + 1082 + if (instance >= mxt_obj_instances(object)) { 1083 + dev_err(dev, "Object instances exceeded!\n"); 1084 + ret = -EINVAL; 1085 + goto release_mem; 1086 + } 1087 + 1088 + reg = object->start_address + mxt_obj_size(object) * instance; 1089 + 1090 + for (i = 0; i < size; i++) { 1091 + ret = sscanf(cfg->data + data_pos, "%hhx%n", 1092 + &val, 1093 + &offset); 1094 + if (ret != 1) { 1095 + dev_err(dev, "Bad format in T%d\n", type); 1096 + ret = -EINVAL; 1097 + goto release_mem; 1098 + } 1099 + data_pos += offset; 1100 + 1101 + if (i > mxt_obj_size(object)) 1102 + continue; 1103 + 1104 + byte_offset = reg + i - cfg_start_ofs; 1105 + 1106 + if ((byte_offset >= 0) 1107 + && (byte_offset <= config_mem_size)) { 1108 + *(config_mem + byte_offset) = val; 1109 + } else { 1110 + dev_err(dev, "Bad object: reg:%d, T%d, ofs=%d\n", 1111 + reg, object->type, byte_offset); 1112 + ret = -EINVAL; 1113 + goto release_mem; 1114 + } 1115 + } 1116 + } 1117 + 1118 + /* Calculate crc of the received configs (not the raw config file) */ 1119 + if (data->T7_address < cfg_start_ofs) { 1120 + dev_err(dev, "Bad T7 address, T7addr = %x, config offset %x\n", 1121 + data->T7_address, cfg_start_ofs); 1122 + ret = 0; 1123 + goto release_mem; 1124 + } 1125 + 1126 + calculated_crc = mxt_calculate_crc(config_mem, 1127 + data->T7_address - cfg_start_ofs, 1128 + config_mem_size); 1129 + 1130 + if (config_crc > 0 && (config_crc != calculated_crc)) 1131 + dev_warn(dev, "Config CRC error, calculated=%06X, file=%06X\n", 1132 + calculated_crc, config_crc); 1133 + 1134 + /* Write configuration as blocks */ 1135 + byte_offset = 0; 1136 + while (byte_offset < config_mem_size) { 1137 + size = config_mem_size - byte_offset; 1138 + 1139 + if (size > MXT_MAX_BLOCK_WRITE) 1140 + size = MXT_MAX_BLOCK_WRITE; 1141 + 1142 + ret = __mxt_write_reg(data->client, 1143 + cfg_start_ofs + byte_offset, 1144 + size, config_mem + byte_offset); 1145 + if (ret != 0) { 1146 + dev_err(dev, "Config write error, ret=%d\n", ret); 1147 + goto release_mem; 1148 + } 1149 + 1150 + byte_offset += size; 1069 1151 } 1070 1152 1071 1153 mxt_update_crc(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE); 1072 1154 1073 1155 ret = mxt_soft_reset(data); 1074 1156 if (ret) 1075 - return ret; 1157 + goto release_mem; 1076 1158 1077 1159 dev_info(dev, "Config successfully updated\n"); 1078 1160 1079 - return 0; 1161 + release_mem: 1162 + kfree(config_mem); 1163 + release: 1164 + release_firmware(cfg); 1165 + return ret; 1080 1166 } 1081 1167 1082 - static int mxt_make_highchg(struct mxt_data *data) 1168 + static int mxt_acquire_irq(struct mxt_data *data) 1083 1169 { 1084 - struct device *dev = &data->client->dev; 1085 - struct mxt_message message; 1086 - int count = 10; 1087 1170 int error; 1088 1171 1089 - /* Read dummy message to make high CHG pin */ 1090 - do { 1091 - error = mxt_read_message(data, &message); 1092 - if (error) 1093 - return error; 1094 - } while (message.reportid != 0xff && --count); 1172 + enable_irq(data->irq); 1095 1173 1096 - if (!count) { 1097 - dev_err(dev, "CHG pin isn't cleared\n"); 1098 - return -EBUSY; 1099 - } 1174 + error = mxt_process_messages_until_invalid(data); 1175 + if (error) 1176 + return error; 1100 1177 1101 1178 return 0; 1102 1179 } ··· 1351 956 return 0; 1352 957 } 1353 958 959 + static void mxt_free_object_table(struct mxt_data *data) 960 + { 961 + input_unregister_device(data->input_dev); 962 + data->input_dev = NULL; 963 + 964 + kfree(data->object_table); 965 + data->object_table = NULL; 966 + kfree(data->msg_buf); 967 + data->msg_buf = NULL; 968 + data->T5_address = 0; 969 + data->T5_msg_size = 0; 970 + data->T6_reportid = 0; 971 + data->T7_address = 0; 972 + data->T9_reportid_min = 0; 973 + data->T9_reportid_max = 0; 974 + data->T19_reportid = 0; 975 + data->T44_address = 0; 976 + data->max_reportid = 0; 977 + } 978 + 1354 979 static int mxt_get_object_table(struct mxt_data *data) 1355 980 { 1356 981 struct i2c_client *client = data->client; 1357 982 size_t table_size; 983 + struct mxt_object *object_table; 1358 984 int error; 1359 985 int i; 1360 986 u8 reportid; 987 + u16 end_address; 1361 988 1362 989 table_size = data->info.object_num * sizeof(struct mxt_object); 990 + object_table = kzalloc(table_size, GFP_KERNEL); 991 + if (!object_table) { 992 + dev_err(&data->client->dev, "Failed to allocate memory\n"); 993 + return -ENOMEM; 994 + } 995 + 1363 996 error = __mxt_read_reg(client, MXT_OBJECT_START, table_size, 1364 - data->object_table); 1365 - if (error) 997 + object_table); 998 + if (error) { 999 + kfree(object_table); 1366 1000 return error; 1001 + } 1367 1002 1368 1003 /* Valid Report IDs start counting from 1 */ 1369 1004 reportid = 1; 1005 + data->mem_size = 0; 1370 1006 for (i = 0; i < data->info.object_num; i++) { 1371 - struct mxt_object *object = data->object_table + i; 1007 + struct mxt_object *object = object_table + i; 1372 1008 u8 min_id, max_id; 1373 1009 1374 1010 le16_to_cpus(&object->start_address); ··· 1421 995 min_id, max_id); 1422 996 1423 997 switch (object->type) { 998 + case MXT_GEN_MESSAGE_T5: 999 + if (data->info.family_id == 0x80) { 1000 + /* 1001 + * On mXT224 read and discard unused CRC byte 1002 + * otherwise DMA reads are misaligned 1003 + */ 1004 + data->T5_msg_size = mxt_obj_size(object); 1005 + } else { 1006 + /* CRC not enabled, so skip last byte */ 1007 + data->T5_msg_size = mxt_obj_size(object) - 1; 1008 + } 1009 + data->T5_address = object->start_address; 1424 1010 case MXT_GEN_COMMAND_T6: 1425 1011 data->T6_reportid = min_id; 1426 1012 data->T6_address = object->start_address; 1427 1013 break; 1014 + case MXT_GEN_POWER_T7: 1015 + data->T7_address = object->start_address; 1016 + break; 1428 1017 case MXT_TOUCH_MULTI_T9: 1429 1018 data->T9_reportid_min = min_id; 1430 1019 data->T9_reportid_max = max_id; 1020 + data->num_touchids = object->num_report_ids 1021 + * mxt_obj_instances(object); 1022 + break; 1023 + case MXT_SPT_MESSAGECOUNT_T44: 1024 + data->T44_address = object->start_address; 1431 1025 break; 1432 1026 case MXT_SPT_GPIOPWM_T19: 1433 1027 data->T19_reportid = min_id; 1434 1028 break; 1435 1029 } 1030 + 1031 + end_address = object->start_address 1032 + + mxt_obj_size(object) * mxt_obj_instances(object) - 1; 1033 + 1034 + if (end_address >= data->mem_size) 1035 + data->mem_size = end_address + 1; 1436 1036 } 1437 1037 1438 - return 0; 1439 - } 1038 + /* Store maximum reportid */ 1039 + data->max_reportid = reportid; 1440 1040 1441 - static void mxt_free_object_table(struct mxt_data *data) 1442 - { 1443 - kfree(data->object_table); 1444 - data->object_table = NULL; 1445 - data->T6_reportid = 0; 1446 - data->T9_reportid_min = 0; 1447 - data->T9_reportid_max = 0; 1448 - data->T19_reportid = 0; 1041 + /* If T44 exists, T5 position has to be directly after */ 1042 + if (data->T44_address && (data->T5_address != data->T44_address + 1)) { 1043 + dev_err(&client->dev, "Invalid T44 position\n"); 1044 + error = -EINVAL; 1045 + goto free_object_table; 1046 + } 1047 + 1048 + data->msg_buf = kcalloc(data->max_reportid, 1049 + data->T5_msg_size, GFP_KERNEL); 1050 + if (!data->msg_buf) { 1051 + dev_err(&client->dev, "Failed to allocate message buffer\n"); 1052 + error = -ENOMEM; 1053 + goto free_object_table; 1054 + } 1055 + 1056 + data->object_table = object_table; 1057 + 1058 + return 0; 1059 + 1060 + free_object_table: 1061 + mxt_free_object_table(data); 1062 + return error; 1449 1063 } 1450 1064 1451 1065 static int mxt_read_t9_resolution(struct mxt_data *data) ··· 1536 1070 return 0; 1537 1071 } 1538 1072 1073 + static int mxt_input_open(struct input_dev *dev); 1074 + static void mxt_input_close(struct input_dev *dev); 1075 + 1076 + static int mxt_initialize_t9_input_device(struct mxt_data *data) 1077 + { 1078 + struct device *dev = &data->client->dev; 1079 + const struct mxt_platform_data *pdata = data->pdata; 1080 + struct input_dev *input_dev; 1081 + int error; 1082 + unsigned int num_mt_slots; 1083 + unsigned int mt_flags = 0; 1084 + int i; 1085 + 1086 + error = mxt_read_t9_resolution(data); 1087 + if (error) 1088 + dev_warn(dev, "Failed to initialize T9 resolution\n"); 1089 + 1090 + input_dev = input_allocate_device(); 1091 + if (!input_dev) { 1092 + dev_err(dev, "Failed to allocate memory\n"); 1093 + return -ENOMEM; 1094 + } 1095 + 1096 + input_dev->name = "Atmel maXTouch Touchscreen"; 1097 + input_dev->phys = data->phys; 1098 + input_dev->id.bustype = BUS_I2C; 1099 + input_dev->dev.parent = dev; 1100 + input_dev->open = mxt_input_open; 1101 + input_dev->close = mxt_input_close; 1102 + 1103 + __set_bit(EV_ABS, input_dev->evbit); 1104 + __set_bit(EV_KEY, input_dev->evbit); 1105 + __set_bit(BTN_TOUCH, input_dev->keybit); 1106 + 1107 + if (pdata->t19_num_keys) { 1108 + __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); 1109 + 1110 + for (i = 0; i < pdata->t19_num_keys; i++) 1111 + if (pdata->t19_keymap[i] != KEY_RESERVED) 1112 + input_set_capability(input_dev, EV_KEY, 1113 + pdata->t19_keymap[i]); 1114 + 1115 + mt_flags |= INPUT_MT_POINTER; 1116 + 1117 + input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM); 1118 + input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM); 1119 + input_abs_set_res(input_dev, ABS_MT_POSITION_X, 1120 + MXT_PIXELS_PER_MM); 1121 + input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 1122 + MXT_PIXELS_PER_MM); 1123 + 1124 + input_dev->name = "Atmel maXTouch Touchpad"; 1125 + } 1126 + 1127 + /* For single touch */ 1128 + input_set_abs_params(input_dev, ABS_X, 1129 + 0, data->max_x, 0, 0); 1130 + input_set_abs_params(input_dev, ABS_Y, 1131 + 0, data->max_y, 0, 0); 1132 + input_set_abs_params(input_dev, ABS_PRESSURE, 1133 + 0, 255, 0, 0); 1134 + 1135 + /* For multi touch */ 1136 + num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1; 1137 + error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags); 1138 + if (error) { 1139 + dev_err(dev, "Error %d initialising slots\n", error); 1140 + goto err_free_mem; 1141 + } 1142 + 1143 + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 1144 + 0, MXT_MAX_AREA, 0, 0); 1145 + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 1146 + 0, data->max_x, 0, 0); 1147 + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 1148 + 0, data->max_y, 0, 0); 1149 + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 1150 + 0, 255, 0, 0); 1151 + 1152 + input_set_drvdata(input_dev, data); 1153 + 1154 + error = input_register_device(input_dev); 1155 + if (error) { 1156 + dev_err(dev, "Error %d registering input device\n", error); 1157 + goto err_free_mem; 1158 + } 1159 + 1160 + data->input_dev = input_dev; 1161 + 1162 + return 0; 1163 + 1164 + err_free_mem: 1165 + input_free_device(input_dev); 1166 + return error; 1167 + } 1168 + 1169 + static int mxt_configure_objects(struct mxt_data *data, 1170 + const struct firmware *cfg); 1171 + 1172 + static void mxt_config_cb(const struct firmware *cfg, void *ctx) 1173 + { 1174 + mxt_configure_objects(ctx, cfg); 1175 + } 1176 + 1539 1177 static int mxt_initialize(struct mxt_data *data) 1540 1178 { 1541 1179 struct i2c_client *client = data->client; 1542 - struct mxt_info *info = &data->info; 1543 1180 int error; 1181 + bool alt_bootloader_addr = false; 1182 + bool retry = false; 1544 1183 1184 + retry_info: 1545 1185 error = mxt_get_info(data); 1546 - if (error) 1547 - return error; 1186 + if (error) { 1187 + retry_bootloader: 1188 + error = mxt_probe_bootloader(data, alt_bootloader_addr); 1189 + if (error) { 1190 + if (alt_bootloader_addr) { 1191 + /* Chip is not in appmode or bootloader mode */ 1192 + return error; 1193 + } 1548 1194 1549 - data->object_table = kcalloc(info->object_num, 1550 - sizeof(struct mxt_object), 1551 - GFP_KERNEL); 1552 - if (!data->object_table) { 1553 - dev_err(&client->dev, "Failed to allocate memory\n"); 1554 - return -ENOMEM; 1195 + dev_info(&client->dev, "Trying alternate bootloader address\n"); 1196 + alt_bootloader_addr = true; 1197 + goto retry_bootloader; 1198 + } else { 1199 + if (retry) { 1200 + dev_err(&client->dev, "Could not recover from bootloader mode\n"); 1201 + /* 1202 + * We can reflash from this state, so do not 1203 + * abort init 1204 + */ 1205 + data->in_bootloader = true; 1206 + return 0; 1207 + } 1208 + 1209 + /* Attempt to exit bootloader into app mode */ 1210 + mxt_send_bootloader_cmd(data, false); 1211 + msleep(MXT_FW_RESET_TIME); 1212 + retry = true; 1213 + goto retry_info; 1214 + } 1555 1215 } 1556 1216 1557 1217 /* Get object table information */ 1558 1218 error = mxt_get_object_table(data); 1559 1219 if (error) { 1560 1220 dev_err(&client->dev, "Error %d reading object table\n", error); 1561 - goto err_free_object_table; 1221 + return error; 1562 1222 } 1563 1223 1564 - /* Check register init values */ 1565 - error = mxt_check_reg_init(data); 1566 - if (error) { 1567 - dev_err(&client->dev, "Error %d initializing configuration\n", 1568 - error); 1224 + mxt_acquire_irq(data); 1225 + if (error) 1569 1226 goto err_free_object_table; 1570 - } 1571 1227 1572 - error = mxt_read_t9_resolution(data); 1573 - if (error) { 1574 - dev_err(&client->dev, "Failed to initialize T9 resolution\n"); 1575 - goto err_free_object_table; 1576 - } 1577 - 1578 - dev_info(&client->dev, 1579 - "Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n", 1580 - info->family_id, info->variant_id, info->version >> 4, 1581 - info->version & 0xf, info->build, info->object_num); 1228 + request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME, 1229 + &data->client->dev, GFP_KERNEL, data, 1230 + mxt_config_cb); 1582 1231 1583 1232 return 0; 1584 1233 1585 1234 err_free_object_table: 1586 1235 mxt_free_object_table(data); 1587 1236 return error; 1237 + } 1238 + 1239 + static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep) 1240 + { 1241 + struct device *dev = &data->client->dev; 1242 + int error; 1243 + struct t7_config *new_config; 1244 + struct t7_config deepsleep = { .active = 0, .idle = 0 }; 1245 + 1246 + if (sleep == MXT_POWER_CFG_DEEPSLEEP) 1247 + new_config = &deepsleep; 1248 + else 1249 + new_config = &data->t7_cfg; 1250 + 1251 + error = __mxt_write_reg(data->client, data->T7_address, 1252 + sizeof(data->t7_cfg), new_config); 1253 + if (error) 1254 + return error; 1255 + 1256 + dev_dbg(dev, "Set T7 ACTV:%d IDLE:%d\n", 1257 + new_config->active, new_config->idle); 1258 + 1259 + return 0; 1260 + } 1261 + 1262 + static int mxt_init_t7_power_cfg(struct mxt_data *data) 1263 + { 1264 + struct device *dev = &data->client->dev; 1265 + int error; 1266 + bool retry = false; 1267 + 1268 + recheck: 1269 + error = __mxt_read_reg(data->client, data->T7_address, 1270 + sizeof(data->t7_cfg), &data->t7_cfg); 1271 + if (error) 1272 + return error; 1273 + 1274 + if (data->t7_cfg.active == 0 || data->t7_cfg.idle == 0) { 1275 + if (!retry) { 1276 + dev_dbg(dev, "T7 cfg zero, resetting\n"); 1277 + mxt_soft_reset(data); 1278 + retry = true; 1279 + goto recheck; 1280 + } else { 1281 + dev_dbg(dev, "T7 cfg zero after reset, overriding\n"); 1282 + data->t7_cfg.active = 20; 1283 + data->t7_cfg.idle = 100; 1284 + return mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); 1285 + } 1286 + } 1287 + 1288 + dev_dbg(dev, "Initialized power cfg: ACTV %d, IDLE %d\n", 1289 + data->t7_cfg.active, data->t7_cfg.idle); 1290 + return 0; 1291 + } 1292 + 1293 + static int mxt_configure_objects(struct mxt_data *data, 1294 + const struct firmware *cfg) 1295 + { 1296 + struct device *dev = &data->client->dev; 1297 + struct mxt_info *info = &data->info; 1298 + int error; 1299 + 1300 + if (cfg) { 1301 + error = mxt_update_cfg(data, cfg); 1302 + if (error) 1303 + dev_warn(dev, "Error %d updating config\n", error); 1304 + } 1305 + 1306 + error = mxt_init_t7_power_cfg(data); 1307 + if (error) { 1308 + dev_err(dev, "Failed to initialize power cfg\n"); 1309 + return error; 1310 + } 1311 + 1312 + error = mxt_initialize_t9_input_device(data); 1313 + if (error) 1314 + return error; 1315 + 1316 + dev_info(dev, 1317 + "Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n", 1318 + info->family_id, info->variant_id, info->version >> 4, 1319 + info->version & 0xf, info->build, info->object_num); 1320 + 1321 + return 0; 1588 1322 } 1589 1323 1590 1324 /* Firmware Version is returned as Major.Minor.Build */ ··· 1912 1246 if (ret) 1913 1247 goto release_firmware; 1914 1248 1915 - ret = mxt_lookup_bootloader_address(data); 1916 - if (ret) 1917 - goto release_firmware; 1249 + if (!data->in_bootloader) { 1250 + /* Change to the bootloader mode */ 1251 + data->in_bootloader = true; 1918 1252 1919 - /* Change to the bootloader mode */ 1920 - data->in_bootloader = true; 1253 + ret = mxt_t6_command(data, MXT_COMMAND_RESET, 1254 + MXT_BOOT_VALUE, false); 1255 + if (ret) 1256 + goto release_firmware; 1921 1257 1922 - ret = mxt_t6_command(data, MXT_COMMAND_RESET, MXT_BOOT_VALUE, false); 1923 - if (ret) 1924 - goto release_firmware; 1258 + msleep(MXT_RESET_TIME); 1925 1259 1926 - msleep(MXT_RESET_TIME); 1260 + /* Do not need to scan since we know family ID */ 1261 + ret = mxt_lookup_bootloader_address(data, 0); 1262 + if (ret) 1263 + goto release_firmware; 1264 + } else { 1265 + enable_irq(data->irq); 1266 + } 1927 1267 1268 + mxt_free_object_table(data); 1928 1269 reinit_completion(&data->bl_completion); 1929 1270 1930 - ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD); 1931 - if (ret) 1932 - goto disable_irq; 1271 + ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD, false); 1272 + if (ret) { 1273 + /* Bootloader may still be unlocked from previous attempt */ 1274 + ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, false); 1275 + if (ret) 1276 + goto disable_irq; 1277 + } else { 1278 + dev_info(dev, "Unlocking bootloader\n"); 1933 1279 1934 - /* Unlock bootloader */ 1935 - mxt_unlock_bootloader(data); 1280 + /* Unlock bootloader */ 1281 + ret = mxt_send_bootloader_cmd(data, true); 1282 + if (ret) 1283 + goto disable_irq; 1284 + } 1936 1285 1937 1286 while (pos < fw->size) { 1938 - ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA); 1287 + ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, true); 1939 1288 if (ret) 1940 1289 goto disable_irq; 1941 1290 ··· 1964 1283 if (ret) 1965 1284 goto disable_irq; 1966 1285 1967 - ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS); 1286 + ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true); 1968 1287 if (ret) { 1969 1288 retry++; 1970 1289 ··· 2024 1343 } else { 2025 1344 dev_info(dev, "The firmware update succeeded\n"); 2026 1345 2027 - mxt_free_object_table(data); 2028 - 2029 - mxt_initialize(data); 2030 - 2031 - enable_irq(data->irq); 2032 - 2033 - error = mxt_make_highchg(data); 1346 + error = mxt_initialize(data); 2034 1347 if (error) 2035 1348 return error; 2036 1349 } ··· 2051 1376 2052 1377 static void mxt_start(struct mxt_data *data) 2053 1378 { 2054 - /* Touch enable */ 2055 - mxt_write_object(data, 2056 - MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83); 1379 + mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN); 1380 + 1381 + /* Recalibrate since chip has been in deep sleep */ 1382 + mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false); 2057 1383 } 2058 1384 2059 1385 static void mxt_stop(struct mxt_data *data) 2060 1386 { 2061 - /* Touch disable */ 2062 - mxt_write_object(data, 2063 - MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0); 1387 + mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP); 2064 1388 } 2065 1389 2066 1390 static int mxt_input_open(struct input_dev *dev) ··· 2078 1404 mxt_stop(data); 2079 1405 } 2080 1406 2081 - static int mxt_probe(struct i2c_client *client, 2082 - const struct i2c_device_id *id) 1407 + #ifdef CONFIG_OF 1408 + static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) 2083 1409 { 2084 - const struct mxt_platform_data *pdata = dev_get_platdata(&client->dev); 2085 - struct mxt_data *data; 2086 - struct input_dev *input_dev; 2087 - int error; 2088 - unsigned int num_mt_slots; 2089 - unsigned int mt_flags = 0; 2090 - int i; 1410 + struct mxt_platform_data *pdata; 1411 + u32 *keymap; 1412 + u32 keycode; 1413 + int proplen, i, ret; 2091 1414 1415 + if (!client->dev.of_node) 1416 + return ERR_PTR(-ENODEV); 1417 + 1418 + pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); 2092 1419 if (!pdata) 2093 - return -EINVAL; 1420 + return ERR_PTR(-ENOMEM); 2094 1421 2095 - data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL); 2096 - input_dev = input_allocate_device(); 2097 - if (!data || !input_dev) { 2098 - dev_err(&client->dev, "Failed to allocate memory\n"); 2099 - error = -ENOMEM; 2100 - goto err_free_mem; 1422 + if (of_find_property(client->dev.of_node, "linux,gpio-keymap", 1423 + &proplen)) { 1424 + pdata->t19_num_keys = proplen / sizeof(u32); 1425 + 1426 + keymap = devm_kzalloc(&client->dev, 1427 + pdata->t19_num_keys * sizeof(keymap[0]), 1428 + GFP_KERNEL); 1429 + if (!keymap) 1430 + return ERR_PTR(-ENOMEM); 1431 + 1432 + for (i = 0; i < pdata->t19_num_keys; i++) { 1433 + ret = of_property_read_u32_index(client->dev.of_node, 1434 + "linux,gpio-keymap", i, &keycode); 1435 + if (ret) 1436 + keycode = KEY_RESERVED; 1437 + 1438 + keymap[i] = keycode; 1439 + } 1440 + 1441 + pdata->t19_keymap = keymap; 2101 1442 } 2102 1443 2103 - input_dev->name = "Atmel maXTouch Touchscreen"; 1444 + return pdata; 1445 + } 1446 + #else 1447 + static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) 1448 + { 1449 + dev_dbg(&client->dev, "No platform data specified\n"); 1450 + return ERR_PTR(-EINVAL); 1451 + } 1452 + #endif 1453 + 1454 + static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) 1455 + { 1456 + struct mxt_data *data; 1457 + const struct mxt_platform_data *pdata; 1458 + int error; 1459 + 1460 + pdata = dev_get_platdata(&client->dev); 1461 + if (!pdata) { 1462 + pdata = mxt_parse_dt(client); 1463 + if (IS_ERR(pdata)) 1464 + return PTR_ERR(pdata); 1465 + } 1466 + 1467 + data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL); 1468 + if (!data) { 1469 + dev_err(&client->dev, "Failed to allocate memory\n"); 1470 + return -ENOMEM; 1471 + } 1472 + 2104 1473 snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", 2105 1474 client->adapter->nr, client->addr); 2106 1475 2107 - input_dev->phys = data->phys; 2108 - 2109 - input_dev->id.bustype = BUS_I2C; 2110 - input_dev->dev.parent = &client->dev; 2111 - input_dev->open = mxt_input_open; 2112 - input_dev->close = mxt_input_close; 2113 - 2114 1476 data->client = client; 2115 - data->input_dev = input_dev; 2116 1477 data->pdata = pdata; 2117 1478 data->irq = client->irq; 1479 + i2c_set_clientdata(client, data); 2118 1480 2119 1481 init_completion(&data->bl_completion); 2120 1482 init_completion(&data->reset_completion); 2121 1483 init_completion(&data->crc_completion); 2122 - 2123 - error = mxt_initialize(data); 2124 - if (error) 2125 - goto err_free_mem; 2126 - 2127 - __set_bit(EV_ABS, input_dev->evbit); 2128 - __set_bit(EV_KEY, input_dev->evbit); 2129 - __set_bit(BTN_TOUCH, input_dev->keybit); 2130 - 2131 - if (pdata->t19_num_keys) { 2132 - __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); 2133 - 2134 - for (i = 0; i < pdata->t19_num_keys; i++) 2135 - if (pdata->t19_keymap[i] != KEY_RESERVED) 2136 - input_set_capability(input_dev, EV_KEY, 2137 - pdata->t19_keymap[i]); 2138 - 2139 - mt_flags |= INPUT_MT_POINTER; 2140 - 2141 - input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM); 2142 - input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM); 2143 - input_abs_set_res(input_dev, ABS_MT_POSITION_X, 2144 - MXT_PIXELS_PER_MM); 2145 - input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 2146 - MXT_PIXELS_PER_MM); 2147 - 2148 - input_dev->name = "Atmel maXTouch Touchpad"; 2149 - } 2150 - 2151 - /* For single touch */ 2152 - input_set_abs_params(input_dev, ABS_X, 2153 - 0, data->max_x, 0, 0); 2154 - input_set_abs_params(input_dev, ABS_Y, 2155 - 0, data->max_y, 0, 0); 2156 - input_set_abs_params(input_dev, ABS_PRESSURE, 2157 - 0, 255, 0, 0); 2158 - 2159 - /* For multi touch */ 2160 - num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1; 2161 - error = input_mt_init_slots(input_dev, num_mt_slots, mt_flags); 2162 - if (error) 2163 - goto err_free_object; 2164 - input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 2165 - 0, MXT_MAX_AREA, 0, 0); 2166 - input_set_abs_params(input_dev, ABS_MT_POSITION_X, 2167 - 0, data->max_x, 0, 0); 2168 - input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 2169 - 0, data->max_y, 0, 0); 2170 - input_set_abs_params(input_dev, ABS_MT_PRESSURE, 2171 - 0, 255, 0, 0); 2172 - 2173 - input_set_drvdata(input_dev, data); 2174 - i2c_set_clientdata(client, data); 2175 1484 2176 1485 error = request_threaded_irq(client->irq, NULL, mxt_interrupt, 2177 1486 pdata->irqflags | IRQF_ONESHOT, 2178 1487 client->name, data); 2179 1488 if (error) { 2180 1489 dev_err(&client->dev, "Failed to register interrupt\n"); 2181 - goto err_free_object; 1490 + goto err_free_mem; 2182 1491 } 2183 1492 2184 - error = mxt_make_highchg(data); 1493 + disable_irq(client->irq); 1494 + 1495 + error = mxt_initialize(data); 2185 1496 if (error) 2186 1497 goto err_free_irq; 2187 - 2188 - error = input_register_device(input_dev); 2189 - if (error) { 2190 - dev_err(&client->dev, "Error %d registering input device\n", 2191 - error); 2192 - goto err_free_irq; 2193 - } 2194 1498 2195 1499 error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group); 2196 1500 if (error) { 2197 1501 dev_err(&client->dev, "Failure %d creating sysfs group\n", 2198 1502 error); 2199 - goto err_unregister_device; 1503 + goto err_free_object; 2200 1504 } 2201 1505 2202 1506 return 0; 2203 1507 2204 - err_unregister_device: 2205 - input_unregister_device(input_dev); 2206 - input_dev = NULL; 1508 + err_free_object: 1509 + mxt_free_object_table(data); 2207 1510 err_free_irq: 2208 1511 free_irq(client->irq, data); 2209 - err_free_object: 2210 - kfree(data->object_table); 2211 1512 err_free_mem: 2212 - input_free_device(input_dev); 2213 1513 kfree(data); 2214 1514 return error; 2215 1515 } ··· 2195 1547 sysfs_remove_group(&client->dev.kobj, &mxt_attr_group); 2196 1548 free_irq(data->irq, data); 2197 1549 input_unregister_device(data->input_dev); 2198 - kfree(data->object_table); 1550 + mxt_free_object_table(data); 2199 1551 kfree(data); 2200 1552 2201 1553 return 0; ··· 2224 1576 struct mxt_data *data = i2c_get_clientdata(client); 2225 1577 struct input_dev *input_dev = data->input_dev; 2226 1578 2227 - mxt_soft_reset(data); 2228 - 2229 1579 mutex_lock(&input_dev->mutex); 2230 1580 2231 1581 if (input_dev->users) ··· 2236 1590 #endif 2237 1591 2238 1592 static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume); 1593 + 1594 + static const struct of_device_id mxt_of_match[] = { 1595 + { .compatible = "atmel,maxtouch", }, 1596 + {}, 1597 + }; 1598 + MODULE_DEVICE_TABLE(of, mxt_of_match); 2239 1599 2240 1600 static const struct i2c_device_id mxt_id[] = { 2241 1601 { "qt602240_ts", 0 }, ··· 2256 1604 .driver = { 2257 1605 .name = "atmel_mxt_ts", 2258 1606 .owner = THIS_MODULE, 1607 + .of_match_table = of_match_ptr(mxt_of_match), 2259 1608 .pm = &mxt_pm_ops, 2260 1609 }, 2261 1610 .probe = mxt_probe,
+1 -2
drivers/input/touchscreen/edt-ft5x06.c
··· 733 733 static void 734 734 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) 735 735 { 736 - if (tsdata->debug_dir) 737 - debugfs_remove_recursive(tsdata->debug_dir); 736 + debugfs_remove_recursive(tsdata->debug_dir); 738 737 kfree(tsdata->raw_buffer); 739 738 } 740 739
+166
drivers/input/touchscreen/ipaq-micro-ts.c
··· 1 + /* 2 + * This program is free software; you can redistribute it and/or modify 3 + * it under the terms of the GNU General Public License version 2 as 4 + * published by the Free Software Foundation. 5 + * 6 + * h3600 atmel micro companion support, touchscreen subdevice 7 + * Author : Alessandro Gardich <gremlin@gremlin.it> 8 + * Author : Dmitry Artamonow <mad_soft@inbox.ru> 9 + * Author : Linus Walleij <linus.walleij@linaro.org> 10 + * 11 + */ 12 + 13 + #include <asm/byteorder.h> 14 + #include <linux/module.h> 15 + #include <linux/init.h> 16 + #include <linux/interrupt.h> 17 + #include <linux/pm.h> 18 + #include <linux/delay.h> 19 + #include <linux/device.h> 20 + #include <linux/input.h> 21 + #include <linux/platform_device.h> 22 + #include <linux/slab.h> 23 + #include <linux/mfd/ipaq-micro.h> 24 + 25 + struct touchscreen_data { 26 + struct input_dev *input; 27 + struct ipaq_micro *micro; 28 + }; 29 + 30 + static void micro_ts_receive(void *data, int len, unsigned char *msg) 31 + { 32 + struct touchscreen_data *ts = data; 33 + 34 + if (len == 4) { 35 + input_report_abs(ts->input, ABS_X, 36 + be16_to_cpup((__be16 *) &msg[2])); 37 + input_report_abs(ts->input, ABS_Y, 38 + be16_to_cpup((__be16 *) &msg[0])); 39 + input_report_key(ts->input, BTN_TOUCH, 1); 40 + input_sync(ts->input); 41 + } else if (len == 0) { 42 + input_report_abs(ts->input, ABS_X, 0); 43 + input_report_abs(ts->input, ABS_Y, 0); 44 + input_report_key(ts->input, BTN_TOUCH, 0); 45 + input_sync(ts->input); 46 + } 47 + } 48 + 49 + static void micro_ts_toggle_receive(struct touchscreen_data *ts, bool enable) 50 + { 51 + struct ipaq_micro *micro = ts->micro; 52 + 53 + spin_lock_irq(&micro->lock); 54 + 55 + if (enable) { 56 + micro->ts = micro_ts_receive; 57 + micro->ts_data = ts; 58 + } else { 59 + micro->ts = NULL; 60 + micro->ts_data = NULL; 61 + } 62 + 63 + spin_unlock_irq(&ts->micro->lock); 64 + } 65 + 66 + static int micro_ts_open(struct input_dev *input) 67 + { 68 + struct touchscreen_data *ts = input_get_drvdata(input); 69 + 70 + micro_ts_toggle_receive(ts, true); 71 + 72 + return 0; 73 + } 74 + 75 + static void micro_ts_close(struct input_dev *input) 76 + { 77 + struct touchscreen_data *ts = input_get_drvdata(input); 78 + 79 + micro_ts_toggle_receive(ts, false); 80 + } 81 + 82 + static int micro_ts_probe(struct platform_device *pdev) 83 + { 84 + struct ipaq_micro *micro = dev_get_drvdata(pdev->dev.parent); 85 + struct touchscreen_data *ts; 86 + int error; 87 + 88 + ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL); 89 + if (!ts) 90 + return -ENOMEM; 91 + 92 + ts->micro = micro; 93 + 94 + ts->input = devm_input_allocate_device(&pdev->dev); 95 + if (!ts->input) { 96 + dev_err(&pdev->dev, "failed to allocate input device\n"); 97 + return -ENOMEM; 98 + } 99 + 100 + ts->input->name = "ipaq micro ts"; 101 + ts->input->open = micro_ts_open; 102 + ts->input->close = micro_ts_close; 103 + 104 + input_set_drvdata(ts->input, ts); 105 + 106 + input_set_capability(ts->input, EV_KEY, BTN_TOUCH); 107 + input_set_capability(ts->input, EV_ABS, ABS_X); 108 + input_set_capability(ts->input, EV_ABS, ABS_Y); 109 + input_set_abs_params(ts->input, ABS_X, 0, 1023, 0, 0); 110 + input_set_abs_params(ts->input, ABS_Y, 0, 1023, 0, 0); 111 + 112 + error = input_register_device(ts->input); 113 + if (error) { 114 + dev_err(&pdev->dev, "error registering touch input\n"); 115 + return error; 116 + } 117 + 118 + platform_set_drvdata(pdev, ts); 119 + 120 + dev_info(&pdev->dev, "iPAQ micro touchscreen\n"); 121 + 122 + return 0; 123 + } 124 + 125 + #ifdef CONFIG_PM_SLEEP 126 + static int micro_ts_suspend(struct device *dev) 127 + { 128 + struct touchscreen_data *ts = dev_get_drvdata(dev); 129 + 130 + micro_ts_toggle_receive(ts, false); 131 + 132 + return 0; 133 + } 134 + 135 + static int micro_ts_resume(struct device *dev) 136 + { 137 + struct touchscreen_data *ts = dev_get_drvdata(dev); 138 + struct input_dev *input = ts->input; 139 + 140 + mutex_lock(&input->mutex); 141 + 142 + if (input->users) 143 + micro_ts_toggle_receive(ts, true); 144 + 145 + mutex_unlock(&input->mutex); 146 + 147 + return 0; 148 + } 149 + #endif 150 + 151 + static const struct dev_pm_ops micro_ts_dev_pm_ops = { 152 + SET_SYSTEM_SLEEP_PM_OPS(micro_ts_suspend, micro_ts_resume) 153 + }; 154 + 155 + static struct platform_driver micro_ts_device_driver = { 156 + .driver = { 157 + .name = "ipaq-micro-ts", 158 + .pm = &micro_ts_dev_pm_ops, 159 + }, 160 + .probe = micro_ts_probe, 161 + }; 162 + module_platform_driver(micro_ts_device_driver); 163 + 164 + MODULE_LICENSE("GPL"); 165 + MODULE_DESCRIPTION("driver for iPAQ Atmel micro touchscreen"); 166 + MODULE_ALIAS("platform:ipaq-micro-ts");
+25 -45
drivers/input/touchscreen/jornada720_ts.c
··· 36 36 37 37 static void jornada720_ts_collect_data(struct jornada_ts *jornada_ts) 38 38 { 39 + /* 3 low word X samples */ 40 + jornada_ts->x_data[0] = jornada_ssp_byte(TXDUMMY); 41 + jornada_ts->x_data[1] = jornada_ssp_byte(TXDUMMY); 42 + jornada_ts->x_data[2] = jornada_ssp_byte(TXDUMMY); 39 43 40 - /* 3 low word X samples */ 41 - jornada_ts->x_data[0] = jornada_ssp_byte(TXDUMMY); 42 - jornada_ts->x_data[1] = jornada_ssp_byte(TXDUMMY); 43 - jornada_ts->x_data[2] = jornada_ssp_byte(TXDUMMY); 44 + /* 3 low word Y samples */ 45 + jornada_ts->y_data[0] = jornada_ssp_byte(TXDUMMY); 46 + jornada_ts->y_data[1] = jornada_ssp_byte(TXDUMMY); 47 + jornada_ts->y_data[2] = jornada_ssp_byte(TXDUMMY); 44 48 45 - /* 3 low word Y samples */ 46 - jornada_ts->y_data[0] = jornada_ssp_byte(TXDUMMY); 47 - jornada_ts->y_data[1] = jornada_ssp_byte(TXDUMMY); 48 - jornada_ts->y_data[2] = jornada_ssp_byte(TXDUMMY); 49 + /* combined x samples bits */ 50 + jornada_ts->x_data[3] = jornada_ssp_byte(TXDUMMY); 49 51 50 - /* combined x samples bits */ 51 - jornada_ts->x_data[3] = jornada_ssp_byte(TXDUMMY); 52 - 53 - /* combined y samples bits */ 54 - jornada_ts->y_data[3] = jornada_ssp_byte(TXDUMMY); 52 + /* combined y samples bits */ 53 + jornada_ts->y_data[3] = jornada_ssp_byte(TXDUMMY); 55 54 } 56 55 57 56 static int jornada720_ts_average(int coords[4]) ··· 103 104 struct input_dev *input_dev; 104 105 int error; 105 106 106 - jornada_ts = kzalloc(sizeof(struct jornada_ts), GFP_KERNEL); 107 - input_dev = input_allocate_device(); 107 + jornada_ts = devm_kzalloc(&pdev->dev, sizeof(*jornada_ts), GFP_KERNEL); 108 + if (!jornada_ts) 109 + return -ENOMEM; 108 110 109 - if (!jornada_ts || !input_dev) { 110 - error = -ENOMEM; 111 - goto fail1; 112 - } 111 + input_dev = devm_input_allocate_device(&pdev->dev); 112 + if (!input_dev) 113 + return -ENOMEM; 113 114 114 115 platform_set_drvdata(pdev, jornada_ts); 115 116 ··· 125 126 input_set_abs_params(input_dev, ABS_X, 270, 3900, 0, 0); 126 127 input_set_abs_params(input_dev, ABS_Y, 180, 3700, 0, 0); 127 128 128 - error = request_irq(IRQ_GPIO9, 129 - jornada720_ts_interrupt, 130 - IRQF_TRIGGER_RISING, 131 - "HP7XX Touchscreen driver", pdev); 129 + error = devm_request_irq(&pdev->dev, IRQ_GPIO9, 130 + jornada720_ts_interrupt, 131 + IRQF_TRIGGER_RISING, 132 + "HP7XX Touchscreen driver", pdev); 132 133 if (error) { 133 - printk(KERN_INFO "HP7XX TS : Unable to acquire irq!\n"); 134 - goto fail1; 134 + dev_err(&pdev->dev, "HP7XX TS : Unable to acquire irq!\n"); 135 + return error; 135 136 } 136 137 137 138 error = input_register_device(jornada_ts->dev); 138 139 if (error) 139 - goto fail2; 140 - 141 - return 0; 142 - 143 - fail2: 144 - free_irq(IRQ_GPIO9, pdev); 145 - fail1: 146 - input_free_device(input_dev); 147 - kfree(jornada_ts); 148 - return error; 149 - } 150 - 151 - static int jornada720_ts_remove(struct platform_device *pdev) 152 - { 153 - struct jornada_ts *jornada_ts = platform_get_drvdata(pdev); 154 - 155 - free_irq(IRQ_GPIO9, pdev); 156 - input_unregister_device(jornada_ts->dev); 157 - kfree(jornada_ts); 140 + return error; 158 141 159 142 return 0; 160 143 } ··· 146 165 147 166 static struct platform_driver jornada720_ts_driver = { 148 167 .probe = jornada720_ts_probe, 149 - .remove = jornada720_ts_remove, 150 168 .driver = { 151 169 .name = "jornada_ts", 152 170 .owner = THIS_MODULE,
+2 -4
drivers/input/touchscreen/mcs5000_ts.c
··· 248 248 return 0; 249 249 } 250 250 251 - #ifdef CONFIG_PM 252 - static int mcs5000_ts_suspend(struct device *dev) 251 + static int __maybe_unused mcs5000_ts_suspend(struct device *dev) 253 252 { 254 253 struct i2c_client *client = to_i2c_client(dev); 255 254 ··· 258 259 return 0; 259 260 } 260 261 261 - static int mcs5000_ts_resume(struct device *dev) 262 + static int __maybe_unused mcs5000_ts_resume(struct device *dev) 262 263 { 263 264 struct i2c_client *client = to_i2c_client(dev); 264 265 struct mcs5000_ts_data *data = i2c_get_clientdata(client); ··· 268 269 269 270 return 0; 270 271 } 271 - #endif 272 272 273 273 static SIMPLE_DEV_PM_OPS(mcs5000_ts_pm, mcs5000_ts_suspend, mcs5000_ts_resume); 274 274
+211 -31
drivers/input/touchscreen/pixcir_i2c_ts.c
··· 23 23 #include <linux/slab.h> 24 24 #include <linux/i2c.h> 25 25 #include <linux/input.h> 26 + #include <linux/input/mt.h> 26 27 #include <linux/input/pixcir_ts.h> 27 28 #include <linux/gpio.h> 29 + #include <linux/of.h> 30 + #include <linux/of_gpio.h> 31 + #include <linux/of_device.h> 32 + 33 + #define PIXCIR_MAX_SLOTS 5 /* Max fingers supported by driver */ 28 34 29 35 struct pixcir_i2c_ts_data { 30 36 struct i2c_client *client; 31 37 struct input_dev *input; 32 - const struct pixcir_ts_platform_data *chip; 38 + const struct pixcir_ts_platform_data *pdata; 33 39 bool running; 40 + int max_fingers; /* Max fingers supported in this instance */ 34 41 }; 35 42 36 - static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data) 43 + struct pixcir_touch { 44 + int x; 45 + int y; 46 + int id; 47 + }; 48 + 49 + struct pixcir_report_data { 50 + int num_touches; 51 + struct pixcir_touch touches[PIXCIR_MAX_SLOTS]; 52 + }; 53 + 54 + static void pixcir_ts_parse(struct pixcir_i2c_ts_data *tsdata, 55 + struct pixcir_report_data *report) 37 56 { 38 - struct pixcir_i2c_ts_data *tsdata = data; 39 - u8 rdbuf[10], wrbuf[1] = { 0 }; 57 + u8 rdbuf[2 + PIXCIR_MAX_SLOTS * 5]; 58 + u8 wrbuf[1] = { 0 }; 59 + u8 *bufptr; 40 60 u8 touch; 41 - int ret; 61 + int ret, i; 62 + int readsize; 63 + const struct pixcir_i2c_chip_data *chip = &tsdata->pdata->chip; 64 + 65 + memset(report, 0, sizeof(struct pixcir_report_data)); 66 + 67 + i = chip->has_hw_ids ? 1 : 0; 68 + readsize = 2 + tsdata->max_fingers * (4 + i); 69 + if (readsize > sizeof(rdbuf)) 70 + readsize = sizeof(rdbuf); 42 71 43 72 ret = i2c_master_send(tsdata->client, wrbuf, sizeof(wrbuf)); 44 73 if (ret != sizeof(wrbuf)) { ··· 77 48 return; 78 49 } 79 50 80 - ret = i2c_master_recv(tsdata->client, rdbuf, sizeof(rdbuf)); 51 + ret = i2c_master_recv(tsdata->client, rdbuf, readsize); 81 52 if (ret != sizeof(rdbuf)) { 82 53 dev_err(&tsdata->client->dev, 83 54 "%s: i2c_master_recv failed(), ret=%d\n", ··· 85 56 return; 86 57 } 87 58 88 - touch = rdbuf[0]; 89 - if (touch) { 90 - u16 posx1 = (rdbuf[3] << 8) | rdbuf[2]; 91 - u16 posy1 = (rdbuf[5] << 8) | rdbuf[4]; 92 - u16 posx2 = (rdbuf[7] << 8) | rdbuf[6]; 93 - u16 posy2 = (rdbuf[9] << 8) | rdbuf[8]; 59 + touch = rdbuf[0] & 0x7; 60 + if (touch > tsdata->max_fingers) 61 + touch = tsdata->max_fingers; 94 62 95 - input_report_key(tsdata->input, BTN_TOUCH, 1); 96 - input_report_abs(tsdata->input, ABS_X, posx1); 97 - input_report_abs(tsdata->input, ABS_Y, posy1); 63 + report->num_touches = touch; 64 + bufptr = &rdbuf[2]; 98 65 99 - input_report_abs(tsdata->input, ABS_MT_POSITION_X, posx1); 100 - input_report_abs(tsdata->input, ABS_MT_POSITION_Y, posy1); 101 - input_mt_sync(tsdata->input); 66 + for (i = 0; i < touch; i++) { 67 + report->touches[i].x = (bufptr[1] << 8) | bufptr[0]; 68 + report->touches[i].y = (bufptr[3] << 8) | bufptr[2]; 102 69 103 - if (touch == 2) { 104 - input_report_abs(tsdata->input, 105 - ABS_MT_POSITION_X, posx2); 106 - input_report_abs(tsdata->input, 107 - ABS_MT_POSITION_Y, posy2); 108 - input_mt_sync(tsdata->input); 70 + if (chip->has_hw_ids) { 71 + report->touches[i].id = bufptr[4]; 72 + bufptr = bufptr + 5; 73 + } else { 74 + bufptr = bufptr + 4; 109 75 } 110 - } else { 111 - input_report_key(tsdata->input, BTN_TOUCH, 0); 76 + } 77 + } 78 + 79 + static void pixcir_ts_report(struct pixcir_i2c_ts_data *ts, 80 + struct pixcir_report_data *report) 81 + { 82 + struct input_mt_pos pos[PIXCIR_MAX_SLOTS]; 83 + int slots[PIXCIR_MAX_SLOTS]; 84 + struct pixcir_touch *touch; 85 + int n, i, slot; 86 + struct device *dev = &ts->client->dev; 87 + const struct pixcir_i2c_chip_data *chip = &ts->pdata->chip; 88 + 89 + n = report->num_touches; 90 + if (n > PIXCIR_MAX_SLOTS) 91 + n = PIXCIR_MAX_SLOTS; 92 + 93 + if (!chip->has_hw_ids) { 94 + for (i = 0; i < n; i++) { 95 + touch = &report->touches[i]; 96 + pos[i].x = touch->x; 97 + pos[i].y = touch->y; 98 + } 99 + 100 + input_mt_assign_slots(ts->input, slots, pos, n); 112 101 } 113 102 114 - input_sync(tsdata->input); 103 + for (i = 0; i < n; i++) { 104 + touch = &report->touches[i]; 105 + 106 + if (chip->has_hw_ids) { 107 + slot = input_mt_get_slot_by_key(ts->input, touch->id); 108 + if (slot < 0) { 109 + dev_dbg(dev, "no free slot for id 0x%x\n", 110 + touch->id); 111 + continue; 112 + } 113 + } else { 114 + slot = slots[i]; 115 + } 116 + 117 + input_mt_slot(ts->input, slot); 118 + input_mt_report_slot_state(ts->input, 119 + MT_TOOL_FINGER, true); 120 + 121 + input_event(ts->input, EV_ABS, ABS_MT_POSITION_X, touch->x); 122 + input_event(ts->input, EV_ABS, ABS_MT_POSITION_Y, touch->y); 123 + 124 + dev_dbg(dev, "%d: slot %d, x %d, y %d\n", 125 + i, slot, touch->x, touch->y); 126 + } 127 + 128 + input_mt_sync_frame(ts->input); 129 + input_sync(ts->input); 115 130 } 116 131 117 132 static irqreturn_t pixcir_ts_isr(int irq, void *dev_id) 118 133 { 119 134 struct pixcir_i2c_ts_data *tsdata = dev_id; 120 - const struct pixcir_ts_platform_data *pdata = tsdata->chip; 135 + const struct pixcir_ts_platform_data *pdata = tsdata->pdata; 136 + struct pixcir_report_data report; 121 137 122 138 while (tsdata->running) { 123 - pixcir_ts_poscheck(tsdata); 139 + /* parse packet */ 140 + pixcir_ts_parse(tsdata, &report); 124 141 125 - if (gpio_get_value(pdata->gpio_attb)) 142 + /* report it */ 143 + pixcir_ts_report(tsdata, &report); 144 + 145 + if (gpio_get_value(pdata->gpio_attb)) { 146 + if (report.num_touches) { 147 + /* 148 + * Last report with no finger up? 149 + * Do it now then. 150 + */ 151 + input_mt_sync_frame(tsdata->input); 152 + input_sync(tsdata->input); 153 + } 126 154 break; 155 + } 127 156 128 157 msleep(20); 129 158 } ··· 410 323 static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops, 411 324 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); 412 325 326 + #ifdef CONFIG_OF 327 + static const struct of_device_id pixcir_of_match[]; 328 + 329 + static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev) 330 + { 331 + struct pixcir_ts_platform_data *pdata; 332 + struct device_node *np = dev->of_node; 333 + const struct of_device_id *match; 334 + 335 + match = of_match_device(of_match_ptr(pixcir_of_match), dev); 336 + if (!match) 337 + return ERR_PTR(-EINVAL); 338 + 339 + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 340 + if (!pdata) 341 + return ERR_PTR(-ENOMEM); 342 + 343 + pdata->chip = *(const struct pixcir_i2c_chip_data *)match->data; 344 + 345 + pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0); 346 + /* gpio_attb validity is checked in probe */ 347 + 348 + if (of_property_read_u32(np, "touchscreen-size-x", &pdata->x_max)) { 349 + dev_err(dev, "Failed to get touchscreen-size-x property\n"); 350 + return ERR_PTR(-EINVAL); 351 + } 352 + pdata->x_max -= 1; 353 + 354 + if (of_property_read_u32(np, "touchscreen-size-y", &pdata->y_max)) { 355 + dev_err(dev, "Failed to get touchscreen-size-y property\n"); 356 + return ERR_PTR(-EINVAL); 357 + } 358 + pdata->y_max -= 1; 359 + 360 + dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__, 361 + pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb); 362 + 363 + return pdata; 364 + } 365 + #else 366 + static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev) 367 + { 368 + return ERR_PTR(-EINVAL); 369 + } 370 + #endif 371 + 413 372 static int pixcir_i2c_ts_probe(struct i2c_client *client, 414 373 const struct i2c_device_id *id) 415 374 { 416 375 const struct pixcir_ts_platform_data *pdata = 417 376 dev_get_platdata(&client->dev); 418 377 struct device *dev = &client->dev; 378 + struct device_node *np = dev->of_node; 419 379 struct pixcir_i2c_ts_data *tsdata; 420 380 struct input_dev *input; 421 381 int error; 382 + 383 + if (np && !pdata) { 384 + pdata = pixcir_parse_dt(dev); 385 + if (IS_ERR(pdata)) 386 + return PTR_ERR(pdata); 387 + } 422 388 423 389 if (!pdata) { 424 390 dev_err(&client->dev, "platform data not defined\n"); ··· 480 340 481 341 if (!gpio_is_valid(pdata->gpio_attb)) { 482 342 dev_err(dev, "Invalid gpio_attb in pdata\n"); 343 + return -EINVAL; 344 + } 345 + 346 + if (!pdata->chip.max_fingers) { 347 + dev_err(dev, "Invalid max_fingers in pdata\n"); 483 348 return -EINVAL; 484 349 } 485 350 ··· 500 355 501 356 tsdata->client = client; 502 357 tsdata->input = input; 503 - tsdata->chip = pdata; 358 + tsdata->pdata = pdata; 504 359 505 360 input->name = client->name; 506 361 input->id.bustype = BUS_I2C; ··· 515 370 input_set_abs_params(input, ABS_Y, 0, pdata->y_max, 0, 0); 516 371 input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0); 517 372 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0); 373 + 374 + tsdata->max_fingers = tsdata->pdata->chip.max_fingers; 375 + if (tsdata->max_fingers > PIXCIR_MAX_SLOTS) { 376 + tsdata->max_fingers = PIXCIR_MAX_SLOTS; 377 + dev_info(dev, "Limiting maximum fingers to %d\n", 378 + tsdata->max_fingers); 379 + } 380 + 381 + error = input_mt_init_slots(input, tsdata->max_fingers, 382 + INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED); 383 + if (error) { 384 + dev_err(dev, "Error initializing Multi-Touch slots\n"); 385 + return error; 386 + } 518 387 519 388 input_set_drvdata(input, tsdata); 520 389 ··· 578 419 579 420 static const struct i2c_device_id pixcir_i2c_ts_id[] = { 580 421 { "pixcir_ts", 0 }, 422 + { "pixcir_tangoc", 0 }, 581 423 { } 582 424 }; 583 425 MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id); 426 + 427 + #ifdef CONFIG_OF 428 + static const struct pixcir_i2c_chip_data pixcir_ts_data = { 429 + .max_fingers = 2, 430 + /* no hw id support */ 431 + }; 432 + 433 + static const struct pixcir_i2c_chip_data pixcir_tangoc_data = { 434 + .max_fingers = 5, 435 + .has_hw_ids = true, 436 + }; 437 + 438 + static const struct of_device_id pixcir_of_match[] = { 439 + { .compatible = "pixcir,pixcir_ts", .data = &pixcir_ts_data }, 440 + { .compatible = "pixcir,pixcir_tangoc", .data = &pixcir_tangoc_data }, 441 + { } 442 + }; 443 + MODULE_DEVICE_TABLE(of, pixcir_of_match); 444 + #endif 584 445 585 446 static struct i2c_driver pixcir_i2c_ts_driver = { 586 447 .driver = { 587 448 .owner = THIS_MODULE, 588 449 .name = "pixcir_ts", 589 450 .pm = &pixcir_dev_pm_ops, 451 + .of_match_table = of_match_ptr(pixcir_of_match), 590 452 }, 591 453 .probe = pixcir_i2c_ts_probe, 592 454 .remove = pixcir_i2c_ts_remove,
+2 -2
drivers/input/touchscreen/s3c2410_ts.c
··· 264 264 return -ENOENT; 265 265 } 266 266 267 - clk_enable(ts.clock); 267 + clk_prepare_enable(ts.clock); 268 268 dev_dbg(dev, "got and enabled clocks\n"); 269 269 270 270 ts.irq_tc = ret = platform_get_irq(pdev, 0); ··· 369 369 free_irq(ts.irq_tc, ts.input); 370 370 del_timer_sync(&touch_timer); 371 371 372 - clk_disable(ts.clock); 372 + clk_disable_unprepare(ts.clock); 373 373 clk_put(ts.clock); 374 374 375 375 input_unregister_device(ts.input);
+31
drivers/input/touchscreen/zforce_ts.c
··· 29 29 #include <linux/sysfs.h> 30 30 #include <linux/input/mt.h> 31 31 #include <linux/platform_data/zforce_ts.h> 32 + #include <linux/regulator/consumer.h> 33 + #include <linux/delay.h> 32 34 #include <linux/of.h> 33 35 #include <linux/of_gpio.h> 34 36 ··· 118 116 struct input_dev *input; 119 117 const struct zforce_ts_platdata *pdata; 120 118 char phys[32]; 119 + 120 + struct regulator *reg_vdd; 121 121 122 122 bool suspending; 123 123 bool suspended; ··· 694 690 struct zforce_ts *ts = data; 695 691 696 692 gpio_set_value(ts->pdata->gpio_rst, 0); 693 + 694 + udelay(10); 695 + 696 + if (!IS_ERR(ts->reg_vdd)) 697 + regulator_disable(ts->reg_vdd); 697 698 } 698 699 699 700 static struct zforce_ts_platdata *zforce_parse_dt(struct device *dev) ··· 774 765 return ret; 775 766 } 776 767 768 + ts->reg_vdd = devm_regulator_get_optional(&client->dev, "vdd"); 769 + if (IS_ERR(ts->reg_vdd)) { 770 + ret = PTR_ERR(ts->reg_vdd); 771 + if (ret == -EPROBE_DEFER) 772 + return ret; 773 + } else { 774 + ret = regulator_enable(ts->reg_vdd); 775 + if (ret) 776 + return ret; 777 + 778 + /* 779 + * according to datasheet add 100us grace time after regular 780 + * regulator enable delay. 781 + */ 782 + udelay(100); 783 + } 784 + 777 785 ret = devm_add_action(&client->dev, zforce_reset, ts); 778 786 if (ret) { 779 787 dev_err(&client->dev, "failed to register reset action, %d\n", 780 788 ret); 789 + 790 + /* hereafter the regulator will be disabled by the action */ 791 + if (!IS_ERR(ts->reg_vdd)) 792 + regulator_disable(ts->reg_vdd); 793 + 781 794 return ret; 782 795 } 783 796
-4
drivers/platform/chrome/chromeos_laptop.c
··· 97 97 .irqflags = IRQF_TRIGGER_FALLING, 98 98 .t19_num_keys = ARRAY_SIZE(mxt_t19_keys), 99 99 .t19_keymap = mxt_t19_keys, 100 - .config = NULL, 101 - .config_length = 0, 102 100 }; 103 101 104 102 static struct i2c_board_info atmel_224s_tp_device = { ··· 107 109 108 110 static struct mxt_platform_data atmel_1664s_platform_data = { 109 111 .irqflags = IRQF_TRIGGER_FALLING, 110 - .config = NULL, 111 - .config_length = 0, 112 112 }; 113 113 114 114 static struct i2c_board_info atmel_1664s_device = {
+5
include/linux/hid.h
··· 312 312 #define HID_GROUP_RMI 0x0100 313 313 314 314 /* 315 + * Vendor specific HID device groups 316 + */ 317 + #define HID_GROUP_WACOM 0x0101 318 + 319 + /* 315 320 * This is the global environment of the parser. This information is 316 321 * persistent for main-items. The global environment can be saved and 317 322 * restored with PUSH/POP statements.
-3
include/linux/i2c/atmel_mxt_ts.h
··· 17 17 18 18 /* The platform data for the Atmel maXTouch touchscreen driver */ 19 19 struct mxt_platform_data { 20 - const u8 *config; 21 - size_t config_length; 22 - u32 config_crc; 23 20 unsigned long irqflags; 24 21 u8 t19_num_keys; 25 22 const unsigned int *t19_keymap;
+12
include/linux/input/pixcir_ts.h
··· 43 43 #define PIXCIR_INT_ENABLE (1UL << 3) 44 44 #define PIXCIR_INT_POL_HIGH (1UL << 2) 45 45 46 + /** 47 + * struct pixcir_irc_chip_data - chip related data 48 + * @max_fingers: Max number of fingers reported simultaneously by h/w 49 + * @has_hw_ids: Hardware supports finger tracking IDs 50 + * 51 + */ 52 + struct pixcir_i2c_chip_data { 53 + u8 max_fingers; 54 + bool has_hw_ids; 55 + }; 56 + 46 57 struct pixcir_ts_platform_data { 47 58 int x_max; 48 59 int y_max; 49 60 int gpio_attb; /* GPIO connected to ATTB line */ 61 + struct pixcir_i2c_chip_data chip; 50 62 }; 51 63 52 64 #endif
+1
include/uapi/linux/serio.h
··· 76 76 #define SERIO_HAMPSHIRE 0x3b 77 77 #define SERIO_PS2MULT 0x3c 78 78 #define SERIO_TSC40 0x3d 79 + #define SERIO_WACOM_IV 0x3e 79 80 80 81 #endif /* _UAPI_SERIO_H */
+9
include/uapi/linux/uinput.h
··· 84 84 */ 85 85 #define UI_GET_SYSNAME(len) _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 300, len) 86 86 87 + /** 88 + * UI_GET_VERSION - Return version of uinput protocol 89 + * 90 + * This writes uinput protocol version implemented by the kernel into 91 + * the integer pointed to by the ioctl argument. The protocol version 92 + * is hard-coded in the kernel and is independent of the uinput device. 93 + */ 94 + #define UI_GET_VERSION _IOR(UINPUT_IOCTL_BASE, 301, unsigned int) 95 + 87 96 /* 88 97 * To write a force-feedback-capable driver, the upload_effect 89 98 * and erase_effect callbacks in input_dev must be implemented.