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

Merge branch 'next' into for-linus

Conflicts:
include/linux/input.h

+3235 -787
+4
Documentation/DocBook/device-drivers.tmpl
··· 304 304 !Edrivers/input/ff-core.c 305 305 !Edrivers/input/ff-memless.c 306 306 </sect1> 307 + <sect1><title>Multitouch Library</title> 308 + !Iinclude/linux/input/mt.h 309 + !Edrivers/input/input-mt.c 310 + </sect1> 307 311 <sect1><title>Polled input devices</title> 308 312 !Iinclude/linux/input-polldev.h 309 313 !Edrivers/input/input-polldev.c
+115
Documentation/input/cma3000_d0x.txt
··· 1 + Kernel driver for CMA3000-D0x 2 + ============================ 3 + 4 + Supported chips: 5 + * VTI CMA3000-D0x 6 + Datasheet: 7 + CMA3000-D0X Product Family Specification 8281000A.02.pdf 8 + <http://www.vti.fi/en/> 9 + 10 + Author: Hemanth V <hemanthv@ti.com> 11 + 12 + 13 + Description 14 + ----------- 15 + CMA3000 Tri-axis accelerometer supports Motion detect, Measurement and 16 + Free fall modes. 17 + 18 + Motion Detect Mode: Its the low power mode where interrupts are generated only 19 + when motion exceeds the defined thresholds. 20 + 21 + Measurement Mode: This mode is used to read the acceleration data on X,Y,Z 22 + axis and supports 400, 100, 40 Hz sample frequency. 23 + 24 + Free fall Mode: This mode is intended to save system resources. 25 + 26 + Threshold values: Chip supports defining threshold values for above modes 27 + which includes time and g value. Refer product specifications for more details. 28 + 29 + CMA3000 chip supports mutually exclusive I2C and SPI interfaces for 30 + communication, currently the driver supports I2C based communication only. 31 + Initial configuration for bus mode is set in non volatile memory and can later 32 + be modified through bus interface command. 33 + 34 + Driver reports acceleration data through input subsystem. It generates ABS_MISC 35 + event with value 1 when free fall is detected. 36 + 37 + Platform data need to be configured for initial default values. 38 + 39 + Platform Data 40 + ------------- 41 + fuzz_x: Noise on X Axis 42 + 43 + fuzz_y: Noise on Y Axis 44 + 45 + fuzz_z: Noise on Z Axis 46 + 47 + g_range: G range in milli g i.e 2000 or 8000 48 + 49 + mode: Default Operating mode 50 + 51 + mdthr: Motion detect g range threshold value 52 + 53 + mdfftmr: Motion detect and free fall time threshold value 54 + 55 + ffthr: Free fall g range threshold value 56 + 57 + Input Interface 58 + -------------- 59 + Input driver version is 1.0.0 60 + Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0 61 + Input device name: "cma3000-accelerometer" 62 + Supported events: 63 + Event type 0 (Sync) 64 + Event type 3 (Absolute) 65 + Event code 0 (X) 66 + Value 47 67 + Min -8000 68 + Max 8000 69 + Fuzz 200 70 + Event code 1 (Y) 71 + Value -28 72 + Min -8000 73 + Max 8000 74 + Fuzz 200 75 + Event code 2 (Z) 76 + Value 905 77 + Min -8000 78 + Max 8000 79 + Fuzz 200 80 + Event code 40 (Misc) 81 + Value 0 82 + Min 0 83 + Max 1 84 + Event type 4 (Misc) 85 + 86 + 87 + Register/Platform parameters Description 88 + ---------------------------------------- 89 + 90 + mode: 91 + 0: power down mode 92 + 1: 100 Hz Measurement mode 93 + 2: 400 Hz Measurement mode 94 + 3: 40 Hz Measurement mode 95 + 4: Motion Detect mode (default) 96 + 5: 100 Hz Free fall mode 97 + 6: 40 Hz Free fall mode 98 + 7: Power off mode 99 + 100 + grange: 101 + 2000: 2000 mg or 2G Range 102 + 8000: 8000 mg or 8G Range 103 + 104 + mdthr: 105 + X: X * 71mg (8G Range) 106 + X: X * 18mg (2G Range) 107 + 108 + mdfftmr: 109 + X: (X & 0x70) * 100 ms (MDTMR) 110 + (X & 0x0F) * 2.5 ms (FFTMR 400 Hz) 111 + (X & 0x0F) * 10 ms (FFTMR 100 Hz) 112 + 113 + ffthr: 114 + X: (X >> 2) * 18mg (2G Range) 115 + X: (X & 0x0F) * 71 mg (8G Range)
+34 -19
Documentation/input/multi-touch-protocol.txt
··· 1 1 Multi-touch (MT) Protocol 2 2 ------------------------- 3 - Copyright (C) 2009 Henrik Rydberg <rydberg@euromail.se> 3 + Copyright (C) 2009-2010 Henrik Rydberg <rydberg@euromail.se> 4 4 5 5 6 6 Introduction ··· 161 161 ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than 162 162 unity, is related to the contact pressure. For pressure-based devices, 163 163 ABS_MT_PRESSURE may be used to provide the pressure on the contact area 164 - instead. 164 + instead. Devices capable of contact hovering can use ABS_MT_DISTANCE to 165 + indicate the distance between the contact and the surface. 165 166 166 167 In addition to the MAJOR parameters, the oval shape of the contact can be 167 168 described by adding the MINOR parameters, such that MAJOR and MINOR are the 168 169 major and minor axis of an ellipse. Finally, the orientation of the oval 169 170 shape can be describe with the ORIENTATION parameter. 170 171 172 + For type A devices, further specification of the touch shape is possible 173 + via ABS_MT_BLOB_ID. 174 + 171 175 The ABS_MT_TOOL_TYPE may be used to specify whether the touching tool is a 172 - contact or a pen or something else. Devices with more granular information 173 - may specify general shapes as blobs, i.e., as a sequence of rectangular 174 - shapes grouped together by an ABS_MT_BLOB_ID. Finally, for the few devices 175 - that currently support it, the ABS_MT_TRACKING_ID event may be used to 176 - report contact tracking from hardware [5]. 176 + finger or a pen or something else. Finally, the ABS_MT_TRACKING_ID event 177 + may be used to track identified contacts over time [5]. 178 + 179 + In the type B protocol, ABS_MT_TOOL_TYPE and ABS_MT_TRACKING_ID are 180 + implicitly handled by input core; drivers should instead call 181 + input_mt_report_slot_state(). 177 182 178 183 179 184 Event Semantics ··· 218 213 of TOUCH and WIDTH for pressure-based devices or any device with a spatial 219 214 signal intensity distribution. 220 215 216 + ABS_MT_DISTANCE 217 + 218 + The distance, in surface units, between the contact and the surface. Zero 219 + distance means the contact is touching the surface. A positive number means 220 + the contact is hovering above the surface. 221 + 221 222 ABS_MT_ORIENTATION 222 223 223 224 The orientation of the ellipse. The value should describe a signed quarter ··· 251 240 The type of approaching tool. A lot of kernel drivers cannot distinguish 252 241 between different tool types, such as a finger or a pen. In such cases, the 253 242 event should be omitted. The protocol currently supports MT_TOOL_FINGER and 254 - MT_TOOL_PEN [2]. 243 + MT_TOOL_PEN [2]. For type B devices, this event is handled by input core; 244 + drivers should instead use input_mt_report_slot_state(). 255 245 256 246 ABS_MT_BLOB_ID 257 247 258 248 The BLOB_ID groups several packets together into one arbitrarily shaped 259 - contact. This is a low-level anonymous grouping for type A devices, and 249 + contact. The sequence of points forms a polygon which defines the shape of 250 + the contact. This is a low-level anonymous grouping for type A devices, and 260 251 should not be confused with the high-level trackingID [5]. Most type A 261 252 devices do not have blob capability, so drivers can safely omit this event. 262 253 263 254 ABS_MT_TRACKING_ID 264 255 265 256 The TRACKING_ID identifies an initiated contact throughout its life cycle 266 - [5]. This event is mandatory for type B devices. The value range of the 267 - TRACKING_ID should be large enough to ensure unique identification of a 268 - contact maintained over an extended period of time. 257 + [5]. The value range of the TRACKING_ID should be large enough to ensure 258 + unique identification of a contact maintained over an extended period of 259 + time. For type B devices, this event is handled by input core; drivers 260 + should instead use input_mt_report_slot_state(). 269 261 270 262 271 263 Event Computation ··· 315 301 Notes 316 302 ----- 317 303 318 - In order to stay compatible with existing applications, the data 319 - reported in a finger packet must not be recognized as single-touch 320 - events. In addition, all finger data must bypass input filtering, 321 - since subsequent events of the same type refer to different fingers. 304 + In order to stay compatible with existing applications, the data reported 305 + in a finger packet must not be recognized as single-touch events. 322 306 323 - The first kernel driver to utilize the MT protocol is the bcm5974 driver, 324 - where examples can be found. 307 + For type A devices, all finger data bypasses input filtering, since 308 + subsequent events of the same type refer to different fingers. 309 + 310 + For example usage of the type A protocol, see the bcm5974 driver. For 311 + example usage of the type B protocol, see the hid-egalax driver. 325 312 326 313 [1] With the extension ABS_MT_APPROACH_X and ABS_MT_APPROACH_Y, the 327 314 difference between the contact position and the approaching tool position 328 315 could be used to derive tilt. 329 316 [2] The list can of course be extended. 330 - [3] Multitouch X driver project: http://bitmath.org/code/multitouch/. 317 + [3] The mtdev project: http://bitmath.org/code/mtdev/. 331 318 [4] See the section on event computation. 332 319 [5] See the section on finger tracking.
+2
MAINTAINERS
··· 3020 3020 INPUT MULTITOUCH (MT) PROTOCOL 3021 3021 M: Henrik Rydberg <rydberg@euromail.se> 3022 3022 L: linux-input@vger.kernel.org 3023 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git 3023 3024 S: Maintained 3024 3025 F: Documentation/input/multi-touch-protocol.txt 3026 + F: drivers/input/input-mt.c 3025 3027 K: \b(ABS|SYN)_MT_ 3026 3028 3027 3029 INTEL IDLE DRIVER
+141
arch/arm/plat-spear/include/plat/keyboard.h
··· 1 + /* 2 + * Copyright (C) 2010 ST Microelectronics 3 + * Rajeev Kumar<rajeev-dlh.kumar@st.com> 4 + * 5 + * This file is licensed under the terms of the GNU General Public 6 + * License version 2. This program is licensed "as is" without any 7 + * warranty of any kind, whether express or implied. 8 + */ 9 + 10 + #ifndef __PLAT_KEYBOARD_H 11 + #define __PLAT_KEYBOARD_H 12 + 13 + #include <linux/bitops.h> 14 + #include <linux/input.h> 15 + #include <linux/input/matrix_keypad.h> 16 + #include <linux/types.h> 17 + 18 + #define DECLARE_KEYMAP(_name) \ 19 + int _name[] = { \ 20 + KEY(0, 0, KEY_ESC), \ 21 + KEY(0, 1, KEY_1), \ 22 + KEY(0, 2, KEY_2), \ 23 + KEY(0, 3, KEY_3), \ 24 + KEY(0, 4, KEY_4), \ 25 + KEY(0, 5, KEY_5), \ 26 + KEY(0, 6, KEY_6), \ 27 + KEY(0, 7, KEY_7), \ 28 + KEY(0, 8, KEY_8), \ 29 + KEY(1, 0, KEY_9), \ 30 + KEY(1, 1, KEY_MINUS), \ 31 + KEY(1, 2, KEY_EQUAL), \ 32 + KEY(1, 3, KEY_BACKSPACE), \ 33 + KEY(1, 4, KEY_TAB), \ 34 + KEY(1, 5, KEY_Q), \ 35 + KEY(1, 6, KEY_W), \ 36 + KEY(1, 7, KEY_E), \ 37 + KEY(1, 8, KEY_R), \ 38 + KEY(2, 0, KEY_T), \ 39 + KEY(2, 1, KEY_Y), \ 40 + KEY(2, 2, KEY_U), \ 41 + KEY(2, 3, KEY_I), \ 42 + KEY(2, 4, KEY_O), \ 43 + KEY(2, 5, KEY_P), \ 44 + KEY(2, 6, KEY_LEFTBRACE), \ 45 + KEY(2, 7, KEY_RIGHTBRACE), \ 46 + KEY(2, 8, KEY_ENTER), \ 47 + KEY(3, 0, KEY_LEFTCTRL), \ 48 + KEY(3, 1, KEY_A), \ 49 + KEY(3, 2, KEY_S), \ 50 + KEY(3, 3, KEY_D), \ 51 + KEY(3, 4, KEY_F), \ 52 + KEY(3, 5, KEY_G), \ 53 + KEY(3, 6, KEY_H), \ 54 + KEY(3, 7, KEY_J), \ 55 + KEY(3, 8, KEY_K), \ 56 + KEY(4, 0, KEY_L), \ 57 + KEY(4, 1, KEY_SEMICOLON), \ 58 + KEY(4, 2, KEY_APOSTROPHE), \ 59 + KEY(4, 3, KEY_GRAVE), \ 60 + KEY(4, 4, KEY_LEFTSHIFT), \ 61 + KEY(4, 5, KEY_BACKSLASH), \ 62 + KEY(4, 6, KEY_Z), \ 63 + KEY(4, 7, KEY_X), \ 64 + KEY(4, 8, KEY_C), \ 65 + KEY(4, 0, KEY_L), \ 66 + KEY(4, 1, KEY_SEMICOLON), \ 67 + KEY(4, 2, KEY_APOSTROPHE), \ 68 + KEY(4, 3, KEY_GRAVE), \ 69 + KEY(4, 4, KEY_LEFTSHIFT), \ 70 + KEY(4, 5, KEY_BACKSLASH), \ 71 + KEY(4, 6, KEY_Z), \ 72 + KEY(4, 7, KEY_X), \ 73 + KEY(4, 8, KEY_C), \ 74 + KEY(4, 0, KEY_L), \ 75 + KEY(4, 1, KEY_SEMICOLON), \ 76 + KEY(4, 2, KEY_APOSTROPHE), \ 77 + KEY(4, 3, KEY_GRAVE), \ 78 + KEY(4, 4, KEY_LEFTSHIFT), \ 79 + KEY(4, 5, KEY_BACKSLASH), \ 80 + KEY(4, 6, KEY_Z), \ 81 + KEY(4, 7, KEY_X), \ 82 + KEY(4, 8, KEY_C), \ 83 + KEY(5, 0, KEY_V), \ 84 + KEY(5, 1, KEY_B), \ 85 + KEY(5, 2, KEY_N), \ 86 + KEY(5, 3, KEY_M), \ 87 + KEY(5, 4, KEY_COMMA), \ 88 + KEY(5, 5, KEY_DOT), \ 89 + KEY(5, 6, KEY_SLASH), \ 90 + KEY(5, 7, KEY_RIGHTSHIFT), \ 91 + KEY(5, 8, KEY_KPASTERISK), \ 92 + KEY(6, 0, KEY_LEFTALT), \ 93 + KEY(6, 1, KEY_SPACE), \ 94 + KEY(6, 2, KEY_CAPSLOCK), \ 95 + KEY(6, 3, KEY_F1), \ 96 + KEY(6, 4, KEY_F2), \ 97 + KEY(6, 5, KEY_F3), \ 98 + KEY(6, 6, KEY_F4), \ 99 + KEY(6, 7, KEY_F5), \ 100 + KEY(6, 8, KEY_F6), \ 101 + KEY(7, 0, KEY_F7), \ 102 + KEY(7, 1, KEY_F8), \ 103 + KEY(7, 2, KEY_F9), \ 104 + KEY(7, 3, KEY_F10), \ 105 + KEY(7, 4, KEY_NUMLOCK), \ 106 + KEY(7, 5, KEY_SCROLLLOCK), \ 107 + KEY(7, 6, KEY_KP7), \ 108 + KEY(7, 7, KEY_KP8), \ 109 + KEY(7, 8, KEY_KP9), \ 110 + KEY(8, 0, KEY_KPMINUS), \ 111 + KEY(8, 1, KEY_KP4), \ 112 + KEY(8, 2, KEY_KP5), \ 113 + KEY(8, 3, KEY_KP6), \ 114 + KEY(8, 4, KEY_KPPLUS), \ 115 + KEY(8, 5, KEY_KP1), \ 116 + KEY(8, 6, KEY_KP2), \ 117 + KEY(8, 7, KEY_KP3), \ 118 + KEY(8, 8, KEY_KP0), \ 119 + } 120 + 121 + /** 122 + * struct kbd_platform_data - spear keyboard platform data 123 + * keymap: pointer to keymap data (table and size) 124 + * rep: enables key autorepeat 125 + * 126 + * This structure is supposed to be used by platform code to supply 127 + * keymaps to drivers that implement keyboards. 128 + */ 129 + struct kbd_platform_data { 130 + const struct matrix_keymap_data *keymap; 131 + bool rep; 132 + }; 133 + 134 + /* This function is used to set platform data field of pdev->dev */ 135 + static inline void 136 + kbd_set_plat_data(struct platform_device *pdev, struct kbd_platform_data *data) 137 + { 138 + pdev->dev.platform_data = data; 139 + } 140 + 141 + #endif /* __PLAT_KEYBOARD_H */
+2 -1
drivers/hid/Kconfig
··· 154 154 tristate "eGalax multi-touch panel" 155 155 depends on USB_HID 156 156 ---help--- 157 - Support for the eGalax dual-touch panel. 157 + Support for the eGalax dual-touch panels, including the 158 + Joojoo and Wetab tablets. 158 159 159 160 config HID_ELECOM 160 161 tristate "ELECOM BM084 bluetooth mouse"
+4 -32
drivers/hid/hid-3m-pct.c
··· 19 19 #include <linux/module.h> 20 20 #include <linux/slab.h> 21 21 #include <linux/usb.h> 22 + #include <linux/input/mt.h> 22 23 23 24 MODULE_AUTHOR("Stephane Chatty <chatty@enac.fr>"); 24 25 MODULE_DESCRIPTION("3M PCT multitouch panels"); ··· 28 27 #include "hid-ids.h" 29 28 30 29 #define MAX_SLOTS 60 31 - #define MAX_TRKID USHRT_MAX 32 - #define MAX_EVENTS 360 33 30 34 31 /* estimated signal-to-noise ratios */ 35 32 #define SN_MOVE 2048 ··· 35 36 36 37 struct mmm_finger { 37 38 __s32 x, y, w, h; 38 - __u16 id; 39 - bool prev_touch; 40 39 bool touch, valid; 41 40 }; 42 41 43 42 struct mmm_data { 44 43 struct mmm_finger f[MAX_SLOTS]; 45 - __u16 id; 46 44 __u8 curid; 47 45 __u8 nexp, nreal; 48 46 bool touch, valid; ··· 113 117 0, 1, 0, 0); 114 118 return 1; 115 119 case HID_DG_CONTACTID: 116 - field->logical_maximum = MAX_TRKID; 117 - hid_map_usage(hi, usage, bit, max, 118 - EV_ABS, ABS_MT_TRACKING_ID); 119 - input_set_abs_params(hi->input, ABS_MT_TRACKING_ID, 120 - 0, MAX_TRKID, 0, 0); 121 - if (!hi->input->mt) 122 - input_mt_create_slots(hi->input, MAX_SLOTS); 123 - input_set_events_per_packet(hi->input, MAX_EVENTS); 120 + input_mt_init_slots(hi->input, MAX_SLOTS); 124 121 return 1; 125 122 } 126 123 /* let hid-input decide for the others */ ··· 143 154 */ 144 155 static void mmm_filter_event(struct mmm_data *md, struct input_dev *input) 145 156 { 146 - struct mmm_finger *oldest = 0; 147 157 int i; 148 158 for (i = 0; i < MAX_SLOTS; ++i) { 149 159 struct mmm_finger *f = &md->f[i]; ··· 151 163 continue; 152 164 } 153 165 input_mt_slot(input, i); 166 + input_mt_report_slot_state(input, MT_TOOL_FINGER, f->touch); 154 167 if (f->touch) { 155 168 /* this finger is on the screen */ 156 169 int wide = (f->w > f->h); ··· 159 170 int major = max(f->w, f->h) >> 1; 160 171 int minor = min(f->w, f->h) >> 1; 161 172 162 - if (!f->prev_touch) 163 - f->id = md->id++; 164 - input_event(input, EV_ABS, ABS_MT_TRACKING_ID, f->id); 165 173 input_event(input, EV_ABS, ABS_MT_POSITION_X, f->x); 166 174 input_event(input, EV_ABS, ABS_MT_POSITION_Y, f->y); 167 175 input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide); 168 176 input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major); 169 177 input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor); 170 - /* touchscreen emulation: pick the oldest contact */ 171 - if (!oldest || ((f->id - oldest->id) & (SHRT_MAX + 1))) 172 - oldest = f; 173 - } else { 174 - /* this finger took off the screen */ 175 - input_event(input, EV_ABS, ABS_MT_TRACKING_ID, -1); 176 178 } 177 - f->prev_touch = f->touch; 178 179 f->valid = 0; 179 180 } 180 181 181 - /* touchscreen emulation */ 182 - if (oldest) { 183 - input_event(input, EV_KEY, BTN_TOUCH, 1); 184 - input_event(input, EV_ABS, ABS_X, oldest->x); 185 - input_event(input, EV_ABS, ABS_Y, oldest->y); 186 - } else { 187 - input_event(input, EV_KEY, BTN_TOUCH, 0); 188 - } 182 + input_mt_report_pointer_emulation(input, true); 189 183 input_sync(input); 190 184 } 191 185
+3
drivers/hid/hid-core.c
··· 1300 1300 { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) }, 1301 1301 { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) }, 1302 1302 { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) }, 1303 + { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) }, 1304 + { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) }, 1305 + { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, 1303 1306 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, 1304 1307 { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, 1305 1308 { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
+57 -74
drivers/hid/hid-egalax.c
··· 2 2 * HID driver for eGalax dual-touch panels 3 3 * 4 4 * Copyright (c) 2010 Stephane Chatty <chatty@enac.fr> 5 + * Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se> 6 + * Copyright (c) 2010 Canonical, Ltd. 5 7 * 6 8 */ 7 9 ··· 18 16 #include <linux/hid.h> 19 17 #include <linux/module.h> 20 18 #include <linux/usb.h> 19 + #include <linux/input/mt.h> 21 20 #include <linux/slab.h> 22 21 #include "usbhid/usbhid.h" 23 22 ··· 28 25 29 26 #include "hid-ids.h" 30 27 28 + #define MAX_SLOTS 2 29 + 30 + /* estimated signal-to-noise ratios */ 31 + #define SN_MOVE 4096 32 + #define SN_PRESSURE 32 33 + 31 34 struct egalax_data { 32 - __u16 x, y, z; 33 - __u8 id; 34 - bool first; /* is this the first finger in the frame? */ 35 - bool valid; /* valid finger data, or just placeholder? */ 36 - bool activity; /* at least one active finger previously? */ 37 - __u16 lastx, lasty, lastz; /* latest valid (x, y, z) in the frame */ 35 + int valid; 36 + int slot; 37 + int touch; 38 + int x, y, z; 38 39 }; 40 + 41 + static void set_abs(struct input_dev *input, unsigned int code, 42 + struct hid_field *field, int snratio) 43 + { 44 + int fmin = field->logical_minimum; 45 + int fmax = field->logical_maximum; 46 + int fuzz = snratio ? (fmax - fmin) / snratio : 0; 47 + input_set_abs_params(input, code, fmin, fmax, fuzz, 0); 48 + } 39 49 40 50 static int egalax_input_mapping(struct hid_device *hdev, struct hid_input *hi, 41 51 struct hid_field *field, struct hid_usage *usage, 42 52 unsigned long **bit, int *max) 43 53 { 54 + struct input_dev *input = hi->input; 55 + 44 56 switch (usage->hid & HID_USAGE_PAGE) { 45 57 46 58 case HID_UP_GENDESK: 47 59 switch (usage->hid) { 48 60 case HID_GD_X: 61 + field->logical_maximum = 32760; 49 62 hid_map_usage(hi, usage, bit, max, 50 63 EV_ABS, ABS_MT_POSITION_X); 64 + set_abs(input, ABS_MT_POSITION_X, field, SN_MOVE); 51 65 /* touchscreen emulation */ 52 - input_set_abs_params(hi->input, ABS_X, 53 - field->logical_minimum, 54 - field->logical_maximum, 0, 0); 66 + set_abs(input, ABS_X, field, SN_MOVE); 55 67 return 1; 56 68 case HID_GD_Y: 69 + field->logical_maximum = 32760; 57 70 hid_map_usage(hi, usage, bit, max, 58 71 EV_ABS, ABS_MT_POSITION_Y); 72 + set_abs(input, ABS_MT_POSITION_Y, field, SN_MOVE); 59 73 /* touchscreen emulation */ 60 - input_set_abs_params(hi->input, ABS_Y, 61 - field->logical_minimum, 62 - field->logical_maximum, 0, 0); 74 + set_abs(input, ABS_Y, field, SN_MOVE); 63 75 return 1; 64 76 } 65 77 return 0; ··· 84 66 case HID_DG_TIPSWITCH: 85 67 /* touchscreen emulation */ 86 68 hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); 69 + input_set_capability(input, EV_KEY, BTN_TOUCH); 87 70 return 1; 88 71 case HID_DG_INRANGE: 89 72 case HID_DG_CONFIDENCE: ··· 92 73 case HID_DG_CONTACTMAX: 93 74 return -1; 94 75 case HID_DG_CONTACTID: 95 - hid_map_usage(hi, usage, bit, max, 96 - EV_ABS, ABS_MT_TRACKING_ID); 76 + input_mt_init_slots(input, MAX_SLOTS); 97 77 return 1; 98 78 case HID_DG_TIPPRESSURE: 79 + field->logical_minimum = 0; 99 80 hid_map_usage(hi, usage, bit, max, 100 81 EV_ABS, ABS_MT_PRESSURE); 82 + set_abs(input, ABS_MT_PRESSURE, field, SN_PRESSURE); 101 83 /* touchscreen emulation */ 102 - input_set_abs_params(hi->input, ABS_PRESSURE, 103 - field->logical_minimum, 104 - field->logical_maximum, 0, 0); 84 + set_abs(input, ABS_PRESSURE, field, SN_PRESSURE); 105 85 return 1; 106 86 } 107 87 return 0; ··· 114 96 struct hid_field *field, struct hid_usage *usage, 115 97 unsigned long **bit, int *max) 116 98 { 99 + /* tell hid-input to skip setup of these event types */ 117 100 if (usage->type == EV_KEY || usage->type == EV_ABS) 118 - clear_bit(usage->code, *bit); 119 - 120 - return 0; 101 + set_bit(usage->type, hi->input->evbit); 102 + return -1; 121 103 } 122 104 123 105 /* ··· 126 108 */ 127 109 static void egalax_filter_event(struct egalax_data *td, struct input_dev *input) 128 110 { 129 - td->first = !td->first; /* touchscreen emulation */ 130 - 131 - if (td->valid) { 132 - /* emit multitouch events */ 133 - input_event(input, EV_ABS, ABS_MT_TRACKING_ID, td->id); 134 - input_event(input, EV_ABS, ABS_MT_POSITION_X, td->x >> 3); 135 - input_event(input, EV_ABS, ABS_MT_POSITION_Y, td->y >> 3); 111 + input_mt_slot(input, td->slot); 112 + input_mt_report_slot_state(input, MT_TOOL_FINGER, td->touch); 113 + if (td->touch) { 114 + input_event(input, EV_ABS, ABS_MT_POSITION_X, td->x); 115 + input_event(input, EV_ABS, ABS_MT_POSITION_Y, td->y); 136 116 input_event(input, EV_ABS, ABS_MT_PRESSURE, td->z); 137 - 138 - input_mt_sync(input); 139 - 140 - /* 141 - * touchscreen emulation: store (x, y) as 142 - * the last valid values in this frame 143 - */ 144 - td->lastx = td->x; 145 - td->lasty = td->y; 146 - td->lastz = td->z; 147 117 } 148 - 149 - /* 150 - * touchscreen emulation: if this is the second finger and at least 151 - * one in this frame is valid, the latest valid in the frame is 152 - * the oldest on the panel, the one we want for single touch 153 - */ 154 - if (!td->first && td->activity) { 155 - input_event(input, EV_ABS, ABS_X, td->lastx >> 3); 156 - input_event(input, EV_ABS, ABS_Y, td->lasty >> 3); 157 - input_event(input, EV_ABS, ABS_PRESSURE, td->lastz); 158 - } 159 - 160 - if (!td->valid) { 161 - /* 162 - * touchscreen emulation: if the first finger is invalid 163 - * and there previously was finger activity, this is a release 164 - */ 165 - if (td->first && td->activity) { 166 - input_event(input, EV_KEY, BTN_TOUCH, 0); 167 - td->activity = false; 168 - } 169 - return; 170 - } 171 - 172 - 173 - /* touchscreen emulation: if no previous activity, emit touch event */ 174 - if (!td->activity) { 175 - input_event(input, EV_KEY, BTN_TOUCH, 1); 176 - td->activity = true; 177 - } 118 + input_mt_report_pointer_emulation(input, true); 178 119 } 179 - 180 120 181 121 static int egalax_event(struct hid_device *hid, struct hid_field *field, 182 122 struct hid_usage *usage, __s32 value) ··· 145 169 * uses a standard parallel multitouch protocol (product ID == 146 170 * 48xx). The second is capacitive and uses an unusual "serial" 147 171 * protocol with a different message for each multitouch finger 148 - * (product ID == 72xx). We do not yet generate a correct event 149 - * sequence for the capacitive/serial protocol. 172 + * (product ID == 72xx). 150 173 */ 151 174 if (hid->claimed & HID_CLAIMED_INPUT) { 152 175 struct input_dev *input = field->hidinput->input; 153 176 154 177 switch (usage->hid) { 155 178 case HID_DG_INRANGE: 179 + td->valid = value; 180 + break; 156 181 case HID_DG_CONFIDENCE: 157 182 /* avoid interference from generic hidinput handling */ 158 183 break; 159 184 case HID_DG_TIPSWITCH: 160 - td->valid = value; 185 + td->touch = value; 161 186 break; 162 187 case HID_DG_TIPPRESSURE: 163 188 td->z = value; 164 189 break; 165 190 case HID_DG_CONTACTID: 166 - td->id = value; 191 + td->slot = clamp_val(value, 0, MAX_SLOTS - 1); 167 192 break; 168 193 case HID_GD_X: 169 194 td->x = value; ··· 172 195 case HID_GD_Y: 173 196 td->y = value; 174 197 /* this is the last field in a finger */ 175 - egalax_filter_event(td, input); 198 + if (td->valid) 199 + egalax_filter_event(td, input); 176 200 break; 177 201 case HID_DG_CONTACTCOUNT: 178 202 /* touch emulation: this is the last field in a frame */ 179 - td->first = false; 180 203 break; 181 204 182 205 default: ··· 238 261 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) }, 239 262 { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 240 263 USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) }, 264 + { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 265 + USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2) }, 266 + { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 267 + USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) }, 268 + { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, 269 + USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, 241 270 { } 242 271 }; 243 272 MODULE_DEVICE_TABLE(hid, egalax_devices);
+3
drivers/hid/hid-ids.h
··· 196 196 #define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001 197 197 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH 0x480d 198 198 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1 0x720c 199 + #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH2 0x72a1 200 + #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3 0x480e 201 + #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4 0x726b 199 202 200 203 #define USB_VENDOR_ID_ELECOM 0x056e 201 204 #define USB_DEVICE_ID_ELECOM_BM084 0x0061
+1 -1
drivers/input/Makefile
··· 5 5 # Each configuration option enables a list of files. 6 6 7 7 obj-$(CONFIG_INPUT) += input-core.o 8 - input-core-objs := input.o input-compat.o ff-core.o 8 + input-core-y := input.o input-compat.o input-mt.o ff-core.o 9 9 10 10 obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o 11 11 obj-$(CONFIG_INPUT_POLLDEV) += input-polldev.o
+6 -8
drivers/input/apm-power.c
··· 9 9 * 10 10 */ 11 11 12 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 13 + 12 14 #include <linux/module.h> 13 15 #include <linux/input.h> 14 16 #include <linux/slab.h> ··· 25 23 switch (keycode) { 26 24 case KEY_SUSPEND: 27 25 apm_queue_event(APM_USER_SUSPEND); 28 - 29 - printk(KERN_INFO "apm-power: Requesting system suspend...\n"); 26 + pr_info("Requesting system suspend...\n"); 30 27 break; 31 28 default: 32 29 break; ··· 66 65 67 66 error = input_register_handle(handle); 68 67 if (error) { 69 - printk(KERN_ERR 70 - "apm-power: Failed to register input power handler, " 71 - "error %d\n", error); 68 + pr_err("Failed to register input power handler, error %d\n", 69 + error); 72 70 kfree(handle); 73 71 return error; 74 72 } 75 73 76 74 error = input_open_device(handle); 77 75 if (error) { 78 - printk(KERN_ERR 79 - "apm-power: Failed to open input power device, " 80 - "error %d\n", error); 76 + pr_err("Failed to open input power device, error %d\n", error); 81 77 input_unregister_handle(handle); 82 78 kfree(handle); 83 79 return error;
+10 -8
drivers/input/evbug.c
··· 26 26 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic 27 27 */ 28 28 29 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30 + 29 31 #include <linux/slab.h> 30 32 #include <linux/module.h> 31 33 #include <linux/input.h> ··· 40 38 41 39 static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) 42 40 { 43 - printk(KERN_DEBUG "evbug.c: Event. Dev: %s, Type: %d, Code: %d, Value: %d\n", 44 - dev_name(&handle->dev->dev), type, code, value); 41 + printk(KERN_DEBUG pr_fmt("Event. Dev: %s, Type: %d, Code: %d, Value: %d\n"), 42 + dev_name(&handle->dev->dev), type, code, value); 45 43 } 46 44 47 45 static int evbug_connect(struct input_handler *handler, struct input_dev *dev, ··· 66 64 if (error) 67 65 goto err_unregister_handle; 68 66 69 - printk(KERN_DEBUG "evbug.c: Connected device: %s (%s at %s)\n", 70 - dev_name(&dev->dev), 71 - dev->name ?: "unknown", 72 - dev->phys ?: "unknown"); 67 + printk(KERN_DEBUG pr_fmt("Connected device: %s (%s at %s)\n"), 68 + dev_name(&dev->dev), 69 + dev->name ?: "unknown", 70 + dev->phys ?: "unknown"); 73 71 74 72 return 0; 75 73 ··· 82 80 83 81 static void evbug_disconnect(struct input_handle *handle) 84 82 { 85 - printk(KERN_DEBUG "evbug.c: Disconnected device: %s\n", 86 - dev_name(&handle->dev->dev)); 83 + printk(KERN_DEBUG pr_fmt("Disconnected device: %s\n"), 84 + dev_name(&handle->dev->dev)); 87 85 88 86 input_close_device(handle); 89 87 input_unregister_handle(handle);
+12 -7
drivers/input/evdev.c
··· 8 8 * the Free Software Foundation. 9 9 */ 10 10 11 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 12 + 11 13 #define EVDEV_MINOR_BASE 64 12 14 #define EVDEV_MINORS 32 13 15 #define EVDEV_MIN_BUFFER_SIZE 64U ··· 524 522 if (type == EV_KEY && size == OLD_KEY_MAX) { 525 523 len = OLD_KEY_MAX; 526 524 if (printk_timed_ratelimit(&keymax_warn_time, 10 * 1000)) 527 - printk(KERN_WARNING 528 - "evdev.c(EVIOCGBIT): Suspicious buffer size %u, " 529 - "limiting output to %zu bytes. See " 530 - "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n", 531 - OLD_KEY_MAX, 532 - BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long)); 525 + pr_warning("(EVIOCGBIT): Suspicious buffer size %u, " 526 + "limiting output to %zu bytes. See " 527 + "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n", 528 + OLD_KEY_MAX, 529 + BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long)); 533 530 } 534 531 535 532 return bits_to_user(bits, len, size, p, compat_mode); ··· 686 685 /* Now check variable-length commands */ 687 686 #define EVIOC_MASK_SIZE(nr) ((nr) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT)) 688 687 switch (EVIOC_MASK_SIZE(cmd)) { 688 + 689 + case EVIOCGPROP(0): 690 + return bits_to_user(dev->propbit, INPUT_PROP_MAX, 691 + size, p, compat_mode); 689 692 690 693 case EVIOCGKEY(0): 691 694 return bits_to_user(dev->key, KEY_MAX, size, p, compat_mode); ··· 902 897 break; 903 898 904 899 if (minor == EVDEV_MINORS) { 905 - printk(KERN_ERR "evdev: no more free evdev devices\n"); 900 + pr_err("no more free evdev devices\n"); 906 901 return -ENFILE; 907 902 } 908 903
+5 -6
drivers/input/ff-core.c
··· 23 23 24 24 /* #define DEBUG */ 25 25 26 - #define debug(format, arg...) pr_debug("ff-core: " format "\n", ## arg) 26 + #define pr_fmt(fmt) KBUILD_BASENAME ": " fmt 27 27 28 28 #include <linux/input.h> 29 29 #include <linux/module.h> ··· 116 116 117 117 if (effect->type < FF_EFFECT_MIN || effect->type > FF_EFFECT_MAX || 118 118 !test_bit(effect->type, dev->ffbit)) { 119 - debug("invalid or not supported effect type in upload"); 119 + pr_debug("invalid or not supported effect type in upload\n"); 120 120 return -EINVAL; 121 121 } 122 122 ··· 124 124 (effect->u.periodic.waveform < FF_WAVEFORM_MIN || 125 125 effect->u.periodic.waveform > FF_WAVEFORM_MAX || 126 126 !test_bit(effect->u.periodic.waveform, dev->ffbit))) { 127 - debug("invalid or not supported wave form in upload"); 127 + pr_debug("invalid or not supported wave form in upload\n"); 128 128 return -EINVAL; 129 129 } 130 130 ··· 246 246 struct ff_device *ff = dev->ff; 247 247 int i; 248 248 249 - debug("flushing now"); 249 + pr_debug("flushing now\n"); 250 250 251 251 mutex_lock(&ff->mutex); 252 252 ··· 315 315 int i; 316 316 317 317 if (!max_effects) { 318 - printk(KERN_ERR 319 - "ff-core: cannot allocate device without any effects\n"); 318 + pr_err("cannot allocate device without any effects\n"); 320 319 return -EINVAL; 321 320 } 322 321
+15 -16
drivers/input/ff-memless.c
··· 23 23 24 24 /* #define DEBUG */ 25 25 26 - #define debug(format, arg...) pr_debug("ff-memless: " format "\n", ## arg) 26 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 27 27 28 28 #include <linux/slab.h> 29 29 #include <linux/input.h> ··· 129 129 int events = 0; 130 130 int i; 131 131 132 - debug("calculating next timer"); 132 + pr_debug("calculating next timer\n"); 133 133 134 134 for (i = 0; i < FF_MEMLESS_EFFECTS; i++) { 135 135 ··· 149 149 } 150 150 151 151 if (!events) { 152 - debug("no actions"); 152 + pr_debug("no actions\n"); 153 153 del_timer(&ml->timer); 154 154 } else { 155 - debug("timer set"); 155 + pr_debug("timer set\n"); 156 156 mod_timer(&ml->timer, earliest); 157 157 } 158 158 } ··· 173 173 if (envelope->attack_length && 174 174 time_before(now, 175 175 state->play_at + msecs_to_jiffies(envelope->attack_length))) { 176 - debug("value = 0x%x, attack_level = 0x%x", value, 177 - envelope->attack_level); 176 + pr_debug("value = 0x%x, attack_level = 0x%x\n", 177 + value, envelope->attack_level); 178 178 time_from_level = jiffies_to_msecs(now - state->play_at); 179 179 time_of_envelope = envelope->attack_length; 180 180 envelope_level = min_t(__s16, envelope->attack_level, 0x7fff); ··· 191 191 192 192 difference = abs(value) - envelope_level; 193 193 194 - debug("difference = %d", difference); 195 - debug("time_from_level = 0x%x", time_from_level); 196 - debug("time_of_envelope = 0x%x", time_of_envelope); 194 + pr_debug("difference = %d\n", difference); 195 + pr_debug("time_from_level = 0x%x\n", time_from_level); 196 + pr_debug("time_of_envelope = 0x%x\n", time_of_envelope); 197 197 198 198 difference = difference * time_from_level / time_of_envelope; 199 199 200 - debug("difference = %d", difference); 200 + pr_debug("difference = %d\n", difference); 201 201 202 202 return value < 0 ? 203 203 -(difference + envelope_level) : (difference + envelope_level); ··· 215 215 if (effect_type == FF_PERIODIC && test_bit(FF_RUMBLE, ff->ffbit)) 216 216 return FF_RUMBLE; 217 217 218 - printk(KERN_ERR 219 - "ff-memless: invalid type in get_compatible_type()\n"); 218 + pr_err("invalid type in get_compatible_type()\n"); 220 219 221 220 return 0; 222 221 } ··· 311 312 break; 312 313 313 314 default: 314 - printk(KERN_ERR "ff-memless: invalid type in ml_combine_effects()\n"); 315 + pr_err("invalid type in ml_combine_effects()\n"); 315 316 break; 316 317 } 317 318 ··· 405 406 struct ml_device *ml = dev->ff->private; 406 407 unsigned long flags; 407 408 408 - debug("timer: updating effects"); 409 + pr_debug("timer: updating effects\n"); 409 410 410 411 spin_lock_irqsave(&dev->event_lock, flags); 411 412 ml_play_effects(ml); ··· 437 438 struct ml_effect_state *state = &ml->states[effect_id]; 438 439 439 440 if (value > 0) { 440 - debug("initiated play"); 441 + pr_debug("initiated play\n"); 441 442 442 443 __set_bit(FF_EFFECT_STARTED, &state->flags); 443 444 state->count = value; ··· 448 449 state->adj_at = state->play_at; 449 450 450 451 } else { 451 - debug("initiated stop"); 452 + pr_debug("initiated stop\n"); 452 453 453 454 if (test_bit(FF_EFFECT_PLAYING, &state->flags)) 454 455 __set_bit(FF_EFFECT_ABORTING, &state->flags);
+68 -84
drivers/input/gameport/gameport.c
··· 18 18 #include <linux/ioport.h> 19 19 #include <linux/init.h> 20 20 #include <linux/gameport.h> 21 - #include <linux/wait.h> 22 21 #include <linux/slab.h> 23 22 #include <linux/delay.h> 24 - #include <linux/kthread.h> 23 + #include <linux/workqueue.h> 25 24 #include <linux/sched.h> /* HZ */ 26 25 #include <linux/mutex.h> 27 - #include <linux/freezer.h> 28 26 29 27 /*#include <asm/io.h>*/ 30 28 ··· 232 234 233 235 static DEFINE_SPINLOCK(gameport_event_lock); /* protects gameport_event_list */ 234 236 static LIST_HEAD(gameport_event_list); 235 - static DECLARE_WAIT_QUEUE_HEAD(gameport_wait); 236 - static struct task_struct *gameport_task; 237 237 238 - static int gameport_queue_event(void *object, struct module *owner, 239 - enum gameport_event_type event_type) 238 + static struct gameport_event *gameport_get_event(void) 240 239 { 240 + struct gameport_event *event = NULL; 241 241 unsigned long flags; 242 - struct gameport_event *event; 243 - int retval = 0; 244 242 245 243 spin_lock_irqsave(&gameport_event_lock, flags); 246 244 247 - /* 248 - * Scan event list for the other events for the same gameport port, 249 - * starting with the most recent one. If event is the same we 250 - * do not need add new one. If event is of different type we 251 - * need to add this event and should not look further because 252 - * we need to preseve sequence of distinct events. 253 - */ 254 - list_for_each_entry_reverse(event, &gameport_event_list, node) { 255 - if (event->object == object) { 256 - if (event->type == event_type) 257 - goto out; 258 - break; 259 - } 245 + if (!list_empty(&gameport_event_list)) { 246 + event = list_first_entry(&gameport_event_list, 247 + struct gameport_event, node); 248 + list_del_init(&event->node); 260 249 } 261 250 262 - event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); 263 - if (!event) { 264 - pr_err("Not enough memory to queue event %d\n", event_type); 265 - retval = -ENOMEM; 266 - goto out; 267 - } 268 - 269 - if (!try_module_get(owner)) { 270 - pr_warning("Can't get module reference, dropping event %d\n", 271 - event_type); 272 - kfree(event); 273 - retval = -EINVAL; 274 - goto out; 275 - } 276 - 277 - event->type = event_type; 278 - event->object = object; 279 - event->owner = owner; 280 - 281 - list_add_tail(&event->node, &gameport_event_list); 282 - wake_up(&gameport_wait); 283 - 284 - out: 285 251 spin_unlock_irqrestore(&gameport_event_lock, flags); 286 - return retval; 252 + return event; 287 253 } 288 254 289 255 static void gameport_free_event(struct gameport_event *event) ··· 281 319 spin_unlock_irqrestore(&gameport_event_lock, flags); 282 320 } 283 321 284 - static struct gameport_event *gameport_get_event(void) 285 - { 286 - struct gameport_event *event = NULL; 287 - unsigned long flags; 288 322 289 - spin_lock_irqsave(&gameport_event_lock, flags); 290 - 291 - if (!list_empty(&gameport_event_list)) { 292 - event = list_first_entry(&gameport_event_list, 293 - struct gameport_event, node); 294 - list_del_init(&event->node); 295 - } 296 - 297 - spin_unlock_irqrestore(&gameport_event_lock, flags); 298 - return event; 299 - } 300 - 301 - static void gameport_handle_event(void) 323 + static void gameport_handle_events(struct work_struct *work) 302 324 { 303 325 struct gameport_event *event; 304 326 ··· 312 366 } 313 367 314 368 mutex_unlock(&gameport_mutex); 369 + } 370 + 371 + static DECLARE_WORK(gameport_event_work, gameport_handle_events); 372 + 373 + static int gameport_queue_event(void *object, struct module *owner, 374 + enum gameport_event_type event_type) 375 + { 376 + unsigned long flags; 377 + struct gameport_event *event; 378 + int retval = 0; 379 + 380 + spin_lock_irqsave(&gameport_event_lock, flags); 381 + 382 + /* 383 + * Scan event list for the other events for the same gameport port, 384 + * starting with the most recent one. If event is the same we 385 + * do not need add new one. If event is of different type we 386 + * need to add this event and should not look further because 387 + * we need to preserve sequence of distinct events. 388 + */ 389 + list_for_each_entry_reverse(event, &gameport_event_list, node) { 390 + if (event->object == object) { 391 + if (event->type == event_type) 392 + goto out; 393 + break; 394 + } 395 + } 396 + 397 + event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); 398 + if (!event) { 399 + pr_err("Not enough memory to queue event %d\n", event_type); 400 + retval = -ENOMEM; 401 + goto out; 402 + } 403 + 404 + if (!try_module_get(owner)) { 405 + pr_warning("Can't get module reference, dropping event %d\n", 406 + event_type); 407 + kfree(event); 408 + retval = -EINVAL; 409 + goto out; 410 + } 411 + 412 + event->type = event_type; 413 + event->object = object; 414 + event->owner = owner; 415 + 416 + list_add_tail(&event->node, &gameport_event_list); 417 + schedule_work(&gameport_event_work); 418 + 419 + out: 420 + spin_unlock_irqrestore(&gameport_event_lock, flags); 421 + return retval; 315 422 } 316 423 317 424 /* ··· 417 418 spin_unlock_irqrestore(&gameport_event_lock, flags); 418 419 return child; 419 420 } 420 - 421 - static int gameport_thread(void *nothing) 422 - { 423 - set_freezable(); 424 - do { 425 - gameport_handle_event(); 426 - wait_event_freezable(gameport_wait, 427 - kthread_should_stop() || !list_empty(&gameport_event_list)); 428 - } while (!kthread_should_stop()); 429 - 430 - return 0; 431 - } 432 - 433 421 434 422 /* 435 423 * Gameport port operations ··· 800 814 return error; 801 815 } 802 816 803 - gameport_task = kthread_run(gameport_thread, NULL, "kgameportd"); 804 - if (IS_ERR(gameport_task)) { 805 - bus_unregister(&gameport_bus); 806 - error = PTR_ERR(gameport_task); 807 - pr_err("Failed to start kgameportd, error: %d\n", error); 808 - return error; 809 - } 810 817 811 818 return 0; 812 819 } ··· 807 828 static void __exit gameport_exit(void) 808 829 { 809 830 bus_unregister(&gameport_bus); 810 - kthread_stop(gameport_task); 831 + 832 + /* 833 + * There should not be any outstanding events but work may 834 + * still be scheduled so simply cancel it. 835 + */ 836 + cancel_work_sync(&gameport_event_work); 811 837 } 812 838 813 839 subsys_initcall(gameport_init);
+170
drivers/input/input-mt.c
··· 1 + /* 2 + * Input Multitouch Library 3 + * 4 + * Copyright (c) 2008-2010 Henrik Rydberg 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License version 2 as published by 8 + * the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/input/mt.h> 12 + #include <linux/slab.h> 13 + 14 + #define TRKID_SGN ((TRKID_MAX + 1) >> 1) 15 + 16 + /** 17 + * input_mt_init_slots() - initialize MT input slots 18 + * @dev: input device supporting MT events and finger tracking 19 + * @num_slots: number of slots used by the device 20 + * 21 + * This function allocates all necessary memory for MT slot handling 22 + * in the input device, prepares the ABS_MT_SLOT and 23 + * ABS_MT_TRACKING_ID events for use and sets up appropriate buffers. 24 + * May be called repeatedly. Returns -EINVAL if attempting to 25 + * reinitialize with a different number of slots. 26 + */ 27 + int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots) 28 + { 29 + int i; 30 + 31 + if (!num_slots) 32 + return 0; 33 + if (dev->mt) 34 + return dev->mtsize != num_slots ? -EINVAL : 0; 35 + 36 + dev->mt = kcalloc(num_slots, sizeof(struct input_mt_slot), GFP_KERNEL); 37 + if (!dev->mt) 38 + return -ENOMEM; 39 + 40 + dev->mtsize = num_slots; 41 + input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0); 42 + input_set_abs_params(dev, ABS_MT_TRACKING_ID, 0, TRKID_MAX, 0, 0); 43 + input_set_events_per_packet(dev, 6 * num_slots); 44 + 45 + /* Mark slots as 'unused' */ 46 + for (i = 0; i < num_slots; i++) 47 + input_mt_set_value(&dev->mt[i], ABS_MT_TRACKING_ID, -1); 48 + 49 + return 0; 50 + } 51 + EXPORT_SYMBOL(input_mt_init_slots); 52 + 53 + /** 54 + * input_mt_destroy_slots() - frees the MT slots of the input device 55 + * @dev: input device with allocated MT slots 56 + * 57 + * This function is only needed in error path as the input core will 58 + * automatically free the MT slots when the device is destroyed. 59 + */ 60 + void input_mt_destroy_slots(struct input_dev *dev) 61 + { 62 + kfree(dev->mt); 63 + dev->mt = NULL; 64 + dev->mtsize = 0; 65 + dev->slot = 0; 66 + dev->trkid = 0; 67 + } 68 + EXPORT_SYMBOL(input_mt_destroy_slots); 69 + 70 + /** 71 + * input_mt_report_slot_state() - report contact state 72 + * @dev: input device with allocated MT slots 73 + * @tool_type: the tool type to use in this slot 74 + * @active: true if contact is active, false otherwise 75 + * 76 + * Reports a contact via ABS_MT_TRACKING_ID, and optionally 77 + * ABS_MT_TOOL_TYPE. If active is true and the slot is currently 78 + * inactive, or if the tool type is changed, a new tracking id is 79 + * assigned to the slot. The tool type is only reported if the 80 + * corresponding absbit field is set. 81 + */ 82 + void input_mt_report_slot_state(struct input_dev *dev, 83 + unsigned int tool_type, bool active) 84 + { 85 + struct input_mt_slot *mt; 86 + int id; 87 + 88 + if (!dev->mt || !active) { 89 + input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1); 90 + return; 91 + } 92 + 93 + mt = &dev->mt[dev->slot]; 94 + id = input_mt_get_value(mt, ABS_MT_TRACKING_ID); 95 + if (id < 0 || input_mt_get_value(mt, ABS_MT_TOOL_TYPE) != tool_type) 96 + id = input_mt_new_trkid(dev); 97 + 98 + input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, id); 99 + input_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, tool_type); 100 + } 101 + EXPORT_SYMBOL(input_mt_report_slot_state); 102 + 103 + /** 104 + * input_mt_report_finger_count() - report contact count 105 + * @dev: input device with allocated MT slots 106 + * @count: the number of contacts 107 + * 108 + * Reports the contact count via BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, 109 + * BTN_TOOL_TRIPLETAP and BTN_TOOL_QUADTAP. 110 + * 111 + * The input core ensures only the KEY events already setup for 112 + * this device will produce output. 113 + */ 114 + void input_mt_report_finger_count(struct input_dev *dev, int count) 115 + { 116 + input_event(dev, EV_KEY, BTN_TOOL_FINGER, count == 1); 117 + input_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, count == 2); 118 + input_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, count == 3); 119 + input_event(dev, EV_KEY, BTN_TOOL_QUADTAP, count == 4); 120 + } 121 + EXPORT_SYMBOL(input_mt_report_finger_count); 122 + 123 + /** 124 + * input_mt_report_pointer_emulation() - common pointer emulation 125 + * @dev: input device with allocated MT slots 126 + * @use_count: report number of active contacts as finger count 127 + * 128 + * Performs legacy pointer emulation via BTN_TOUCH, ABS_X, ABS_Y and 129 + * ABS_PRESSURE. Touchpad finger count is emulated if use_count is true. 130 + * 131 + * The input core ensures only the KEY and ABS axes already setup for 132 + * this device will produce output. 133 + */ 134 + void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) 135 + { 136 + struct input_mt_slot *oldest = 0; 137 + int oldid = dev->trkid; 138 + int count = 0; 139 + int i; 140 + 141 + for (i = 0; i < dev->mtsize; ++i) { 142 + struct input_mt_slot *ps = &dev->mt[i]; 143 + int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID); 144 + 145 + if (id < 0) 146 + continue; 147 + if ((id - oldid) & TRKID_SGN) { 148 + oldest = ps; 149 + oldid = id; 150 + } 151 + count++; 152 + } 153 + 154 + input_event(dev, EV_KEY, BTN_TOUCH, count > 0); 155 + if (use_count) 156 + input_mt_report_finger_count(dev, count); 157 + 158 + if (oldest) { 159 + int x = input_mt_get_value(oldest, ABS_MT_POSITION_X); 160 + int y = input_mt_get_value(oldest, ABS_MT_POSITION_Y); 161 + int p = input_mt_get_value(oldest, ABS_MT_PRESSURE); 162 + 163 + input_event(dev, EV_ABS, ABS_X, x); 164 + input_event(dev, EV_ABS, ABS_Y, y); 165 + input_event(dev, EV_ABS, ABS_PRESSURE, p); 166 + } else { 167 + input_event(dev, EV_ABS, ABS_PRESSURE, 0); 168 + } 169 + } 170 + EXPORT_SYMBOL(input_mt_report_pointer_emulation);
+3 -2
drivers/input/input-polldev.c
··· 8 8 * the Free Software Foundation. 9 9 */ 10 10 11 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 12 + 11 13 #include <linux/jiffies.h> 12 14 #include <linux/slab.h> 13 15 #include <linux/mutex.h> ··· 35 33 if (!polldev_users) { 36 34 polldev_wq = create_singlethread_workqueue("ipolldevd"); 37 35 if (!polldev_wq) { 38 - printk(KERN_ERR "input-polldev: failed to create " 39 - "ipolldevd workqueue\n"); 36 + pr_err("failed to create ipolldevd workqueue\n"); 40 37 retval = -ENOMEM; 41 38 goto out; 42 39 }
+32 -59
drivers/input/input.c
··· 10 10 * the Free Software Foundation. 11 11 */ 12 12 13 + #define pr_fmt(fmt) KBUILD_BASENAME ": " fmt 14 + 13 15 #include <linux/init.h> 14 16 #include <linux/types.h> 15 - #include <linux/input.h> 17 + #include <linux/input/mt.h> 16 18 #include <linux/module.h> 17 19 #include <linux/slab.h> 18 20 #include <linux/random.h> ··· 961 959 962 960 error = handler->connect(handler, dev, id); 963 961 if (error && error != -ENODEV) 964 - printk(KERN_ERR 965 - "input: failed to attach handler %s to device %s, " 966 - "error: %d\n", 967 - handler->name, kobject_name(&dev->dev.kobj), error); 962 + pr_err("failed to attach handler %s to device %s, error: %d\n", 963 + handler->name, kobject_name(&dev->dev.kobj), error); 968 964 969 965 return error; 970 966 } ··· 1109 1109 list_for_each_entry(handle, &dev->h_list, d_node) 1110 1110 seq_printf(seq, "%s ", handle->name); 1111 1111 seq_putc(seq, '\n'); 1112 + 1113 + input_seq_print_bitmap(seq, "PROP", dev->propbit, INPUT_PROP_MAX); 1112 1114 1113 1115 input_seq_print_bitmap(seq, "EV", dev->evbit, EV_MAX); 1114 1116 if (test_bit(EV_KEY, dev->evbit)) ··· 1335 1333 } 1336 1334 static DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL); 1337 1335 1336 + static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap, 1337 + int max, int add_cr); 1338 + 1339 + static ssize_t input_dev_show_properties(struct device *dev, 1340 + struct device_attribute *attr, 1341 + char *buf) 1342 + { 1343 + struct input_dev *input_dev = to_input_dev(dev); 1344 + int len = input_print_bitmap(buf, PAGE_SIZE, input_dev->propbit, 1345 + INPUT_PROP_MAX, true); 1346 + return min_t(int, len, PAGE_SIZE); 1347 + } 1348 + static DEVICE_ATTR(properties, S_IRUGO, input_dev_show_properties, NULL); 1349 + 1338 1350 static struct attribute *input_dev_attrs[] = { 1339 1351 &dev_attr_name.attr, 1340 1352 &dev_attr_phys.attr, 1341 1353 &dev_attr_uniq.attr, 1342 1354 &dev_attr_modalias.attr, 1355 + &dev_attr_properties.attr, 1343 1356 NULL 1344 1357 }; 1345 1358 ··· 1488 1471 { 1489 1472 int len; 1490 1473 1491 - if (add_uevent_var(env, "%s=", name)) 1474 + if (add_uevent_var(env, "%s", name)) 1492 1475 return -ENOMEM; 1493 1476 1494 1477 len = input_print_bitmap(&env->buf[env->buflen - 1], ··· 1553 1536 INPUT_ADD_HOTPLUG_VAR("PHYS=\"%s\"", dev->phys); 1554 1537 if (dev->uniq) 1555 1538 INPUT_ADD_HOTPLUG_VAR("UNIQ=\"%s\"", dev->uniq); 1539 + 1540 + INPUT_ADD_HOTPLUG_BM_VAR("PROP=", dev->propbit, INPUT_PROP_MAX); 1556 1541 1557 1542 INPUT_ADD_HOTPLUG_BM_VAR("EV=", dev->evbit, EV_MAX); 1558 1543 if (test_bit(EV_KEY, dev->evbit)) ··· 1745 1726 EXPORT_SYMBOL(input_free_device); 1746 1727 1747 1728 /** 1748 - * input_mt_create_slots() - create MT input slots 1749 - * @dev: input device supporting MT events and finger tracking 1750 - * @num_slots: number of slots used by the device 1751 - * 1752 - * This function allocates all necessary memory for MT slot handling in the 1753 - * input device, and adds ABS_MT_SLOT to the device capabilities. All slots 1754 - * are initially marked as unused by setting ABS_MT_TRACKING_ID to -1. 1755 - */ 1756 - int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots) 1757 - { 1758 - int i; 1759 - 1760 - if (!num_slots) 1761 - return 0; 1762 - 1763 - dev->mt = kcalloc(num_slots, sizeof(struct input_mt_slot), GFP_KERNEL); 1764 - if (!dev->mt) 1765 - return -ENOMEM; 1766 - 1767 - dev->mtsize = num_slots; 1768 - input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0); 1769 - 1770 - /* Mark slots as 'unused' */ 1771 - for (i = 0; i < num_slots; i++) 1772 - dev->mt[i].abs[ABS_MT_TRACKING_ID - ABS_MT_FIRST] = -1; 1773 - 1774 - return 0; 1775 - } 1776 - EXPORT_SYMBOL(input_mt_create_slots); 1777 - 1778 - /** 1779 - * input_mt_destroy_slots() - frees the MT slots of the input device 1780 - * @dev: input device with allocated MT slots 1781 - * 1782 - * This function is only needed in error path as the input core will 1783 - * automatically free the MT slots when the device is destroyed. 1784 - */ 1785 - void input_mt_destroy_slots(struct input_dev *dev) 1786 - { 1787 - kfree(dev->mt); 1788 - dev->mt = NULL; 1789 - dev->mtsize = 0; 1790 - } 1791 - EXPORT_SYMBOL(input_mt_destroy_slots); 1792 - 1793 - /** 1794 1729 * input_set_capability - mark device as capable of a certain event 1795 1730 * @dev: device that is capable of emitting or accepting event 1796 1731 * @type: type of the event (EV_KEY, EV_REL, etc...) ··· 1793 1820 break; 1794 1821 1795 1822 default: 1796 - printk(KERN_ERR 1797 - "input_set_capability: unknown type %u (code %u)\n", 1798 - type, code); 1823 + pr_err("input_set_capability: unknown type %u (code %u)\n", 1824 + type, code); 1799 1825 dump_stack(); 1800 1826 return; 1801 1827 } ··· 1876 1904 return error; 1877 1905 1878 1906 path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); 1879 - printk(KERN_INFO "input: %s as %s\n", 1880 - dev->name ? dev->name : "Unspecified device", path ? path : "N/A"); 1907 + pr_info("%s as %s\n", 1908 + dev->name ? dev->name : "Unspecified device", 1909 + path ? path : "N/A"); 1881 1910 kfree(path); 1882 1911 1883 1912 error = mutex_lock_interruptible(&input_mutex); ··· 2160 2187 2161 2188 err = class_register(&input_class); 2162 2189 if (err) { 2163 - printk(KERN_ERR "input: unable to register input_dev class\n"); 2190 + pr_err("unable to register input_dev class\n"); 2164 2191 return err; 2165 2192 } 2166 2193 ··· 2170 2197 2171 2198 err = register_chrdev(INPUT_MAJOR, "input", &input_fops); 2172 2199 if (err) { 2173 - printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR); 2200 + pr_err("unable to register char major %d", INPUT_MAJOR); 2174 2201 goto fail2; 2175 2202 } 2176 2203
+3 -1
drivers/input/joydev.c
··· 10 10 * (at your option) any later version. 11 11 */ 12 12 13 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 14 + 13 15 #include <asm/io.h> 14 16 #include <asm/system.h> 15 17 #include <linux/delay.h> ··· 808 806 break; 809 807 810 808 if (minor == JOYDEV_MINORS) { 811 - printk(KERN_ERR "joydev: no more free joydev devices\n"); 809 + pr_err("no more free joydev devices\n"); 812 810 return -ENFILE; 813 811 } 814 812
+3 -12
drivers/input/joystick/iforce/Makefile
··· 4 4 # By Johann Deneux <johann.deneux@gmail.com> 5 5 # 6 6 7 - # Goal definition 8 - iforce-objs := iforce-ff.o iforce-main.o iforce-packets.o 9 - 10 7 obj-$(CONFIG_JOYSTICK_IFORCE) += iforce.o 11 8 12 - ifeq ($(CONFIG_JOYSTICK_IFORCE_232),y) 13 - iforce-objs += iforce-serio.o 14 - endif 15 - 16 - ifeq ($(CONFIG_JOYSTICK_IFORCE_USB),y) 17 - iforce-objs += iforce-usb.o 18 - endif 19 - 20 - EXTRA_CFLAGS = -Werror-implicit-function-declaration 9 + iforce-y := iforce-ff.o iforce-main.o iforce-packets.o 10 + iforce-$(CONFIG_JOYSTICK_IFORCE_232) += iforce-serio.o 11 + iforce-$(CONFIG_JOYSTICK_IFORCE_USB) += iforce-usb.o
+71 -52
drivers/input/joystick/xpad.c
··· 543 543 static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) 544 544 { 545 545 struct usb_endpoint_descriptor *ep_irq_out; 546 - int error = -ENOMEM; 546 + int error; 547 547 548 548 if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX) 549 549 return 0; 550 550 551 551 xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN, 552 552 GFP_KERNEL, &xpad->odata_dma); 553 - if (!xpad->odata) 553 + if (!xpad->odata) { 554 + error = -ENOMEM; 554 555 goto fail1; 556 + } 555 557 556 558 mutex_init(&xpad->odata_mutex); 557 559 558 560 xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL); 559 - if (!xpad->irq_out) 561 + if (!xpad->irq_out) { 562 + error = -ENOMEM; 560 563 goto fail2; 564 + } 561 565 562 566 ep_irq_out = &intf->cur_altsetting->endpoint[1].desc; 563 567 usb_fill_int_urb(xpad->irq_out, xpad->udev, ··· 732 728 733 729 if (xpad_led) { 734 730 led_classdev_unregister(&xpad_led->led_cdev); 735 - kfree(xpad_led->name); 731 + kfree(xpad_led); 736 732 } 737 733 } 738 734 #else ··· 760 756 { 761 757 struct usb_xpad *xpad = input_get_drvdata(dev); 762 758 763 - if(xpad->xtype != XTYPE_XBOX360W) 759 + if (xpad->xtype != XTYPE_XBOX360W) 764 760 usb_kill_urb(xpad->irq_in); 761 + 765 762 xpad_stop_output(xpad); 766 763 } 767 764 ··· 794 789 struct usb_xpad *xpad; 795 790 struct input_dev *input_dev; 796 791 struct usb_endpoint_descriptor *ep_irq_in; 797 - int i; 798 - int error = -ENOMEM; 792 + int i, error; 799 793 800 794 for (i = 0; xpad_device[i].idVendor; i++) { 801 795 if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) && ··· 804 800 805 801 xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); 806 802 input_dev = input_allocate_device(); 807 - if (!xpad || !input_dev) 803 + if (!xpad || !input_dev) { 804 + error = -ENOMEM; 808 805 goto fail1; 806 + } 809 807 810 808 xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN, 811 809 GFP_KERNEL, &xpad->idata_dma); 812 - if (!xpad->idata) 810 + if (!xpad->idata) { 811 + error = -ENOMEM; 813 812 goto fail1; 813 + } 814 814 815 815 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); 816 - if (!xpad->irq_in) 816 + if (!xpad->irq_in) { 817 + error = -ENOMEM; 817 818 goto fail2; 819 + } 818 820 819 821 xpad->udev = udev; 820 822 xpad->mapping = xpad_device[i].mapping; ··· 897 887 898 888 error = xpad_init_output(intf, xpad); 899 889 if (error) 900 - goto fail2; 890 + goto fail3; 901 891 902 892 error = xpad_init_ff(xpad); 903 893 if (error) 904 - goto fail3; 894 + goto fail4; 905 895 906 896 error = xpad_led_probe(xpad); 907 897 if (error) 908 - goto fail3; 898 + goto fail5; 909 899 910 900 ep_irq_in = &intf->cur_altsetting->endpoint[0].desc; 911 901 usb_fill_int_urb(xpad->irq_in, udev, ··· 917 907 918 908 error = input_register_device(xpad->dev); 919 909 if (error) 920 - goto fail4; 910 + goto fail6; 921 911 922 912 usb_set_intfdata(intf, xpad); 923 913 924 - /* 925 - * Submit the int URB immediatly rather than waiting for open 926 - * because we get status messages from the device whether 927 - * or not any controllers are attached. In fact, it's 928 - * exactly the message that a controller has arrived that 929 - * we're waiting for. 930 - */ 931 914 if (xpad->xtype == XTYPE_XBOX360W) { 932 - xpad->irq_in->dev = xpad->udev; 933 - error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); 934 - if (error) 935 - goto fail4; 936 - 937 915 /* 938 916 * Setup the message to set the LEDs on the 939 917 * controller when it shows up 940 918 */ 941 919 xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL); 942 - if(!xpad->bulk_out) 943 - goto fail5; 920 + if (!xpad->bulk_out) { 921 + error = -ENOMEM; 922 + goto fail7; 923 + } 944 924 945 925 xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL); 946 - if(!xpad->bdata) 947 - goto fail6; 926 + if (!xpad->bdata) { 927 + error = -ENOMEM; 928 + goto fail8; 929 + } 948 930 949 931 xpad->bdata[2] = 0x08; 950 932 switch (intf->cur_altsetting->desc.bInterfaceNumber) { ··· 957 955 usb_fill_bulk_urb(xpad->bulk_out, udev, 958 956 usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), 959 957 xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); 958 + 959 + /* 960 + * Submit the int URB immediately rather than waiting for open 961 + * because we get status messages from the device whether 962 + * or not any controllers are attached. In fact, it's 963 + * exactly the message that a controller has arrived that 964 + * we're waiting for. 965 + */ 966 + xpad->irq_in->dev = xpad->udev; 967 + error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); 968 + if (error) 969 + goto fail9; 960 970 } 961 971 962 972 return 0; 963 973 964 - fail6: usb_free_urb(xpad->bulk_out); 965 - fail5: usb_kill_urb(xpad->irq_in); 966 - fail4: usb_free_urb(xpad->irq_in); 967 - fail3: xpad_deinit_output(xpad); 974 + fail9: kfree(xpad->bdata); 975 + fail8: usb_free_urb(xpad->bulk_out); 976 + fail7: input_unregister_device(input_dev); 977 + input_dev = NULL; 978 + fail6: xpad_led_disconnect(xpad); 979 + fail5: if (input_dev) 980 + input_ff_destroy(input_dev); 981 + fail4: xpad_deinit_output(xpad); 982 + fail3: usb_free_urb(xpad->irq_in); 968 983 fail2: usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); 969 984 fail1: input_free_device(input_dev); 970 985 kfree(xpad); ··· 993 974 { 994 975 struct usb_xpad *xpad = usb_get_intfdata (intf); 995 976 996 - usb_set_intfdata(intf, NULL); 997 - if (xpad) { 998 - xpad_led_disconnect(xpad); 999 - input_unregister_device(xpad->dev); 1000 - xpad_deinit_output(xpad); 1001 - if (xpad->xtype == XTYPE_XBOX360W) { 1002 - usb_kill_urb(xpad->bulk_out); 1003 - usb_free_urb(xpad->bulk_out); 1004 - usb_kill_urb(xpad->irq_in); 1005 - } 1006 - usb_free_urb(xpad->irq_in); 1007 - usb_free_coherent(xpad->udev, XPAD_PKT_LEN, 1008 - xpad->idata, xpad->idata_dma); 1009 - kfree(xpad); 977 + xpad_led_disconnect(xpad); 978 + input_unregister_device(xpad->dev); 979 + xpad_deinit_output(xpad); 980 + 981 + if (xpad->xtype == XTYPE_XBOX360W) { 982 + usb_kill_urb(xpad->bulk_out); 983 + usb_free_urb(xpad->bulk_out); 984 + usb_kill_urb(xpad->irq_in); 1010 985 } 986 + 987 + usb_free_urb(xpad->irq_in); 988 + usb_free_coherent(xpad->udev, XPAD_PKT_LEN, 989 + xpad->idata, xpad->idata_dma); 990 + 991 + kfree(xpad->bdata); 992 + kfree(xpad); 993 + 994 + usb_set_intfdata(intf, NULL); 1011 995 } 1012 996 1013 997 static struct usb_driver xpad_driver = { ··· 1022 1000 1023 1001 static int __init usb_xpad_init(void) 1024 1002 { 1025 - int result = usb_register(&xpad_driver); 1026 - if (result == 0) 1027 - printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); 1028 - return result; 1003 + return usb_register(&xpad_driver); 1029 1004 } 1030 1005 1031 1006 static void __exit usb_xpad_exit(void)
+15 -4
drivers/input/keyboard/Kconfig
··· 196 196 module will be called gpio_keys_polled. 197 197 198 198 config KEYBOARD_TCA6416 199 - tristate "TCA6416 Keypad Support" 199 + tristate "TCA6416/TCA6408A Keypad Support" 200 200 depends on I2C 201 201 help 202 202 This driver implements basic keypad functionality 203 - for keys connected through TCA6416 IO expander 203 + for keys connected through TCA6416/TCA6408A IO expanders. 204 204 205 205 Say Y here if your device has keys connected to 206 - TCA6416 IO expander. Your board-specific setup logic 206 + TCA6416/TCA6408A IO expander. Your board-specific setup logic 207 207 must also provide pin-mask details(of which TCA6416 pins 208 208 are used for keypad). 209 209 210 - If enabled the complete TCA6416 device will be managed through 210 + If enabled the entire TCA6416 device will be managed through 211 211 this driver. 212 212 213 + To compile this driver as a module, choose M here: the 214 + module will be called tca6416_keypad. 213 215 214 216 config KEYBOARD_MATRIX 215 217 tristate "GPIO driven matrix keypad support" ··· 460 458 461 459 To compile this driver as a module, choose M here: the 462 460 module will be called omap4-keypad. 461 + 462 + config KEYBOARD_SPEAR 463 + tristate "ST SPEAR keyboard support" 464 + depends on PLAT_SPEAR 465 + help 466 + Say Y here if you want to use the SPEAR keyboard. 467 + 468 + To compile this driver as a module, choose M here: the 469 + module will be called spear-keboard. 463 470 464 471 config KEYBOARD_TNETV107X 465 472 tristate "TI TNETV107X keypad support"
+1
drivers/input/keyboard/Makefile
··· 38 38 obj-$(CONFIG_KEYBOARD_QT2160) += qt2160.o 39 39 obj-$(CONFIG_KEYBOARD_SAMSUNG) += samsung-keypad.o 40 40 obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o 41 + obj-$(CONFIG_KEYBOARD_SPEAR) += spear-keyboard.o 41 42 obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o 42 43 obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o 43 44 obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o
+344
drivers/input/keyboard/spear-keyboard.c
··· 1 + /* 2 + * SPEAr Keyboard Driver 3 + * Based on omap-keypad driver 4 + * 5 + * Copyright (C) 2010 ST Microelectronics 6 + * Rajeev Kumar<rajeev-dlh.kumar@st.com> 7 + * 8 + * This file is licensed under the terms of the GNU General Public 9 + * License version 2. This program is licensed "as is" without any 10 + * warranty of any kind, whether express or implied. 11 + */ 12 + 13 + #include <linux/clk.h> 14 + #include <linux/errno.h> 15 + #include <linux/init.h> 16 + #include <linux/interrupt.h> 17 + #include <linux/input.h> 18 + #include <linux/io.h> 19 + #include <linux/irq.h> 20 + #include <linux/kernel.h> 21 + #include <linux/module.h> 22 + #include <linux/platform_device.h> 23 + #include <linux/pm_wakeup.h> 24 + #include <linux/slab.h> 25 + #include <linux/types.h> 26 + #include <plat/keyboard.h> 27 + 28 + /* Keyboard Registers */ 29 + #define MODE_REG 0x00 /* 16 bit reg */ 30 + #define STATUS_REG 0x0C /* 2 bit reg */ 31 + #define DATA_REG 0x10 /* 8 bit reg */ 32 + #define INTR_MASK 0x54 33 + 34 + /* Register Values */ 35 + /* 36 + * pclk freq mask = (APB FEQ -1)= 82 MHZ.Programme bit 15-9 in mode 37 + * control register as 1010010(82MHZ) 38 + */ 39 + #define PCLK_FREQ_MSK 0xA400 /* 82 MHz */ 40 + #define START_SCAN 0x0100 41 + #define SCAN_RATE_10 0x0000 42 + #define SCAN_RATE_20 0x0004 43 + #define SCAN_RATE_40 0x0008 44 + #define SCAN_RATE_80 0x000C 45 + #define MODE_KEYBOARD 0x0002 46 + #define DATA_AVAIL 0x2 47 + 48 + #define KEY_MASK 0xFF000000 49 + #define KEY_VALUE 0x00FFFFFF 50 + #define ROW_MASK 0xF0 51 + #define COLUMN_MASK 0x0F 52 + #define ROW_SHIFT 4 53 + 54 + struct spear_kbd { 55 + struct input_dev *input; 56 + struct resource *res; 57 + void __iomem *io_base; 58 + struct clk *clk; 59 + unsigned int irq; 60 + unsigned short last_key; 61 + unsigned short keycodes[256]; 62 + }; 63 + 64 + static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id) 65 + { 66 + struct spear_kbd *kbd = dev_id; 67 + struct input_dev *input = kbd->input; 68 + unsigned int key; 69 + u8 sts, val; 70 + 71 + sts = readb(kbd->io_base + STATUS_REG); 72 + if (sts & DATA_AVAIL) 73 + return IRQ_NONE; 74 + 75 + if (kbd->last_key != KEY_RESERVED) { 76 + input_report_key(input, kbd->last_key, 0); 77 + kbd->last_key = KEY_RESERVED; 78 + } 79 + 80 + /* following reads active (row, col) pair */ 81 + val = readb(kbd->io_base + DATA_REG); 82 + key = kbd->keycodes[val]; 83 + 84 + input_event(input, EV_MSC, MSC_SCAN, val); 85 + input_report_key(input, key, 1); 86 + input_sync(input); 87 + 88 + kbd->last_key = key; 89 + 90 + /* clear interrupt */ 91 + writeb(0, kbd->io_base + STATUS_REG); 92 + 93 + return IRQ_HANDLED; 94 + } 95 + 96 + static int spear_kbd_open(struct input_dev *dev) 97 + { 98 + struct spear_kbd *kbd = input_get_drvdata(dev); 99 + int error; 100 + u16 val; 101 + 102 + kbd->last_key = KEY_RESERVED; 103 + 104 + error = clk_enable(kbd->clk); 105 + if (error) 106 + return error; 107 + 108 + /* program keyboard */ 109 + val = SCAN_RATE_80 | MODE_KEYBOARD | PCLK_FREQ_MSK; 110 + writew(val, kbd->io_base + MODE_REG); 111 + writeb(1, kbd->io_base + STATUS_REG); 112 + 113 + /* start key scan */ 114 + val = readw(kbd->io_base + MODE_REG); 115 + val |= START_SCAN; 116 + writew(val, kbd->io_base + MODE_REG); 117 + 118 + return 0; 119 + } 120 + 121 + static void spear_kbd_close(struct input_dev *dev) 122 + { 123 + struct spear_kbd *kbd = input_get_drvdata(dev); 124 + u16 val; 125 + 126 + /* stop key scan */ 127 + val = readw(kbd->io_base + MODE_REG); 128 + val &= ~START_SCAN; 129 + writew(val, kbd->io_base + MODE_REG); 130 + 131 + clk_disable(kbd->clk); 132 + 133 + kbd->last_key = KEY_RESERVED; 134 + } 135 + 136 + static int __devinit spear_kbd_probe(struct platform_device *pdev) 137 + { 138 + const struct kbd_platform_data *pdata = pdev->dev.platform_data; 139 + const struct matrix_keymap_data *keymap; 140 + struct spear_kbd *kbd; 141 + struct input_dev *input_dev; 142 + struct resource *res; 143 + int irq; 144 + int error; 145 + 146 + if (!pdata) { 147 + dev_err(&pdev->dev, "Invalid platform data\n"); 148 + return -EINVAL; 149 + } 150 + 151 + keymap = pdata->keymap; 152 + if (!keymap) { 153 + dev_err(&pdev->dev, "no keymap defined\n"); 154 + return -EINVAL; 155 + } 156 + 157 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 158 + if (!res) { 159 + dev_err(&pdev->dev, "no keyboard resource defined\n"); 160 + return -EBUSY; 161 + } 162 + 163 + irq = platform_get_irq(pdev, 0); 164 + if (irq < 0) { 165 + dev_err(&pdev->dev, "not able to get irq for the device\n"); 166 + return irq; 167 + } 168 + 169 + kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); 170 + input_dev = input_allocate_device(); 171 + if (!kbd || !input_dev) { 172 + dev_err(&pdev->dev, "out of memory\n"); 173 + error = -ENOMEM; 174 + goto err_free_mem; 175 + } 176 + 177 + kbd->input = input_dev; 178 + kbd->irq = irq; 179 + kbd->res = request_mem_region(res->start, resource_size(res), 180 + pdev->name); 181 + if (!kbd->res) { 182 + dev_err(&pdev->dev, "keyboard region already claimed\n"); 183 + error = -EBUSY; 184 + goto err_free_mem; 185 + } 186 + 187 + kbd->io_base = ioremap(res->start, resource_size(res)); 188 + if (!kbd->io_base) { 189 + dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); 190 + error = -ENOMEM; 191 + goto err_release_mem_region; 192 + } 193 + 194 + kbd->clk = clk_get(&pdev->dev, NULL); 195 + if (IS_ERR(kbd->clk)) { 196 + error = PTR_ERR(kbd->clk); 197 + goto err_iounmap; 198 + } 199 + 200 + input_dev->name = "Spear Keyboard"; 201 + input_dev->phys = "keyboard/input0"; 202 + input_dev->dev.parent = &pdev->dev; 203 + input_dev->id.bustype = BUS_HOST; 204 + input_dev->id.vendor = 0x0001; 205 + input_dev->id.product = 0x0001; 206 + input_dev->id.version = 0x0100; 207 + input_dev->open = spear_kbd_open; 208 + input_dev->close = spear_kbd_close; 209 + 210 + __set_bit(EV_KEY, input_dev->evbit); 211 + if (pdata->rep) 212 + __set_bit(EV_REP, input_dev->evbit); 213 + input_set_capability(input_dev, EV_MSC, MSC_SCAN); 214 + 215 + input_dev->keycode = kbd->keycodes; 216 + input_dev->keycodesize = sizeof(kbd->keycodes[0]); 217 + input_dev->keycodemax = ARRAY_SIZE(kbd->keycodes); 218 + 219 + matrix_keypad_build_keymap(keymap, ROW_SHIFT, 220 + input_dev->keycode, input_dev->keybit); 221 + 222 + input_set_drvdata(input_dev, kbd); 223 + 224 + error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd); 225 + if (error) { 226 + dev_err(&pdev->dev, "request_irq fail\n"); 227 + goto err_put_clk; 228 + } 229 + 230 + error = input_register_device(input_dev); 231 + if (error) { 232 + dev_err(&pdev->dev, "Unable to register keyboard device\n"); 233 + goto err_free_irq; 234 + } 235 + 236 + device_init_wakeup(&pdev->dev, 1); 237 + platform_set_drvdata(pdev, kbd); 238 + 239 + return 0; 240 + 241 + err_free_irq: 242 + free_irq(kbd->irq, kbd); 243 + err_put_clk: 244 + clk_put(kbd->clk); 245 + err_iounmap: 246 + iounmap(kbd->io_base); 247 + err_release_mem_region: 248 + release_mem_region(res->start, resource_size(res)); 249 + err_free_mem: 250 + input_free_device(input_dev); 251 + kfree(kbd); 252 + 253 + return error; 254 + } 255 + 256 + static int __devexit spear_kbd_remove(struct platform_device *pdev) 257 + { 258 + struct spear_kbd *kbd = platform_get_drvdata(pdev); 259 + 260 + free_irq(kbd->irq, kbd); 261 + input_unregister_device(kbd->input); 262 + clk_put(kbd->clk); 263 + iounmap(kbd->io_base); 264 + release_mem_region(kbd->res->start, resource_size(kbd->res)); 265 + kfree(kbd); 266 + 267 + device_init_wakeup(&pdev->dev, 1); 268 + platform_set_drvdata(pdev, NULL); 269 + 270 + return 0; 271 + } 272 + 273 + #ifdef CONFIG_PM 274 + static int spear_kbd_suspend(struct device *dev) 275 + { 276 + struct platform_device *pdev = to_platform_device(dev); 277 + struct spear_kbd *kbd = platform_get_drvdata(pdev); 278 + struct input_dev *input_dev = kbd->input; 279 + 280 + mutex_lock(&input_dev->mutex); 281 + 282 + if (input_dev->users) 283 + clk_enable(kbd->clk); 284 + 285 + if (device_may_wakeup(&pdev->dev)) 286 + enable_irq_wake(kbd->irq); 287 + 288 + mutex_unlock(&input_dev->mutex); 289 + 290 + return 0; 291 + } 292 + 293 + static int spear_kbd_resume(struct device *dev) 294 + { 295 + struct platform_device *pdev = to_platform_device(dev); 296 + struct spear_kbd *kbd = platform_get_drvdata(pdev); 297 + struct input_dev *input_dev = kbd->input; 298 + 299 + mutex_lock(&input_dev->mutex); 300 + 301 + if (device_may_wakeup(&pdev->dev)) 302 + disable_irq_wake(kbd->irq); 303 + 304 + if (input_dev->users) 305 + clk_enable(kbd->clk); 306 + 307 + mutex_unlock(&input_dev->mutex); 308 + 309 + return 0; 310 + } 311 + 312 + static const struct dev_pm_ops spear_kbd_pm_ops = { 313 + .suspend = spear_kbd_suspend, 314 + .resume = spear_kbd_resume, 315 + }; 316 + #endif 317 + 318 + static struct platform_driver spear_kbd_driver = { 319 + .probe = spear_kbd_probe, 320 + .remove = __devexit_p(spear_kbd_remove), 321 + .driver = { 322 + .name = "keyboard", 323 + .owner = THIS_MODULE, 324 + #ifdef CONFIG_PM 325 + .pm = &spear_kbd_pm_ops, 326 + #endif 327 + }, 328 + }; 329 + 330 + static int __init spear_kbd_init(void) 331 + { 332 + return platform_driver_register(&spear_kbd_driver); 333 + } 334 + module_init(spear_kbd_init); 335 + 336 + static void __exit spear_kbd_exit(void) 337 + { 338 + platform_driver_unregister(&spear_kbd_driver); 339 + } 340 + module_exit(spear_kbd_exit); 341 + 342 + MODULE_AUTHOR("Rajeev Kumar"); 343 + MODULE_DESCRIPTION("SPEAr Keyboard Driver"); 344 + MODULE_LICENSE("GPL");
+10 -3
drivers/input/keyboard/tca6416-keypad.c
··· 29 29 30 30 static const struct i2c_device_id tca6416_id[] = { 31 31 { "tca6416-keys", 16, }, 32 + { "tca6408-keys", 8, }, 32 33 { } 33 34 }; 34 35 MODULE_DEVICE_TABLE(i2c, tca6416_id); ··· 47 46 struct i2c_client *client; 48 47 struct input_dev *input; 49 48 struct delayed_work dwork; 50 - u16 pinmask; 49 + int io_size; 51 50 int irqnum; 51 + u16 pinmask; 52 52 bool use_polling; 53 53 struct tca6416_button buttons[0]; 54 54 }; ··· 58 56 { 59 57 int error; 60 58 61 - error = i2c_smbus_write_word_data(chip->client, reg << 1, val); 59 + error = chip->io_size > 8 ? 60 + i2c_smbus_write_word_data(chip->client, reg << 1, val) : 61 + i2c_smbus_write_byte_data(chip->client, reg, val); 62 62 if (error < 0) { 63 63 dev_err(&chip->client->dev, 64 64 "%s failed, reg: %d, val: %d, error: %d\n", ··· 75 71 { 76 72 int retval; 77 73 78 - retval = i2c_smbus_read_word_data(chip->client, reg << 1); 74 + retval = chip->io_size > 8 ? 75 + i2c_smbus_read_word_data(chip->client, reg << 1) : 76 + i2c_smbus_read_byte_data(chip->client, reg); 79 77 if (retval < 0) { 80 78 dev_err(&chip->client->dev, "%s failed, reg: %d, error: %d\n", 81 79 __func__, reg, retval); ··· 230 224 231 225 chip->client = client; 232 226 chip->input = input; 227 + chip->io_size = id->driver_data; 233 228 chip->pinmask = pdata->pinmask; 234 229 chip->use_polling = pdata->use_polling; 235 230
+24
drivers/input/misc/Kconfig
··· 448 448 To compile this driver as a module, choose M here: the 449 449 module will be called adxl34x-spi. 450 450 451 + config INPUT_CMA3000 452 + tristate "VTI CMA3000 Tri-axis accelerometer" 453 + help 454 + Say Y here if you want to use VTI CMA3000_D0x Accelerometer 455 + driver 456 + 457 + This driver currently only supports I2C interface to the 458 + controller. Also select the I2C method. 459 + 460 + If unsure, say N 461 + 462 + To compile this driver as a module, choose M here: the 463 + module will be called cma3000_d0x. 464 + 465 + config INPUT_CMA3000_I2C 466 + tristate "Support I2C bus connection" 467 + depends on INPUT_CMA3000 && I2C 468 + help 469 + Say Y here if you want to use VTI CMA3000_D0x Accelerometer 470 + through I2C interface. 471 + 472 + To compile this driver as a module, choose M here: the 473 + module will be called cma3000_d0x_i2c. 474 + 451 475 endif
+2
drivers/input/misc/Makefile
··· 18 18 obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o 19 19 obj-$(CONFIG_INPUT_BFIN_ROTARY) += bfin_rotary.o 20 20 obj-$(CONFIG_INPUT_CM109) += cm109.o 21 + obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o 22 + obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o 21 23 obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o 22 24 obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o 23 25 obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
+398
drivers/input/misc/cma3000_d0x.c
··· 1 + /* 2 + * VTI CMA3000_D0x Accelerometer driver 3 + * 4 + * Copyright (C) 2010 Texas Instruments 5 + * Author: Hemanth V <hemanthv@ti.com> 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 version 2 as published by 9 + * the Free Software Foundation. 10 + * 11 + * This program is distributed in the hope that it will be useful, but WITHOUT 12 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 + * more details. 15 + * 16 + * You should have received a copy of the GNU General Public License along with 17 + * this program. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + 20 + #include <linux/types.h> 21 + #include <linux/interrupt.h> 22 + #include <linux/delay.h> 23 + #include <linux/slab.h> 24 + #include <linux/input.h> 25 + #include <linux/input/cma3000.h> 26 + 27 + #include "cma3000_d0x.h" 28 + 29 + #define CMA3000_WHOAMI 0x00 30 + #define CMA3000_REVID 0x01 31 + #define CMA3000_CTRL 0x02 32 + #define CMA3000_STATUS 0x03 33 + #define CMA3000_RSTR 0x04 34 + #define CMA3000_INTSTATUS 0x05 35 + #define CMA3000_DOUTX 0x06 36 + #define CMA3000_DOUTY 0x07 37 + #define CMA3000_DOUTZ 0x08 38 + #define CMA3000_MDTHR 0x09 39 + #define CMA3000_MDFFTMR 0x0A 40 + #define CMA3000_FFTHR 0x0B 41 + 42 + #define CMA3000_RANGE2G (1 << 7) 43 + #define CMA3000_RANGE8G (0 << 7) 44 + #define CMA3000_BUSI2C (0 << 4) 45 + #define CMA3000_MODEMASK (7 << 1) 46 + #define CMA3000_GRANGEMASK (1 << 7) 47 + 48 + #define CMA3000_STATUS_PERR 1 49 + #define CMA3000_INTSTATUS_FFDET (1 << 2) 50 + 51 + /* Settling time delay in ms */ 52 + #define CMA3000_SETDELAY 30 53 + 54 + /* Delay for clearing interrupt in us */ 55 + #define CMA3000_INTDELAY 44 56 + 57 + 58 + /* 59 + * Bit weights in mg for bit 0, other bits need 60 + * multipy factor 2^n. Eight bit is the sign bit. 61 + */ 62 + #define BIT_TO_2G 18 63 + #define BIT_TO_8G 71 64 + 65 + struct cma3000_accl_data { 66 + const struct cma3000_bus_ops *bus_ops; 67 + const struct cma3000_platform_data *pdata; 68 + 69 + struct device *dev; 70 + struct input_dev *input_dev; 71 + 72 + int bit_to_mg; 73 + int irq; 74 + 75 + int g_range; 76 + u8 mode; 77 + 78 + struct mutex mutex; 79 + bool opened; 80 + bool suspended; 81 + }; 82 + 83 + #define CMA3000_READ(data, reg, msg) \ 84 + (data->bus_ops->read(data->dev, reg, msg)) 85 + #define CMA3000_SET(data, reg, val, msg) \ 86 + ((data)->bus_ops->write(data->dev, reg, val, msg)) 87 + 88 + /* 89 + * Conversion for each of the eight modes to g, depending 90 + * on G range i.e 2G or 8G. Some modes always operate in 91 + * 8G. 92 + */ 93 + 94 + static int mode_to_mg[8][2] = { 95 + { 0, 0 }, 96 + { BIT_TO_8G, BIT_TO_2G }, 97 + { BIT_TO_8G, BIT_TO_2G }, 98 + { BIT_TO_8G, BIT_TO_8G }, 99 + { BIT_TO_8G, BIT_TO_8G }, 100 + { BIT_TO_8G, BIT_TO_2G }, 101 + { BIT_TO_8G, BIT_TO_2G }, 102 + { 0, 0}, 103 + }; 104 + 105 + static void decode_mg(struct cma3000_accl_data *data, int *datax, 106 + int *datay, int *dataz) 107 + { 108 + /* Data in 2's complement, convert to mg */ 109 + *datax = ((s8)*datax) * data->bit_to_mg; 110 + *datay = ((s8)*datay) * data->bit_to_mg; 111 + *dataz = ((s8)*dataz) * data->bit_to_mg; 112 + } 113 + 114 + static irqreturn_t cma3000_thread_irq(int irq, void *dev_id) 115 + { 116 + struct cma3000_accl_data *data = dev_id; 117 + int datax, datay, dataz; 118 + u8 ctrl, mode, range, intr_status; 119 + 120 + intr_status = CMA3000_READ(data, CMA3000_INTSTATUS, "interrupt status"); 121 + if (intr_status < 0) 122 + return IRQ_NONE; 123 + 124 + /* Check if free fall is detected, report immediately */ 125 + if (intr_status & CMA3000_INTSTATUS_FFDET) { 126 + input_report_abs(data->input_dev, ABS_MISC, 1); 127 + input_sync(data->input_dev); 128 + } else { 129 + input_report_abs(data->input_dev, ABS_MISC, 0); 130 + } 131 + 132 + datax = CMA3000_READ(data, CMA3000_DOUTX, "X"); 133 + datay = CMA3000_READ(data, CMA3000_DOUTY, "Y"); 134 + dataz = CMA3000_READ(data, CMA3000_DOUTZ, "Z"); 135 + 136 + ctrl = CMA3000_READ(data, CMA3000_CTRL, "ctrl"); 137 + mode = (ctrl & CMA3000_MODEMASK) >> 1; 138 + range = (ctrl & CMA3000_GRANGEMASK) >> 7; 139 + 140 + data->bit_to_mg = mode_to_mg[mode][range]; 141 + 142 + /* Interrupt not for this device */ 143 + if (data->bit_to_mg == 0) 144 + return IRQ_NONE; 145 + 146 + /* Decode register values to milli g */ 147 + decode_mg(data, &datax, &datay, &dataz); 148 + 149 + input_report_abs(data->input_dev, ABS_X, datax); 150 + input_report_abs(data->input_dev, ABS_Y, datay); 151 + input_report_abs(data->input_dev, ABS_Z, dataz); 152 + input_sync(data->input_dev); 153 + 154 + return IRQ_HANDLED; 155 + } 156 + 157 + static int cma3000_reset(struct cma3000_accl_data *data) 158 + { 159 + int val; 160 + 161 + /* Reset sequence */ 162 + CMA3000_SET(data, CMA3000_RSTR, 0x02, "Reset"); 163 + CMA3000_SET(data, CMA3000_RSTR, 0x0A, "Reset"); 164 + CMA3000_SET(data, CMA3000_RSTR, 0x04, "Reset"); 165 + 166 + /* Settling time delay */ 167 + mdelay(10); 168 + 169 + val = CMA3000_READ(data, CMA3000_STATUS, "Status"); 170 + if (val < 0) { 171 + dev_err(data->dev, "Reset failed\n"); 172 + return val; 173 + } 174 + 175 + if (val & CMA3000_STATUS_PERR) { 176 + dev_err(data->dev, "Parity Error\n"); 177 + return -EIO; 178 + } 179 + 180 + return 0; 181 + } 182 + 183 + static int cma3000_poweron(struct cma3000_accl_data *data) 184 + { 185 + const struct cma3000_platform_data *pdata = data->pdata; 186 + u8 ctrl = 0; 187 + int ret; 188 + 189 + if (data->g_range == CMARANGE_2G) { 190 + ctrl = (data->mode << 1) | CMA3000_RANGE2G; 191 + } else if (data->g_range == CMARANGE_8G) { 192 + ctrl = (data->mode << 1) | CMA3000_RANGE8G; 193 + } else { 194 + dev_info(data->dev, 195 + "Invalid G range specified, assuming 8G\n"); 196 + ctrl = (data->mode << 1) | CMA3000_RANGE8G; 197 + } 198 + 199 + ctrl |= data->bus_ops->ctrl_mod; 200 + 201 + CMA3000_SET(data, CMA3000_MDTHR, pdata->mdthr, 202 + "Motion Detect Threshold"); 203 + CMA3000_SET(data, CMA3000_MDFFTMR, pdata->mdfftmr, 204 + "Time register"); 205 + CMA3000_SET(data, CMA3000_FFTHR, pdata->ffthr, 206 + "Free fall threshold"); 207 + ret = CMA3000_SET(data, CMA3000_CTRL, ctrl, "Mode setting"); 208 + if (ret < 0) 209 + return -EIO; 210 + 211 + msleep(CMA3000_SETDELAY); 212 + 213 + return 0; 214 + } 215 + 216 + static int cma3000_poweroff(struct cma3000_accl_data *data) 217 + { 218 + int ret; 219 + 220 + ret = CMA3000_SET(data, CMA3000_CTRL, CMAMODE_POFF, "Mode setting"); 221 + msleep(CMA3000_SETDELAY); 222 + 223 + return ret; 224 + } 225 + 226 + static int cma3000_open(struct input_dev *input_dev) 227 + { 228 + struct cma3000_accl_data *data = input_get_drvdata(input_dev); 229 + 230 + mutex_lock(&data->mutex); 231 + 232 + if (!data->suspended) 233 + cma3000_poweron(data); 234 + 235 + data->opened = true; 236 + 237 + mutex_unlock(&data->mutex); 238 + 239 + return 0; 240 + } 241 + 242 + static void cma3000_close(struct input_dev *input_dev) 243 + { 244 + struct cma3000_accl_data *data = input_get_drvdata(input_dev); 245 + 246 + mutex_lock(&data->mutex); 247 + 248 + if (!data->suspended) 249 + cma3000_poweroff(data); 250 + 251 + data->opened = false; 252 + 253 + mutex_unlock(&data->mutex); 254 + } 255 + 256 + void cma3000_suspend(struct cma3000_accl_data *data) 257 + { 258 + mutex_lock(&data->mutex); 259 + 260 + if (!data->suspended && data->opened) 261 + cma3000_poweroff(data); 262 + 263 + data->suspended = true; 264 + 265 + mutex_unlock(&data->mutex); 266 + } 267 + EXPORT_SYMBOL(cma3000_suspend); 268 + 269 + 270 + void cma3000_resume(struct cma3000_accl_data *data) 271 + { 272 + mutex_lock(&data->mutex); 273 + 274 + if (data->suspended && data->opened) 275 + cma3000_poweron(data); 276 + 277 + data->suspended = false; 278 + 279 + mutex_unlock(&data->mutex); 280 + } 281 + EXPORT_SYMBOL(cma3000_resume); 282 + 283 + struct cma3000_accl_data *cma3000_init(struct device *dev, int irq, 284 + const struct cma3000_bus_ops *bops) 285 + { 286 + const struct cma3000_platform_data *pdata = dev->platform_data; 287 + struct cma3000_accl_data *data; 288 + struct input_dev *input_dev; 289 + int rev; 290 + int error; 291 + 292 + if (!pdata) { 293 + dev_err(dev, "platform data not found\n"); 294 + error = -EINVAL; 295 + goto err_out; 296 + } 297 + 298 + 299 + /* if no IRQ return error */ 300 + if (irq == 0) { 301 + error = -EINVAL; 302 + goto err_out; 303 + } 304 + 305 + data = kzalloc(sizeof(struct cma3000_accl_data), GFP_KERNEL); 306 + input_dev = input_allocate_device(); 307 + if (!data || !input_dev) { 308 + error = -ENOMEM; 309 + goto err_free_mem; 310 + } 311 + 312 + data->dev = dev; 313 + data->input_dev = input_dev; 314 + data->bus_ops = bops; 315 + data->pdata = pdata; 316 + data->irq = irq; 317 + mutex_init(&data->mutex); 318 + 319 + data->mode = pdata->mode; 320 + if (data->mode < CMAMODE_DEFAULT || data->mode > CMAMODE_POFF) { 321 + data->mode = CMAMODE_MOTDET; 322 + dev_warn(dev, 323 + "Invalid mode specified, assuming Motion Detect\n"); 324 + } 325 + 326 + data->g_range = pdata->g_range; 327 + if (data->g_range != CMARANGE_2G && data->g_range != CMARANGE_8G) { 328 + dev_info(dev, 329 + "Invalid G range specified, assuming 8G\n"); 330 + data->g_range = CMARANGE_8G; 331 + } 332 + 333 + input_dev->name = "cma3000-accelerometer"; 334 + input_dev->id.bustype = bops->bustype; 335 + input_dev->open = cma3000_open; 336 + input_dev->close = cma3000_close; 337 + 338 + __set_bit(EV_ABS, input_dev->evbit); 339 + 340 + input_set_abs_params(input_dev, ABS_X, 341 + -data->g_range, data->g_range, pdata->fuzz_x, 0); 342 + input_set_abs_params(input_dev, ABS_Y, 343 + -data->g_range, data->g_range, pdata->fuzz_y, 0); 344 + input_set_abs_params(input_dev, ABS_Z, 345 + -data->g_range, data->g_range, pdata->fuzz_z, 0); 346 + input_set_abs_params(input_dev, ABS_MISC, 0, 1, 0, 0); 347 + 348 + input_set_drvdata(input_dev, data); 349 + 350 + error = cma3000_reset(data); 351 + if (error) 352 + goto err_free_mem; 353 + 354 + rev = CMA3000_READ(data, CMA3000_REVID, "Revid"); 355 + if (rev < 0) { 356 + error = rev; 357 + goto err_free_mem; 358 + } 359 + 360 + pr_info("CMA3000 Accelerometer: Revision %x\n", rev); 361 + 362 + error = request_threaded_irq(irq, NULL, cma3000_thread_irq, 363 + pdata->irqflags | IRQF_ONESHOT, 364 + "cma3000_d0x", data); 365 + if (error) { 366 + dev_err(dev, "request_threaded_irq failed\n"); 367 + goto err_free_mem; 368 + } 369 + 370 + error = input_register_device(data->input_dev); 371 + if (error) { 372 + dev_err(dev, "Unable to register input device\n"); 373 + goto err_free_irq; 374 + } 375 + 376 + return data; 377 + 378 + err_free_irq: 379 + free_irq(irq, data); 380 + err_free_mem: 381 + input_free_device(input_dev); 382 + kfree(data); 383 + err_out: 384 + return ERR_PTR(error); 385 + } 386 + EXPORT_SYMBOL(cma3000_init); 387 + 388 + void cma3000_exit(struct cma3000_accl_data *data) 389 + { 390 + free_irq(data->irq, data); 391 + input_unregister_device(data->input_dev); 392 + kfree(data); 393 + } 394 + EXPORT_SYMBOL(cma3000_exit); 395 + 396 + MODULE_DESCRIPTION("CMA3000-D0x Accelerometer Driver"); 397 + MODULE_LICENSE("GPL"); 398 + MODULE_AUTHOR("Hemanth V <hemanthv@ti.com>");
+42
drivers/input/misc/cma3000_d0x.h
··· 1 + /* 2 + * VTI CMA3000_D0x Accelerometer driver 3 + * 4 + * Copyright (C) 2010 Texas Instruments 5 + * Author: Hemanth V <hemanthv@ti.com> 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 version 2 as published by 9 + * the Free Software Foundation. 10 + * 11 + * This program is distributed in the hope that it will be useful, but WITHOUT 12 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 + * more details. 15 + * 16 + * You should have received a copy of the GNU General Public License along with 17 + * this program. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + 20 + #ifndef _INPUT_CMA3000_H 21 + #define _INPUT_CMA3000_H 22 + 23 + #include <linux/types.h> 24 + #include <linux/input.h> 25 + 26 + struct device; 27 + struct cma3000_accl_data; 28 + 29 + struct cma3000_bus_ops { 30 + u16 bustype; 31 + u8 ctrl_mod; 32 + int (*read)(struct device *, u8, char *); 33 + int (*write)(struct device *, u8, u8, char *); 34 + }; 35 + 36 + struct cma3000_accl_data *cma3000_init(struct device *dev, int irq, 37 + const struct cma3000_bus_ops *bops); 38 + void cma3000_exit(struct cma3000_accl_data *); 39 + void cma3000_suspend(struct cma3000_accl_data *); 40 + void cma3000_resume(struct cma3000_accl_data *); 41 + 42 + #endif
+143
drivers/input/misc/cma3000_d0x_i2c.c
··· 1 + /* 2 + * Implements I2C interface for VTI CMA300_D0x Accelerometer driver 3 + * 4 + * Copyright (C) 2010 Texas Instruments 5 + * Author: Hemanth V <hemanthv@ti.com> 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 version 2 as published by 9 + * the Free Software Foundation. 10 + * 11 + * This program is distributed in the hope that it will be useful, but WITHOUT 12 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 + * more details. 15 + * 16 + * You should have received a copy of the GNU General Public License along with 17 + * this program. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + 20 + #include <linux/module.h> 21 + #include <linux/i2c.h> 22 + #include <linux/input/cma3000.h> 23 + #include "cma3000_d0x.h" 24 + 25 + static int cma3000_i2c_set(struct device *dev, 26 + u8 reg, u8 val, char *msg) 27 + { 28 + struct i2c_client *client = to_i2c_client(dev); 29 + int ret; 30 + 31 + ret = i2c_smbus_write_byte_data(client, reg, val); 32 + if (ret < 0) 33 + dev_err(&client->dev, 34 + "%s failed (%s, %d)\n", __func__, msg, ret); 35 + return ret; 36 + } 37 + 38 + static int cma3000_i2c_read(struct device *dev, u8 reg, char *msg) 39 + { 40 + struct i2c_client *client = to_i2c_client(dev); 41 + int ret; 42 + 43 + ret = i2c_smbus_read_byte_data(client, reg); 44 + if (ret < 0) 45 + dev_err(&client->dev, 46 + "%s failed (%s, %d)\n", __func__, msg, ret); 47 + return ret; 48 + } 49 + 50 + static const struct cma3000_bus_ops cma3000_i2c_bops = { 51 + .bustype = BUS_I2C, 52 + #define CMA3000_BUSI2C (0 << 4) 53 + .ctrl_mod = CMA3000_BUSI2C, 54 + .read = cma3000_i2c_read, 55 + .write = cma3000_i2c_set, 56 + }; 57 + 58 + static int __devinit cma3000_i2c_probe(struct i2c_client *client, 59 + const struct i2c_device_id *id) 60 + { 61 + struct cma3000_accl_data *data; 62 + 63 + data = cma3000_init(&client->dev, client->irq, &cma3000_i2c_bops); 64 + if (IS_ERR(data)) 65 + return PTR_ERR(data); 66 + 67 + i2c_set_clientdata(client, data); 68 + 69 + return 0; 70 + } 71 + 72 + static int __devexit cma3000_i2c_remove(struct i2c_client *client) 73 + { 74 + struct cma3000_accl_data *data = i2c_get_clientdata(client); 75 + 76 + cma3000_exit(data); 77 + 78 + return 0; 79 + } 80 + 81 + #ifdef CONFIG_PM 82 + static int cma3000_i2c_suspend(struct device *dev) 83 + { 84 + struct i2c_client *client = to_i2c_client(dev); 85 + struct cma3000_accl_data *data = i2c_get_clientdata(client); 86 + 87 + cma3000_suspend(data); 88 + 89 + return 0; 90 + } 91 + 92 + static int cma3000_i2c_resume(struct device *dev) 93 + { 94 + struct i2c_client *client = to_i2c_client(dev); 95 + struct cma3000_accl_data *data = i2c_get_clientdata(client); 96 + 97 + cma3000_resume(data); 98 + 99 + return 0; 100 + } 101 + 102 + static const struct dev_pm_ops cma3000_i2c_pm_ops = { 103 + .suspend = cma3000_i2c_suspend, 104 + .resume = cma3000_i2c_resume, 105 + }; 106 + #endif 107 + 108 + static const struct i2c_device_id cma3000_i2c_id[] = { 109 + { "cma3000_d01", 0 }, 110 + { }, 111 + }; 112 + 113 + MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id); 114 + 115 + static struct i2c_driver cma3000_i2c_driver = { 116 + .probe = cma3000_i2c_probe, 117 + .remove = __devexit_p(cma3000_i2c_remove), 118 + .id_table = cma3000_i2c_id, 119 + .driver = { 120 + .name = "cma3000_i2c_accl", 121 + .owner = THIS_MODULE, 122 + #ifdef CONFIG_PM 123 + .pm = &cma3000_i2c_pm_ops, 124 + #endif 125 + }, 126 + }; 127 + 128 + static int __init cma3000_i2c_init(void) 129 + { 130 + return i2c_add_driver(&cma3000_i2c_driver); 131 + } 132 + 133 + static void __exit cma3000_i2c_exit(void) 134 + { 135 + i2c_del_driver(&cma3000_i2c_driver); 136 + } 137 + 138 + module_init(cma3000_i2c_init); 139 + module_exit(cma3000_i2c_exit); 140 + 141 + MODULE_DESCRIPTION("CMA3000-D0x Accelerometer I2C Driver"); 142 + MODULE_LICENSE("GPL"); 143 + MODULE_AUTHOR("Hemanth V <hemanthv@ti.com>");
+15 -4
drivers/input/misc/pcf8574_keypad.c
··· 169 169 } 170 170 171 171 #ifdef CONFIG_PM 172 - static int pcf8574_kp_resume(struct i2c_client *client) 172 + static int pcf8574_kp_resume(struct device *dev) 173 173 { 174 + struct i2c_client *client = to_i2c_client(dev); 175 + 174 176 enable_irq(client->irq); 175 177 176 178 return 0; 177 179 } 178 180 179 - static int pcf8574_kp_suspend(struct i2c_client *client, pm_message_t mesg) 181 + static int pcf8574_kp_suspend(struct device *dev) 180 182 { 183 + struct i2c_client *client = to_i2c_client(dev); 184 + 181 185 disable_irq(client->irq); 182 186 183 187 return 0; 184 188 } 189 + 190 + static const struct dev_pm_ops pcf8574_kp_pm_ops = { 191 + .suspend = pcf8574_kp_suspend, 192 + .resume = pcf8574_kp_resume, 193 + }; 194 + 185 195 #else 186 196 # define pcf8574_kp_resume NULL 187 197 # define pcf8574_kp_suspend NULL ··· 207 197 .driver = { 208 198 .name = DRV_NAME, 209 199 .owner = THIS_MODULE, 200 + #ifdef CONFIG_PM 201 + .pm = &pcf8574_kp_pm_ops, 202 + #endif 210 203 }, 211 204 .probe = pcf8574_kp_probe, 212 205 .remove = __devexit_p(pcf8574_kp_remove), 213 - .suspend = pcf8574_kp_suspend, 214 - .resume = pcf8574_kp_resume, 215 206 .id_table = pcf8574_kp_id, 216 207 }; 217 208
+6 -2
drivers/input/misc/uinput.c
··· 37 37 #include <linux/fs.h> 38 38 #include <linux/miscdevice.h> 39 39 #include <linux/uinput.h> 40 + #include <linux/input/mt.h> 40 41 #include "../input-compat.h" 41 42 42 43 static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) ··· 407 406 goto exit; 408 407 if (test_bit(ABS_MT_SLOT, dev->absbit)) { 409 408 int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1; 410 - input_mt_create_slots(dev, nslot); 411 - input_set_events_per_packet(dev, 6 * nslot); 409 + input_mt_init_slots(dev, nslot); 412 410 } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { 413 411 input_set_events_per_packet(dev, 60); 414 412 } ··· 678 678 679 679 case UI_SET_SWBIT: 680 680 retval = uinput_set_bit(arg, swbit, SW_MAX); 681 + break; 682 + 683 + case UI_SET_PROPBIT: 684 + retval = uinput_set_bit(arg, propbit, INPUT_PROP_MAX); 681 685 break; 682 686 683 687 case UI_SET_PHYS:
+613 -80
drivers/input/mouse/hgpk.c
··· 40 40 #include "psmouse.h" 41 41 #include "hgpk.h" 42 42 43 + #define ILLEGAL_XY 999999 44 + 43 45 static bool tpdebug; 44 46 module_param(tpdebug, bool, 0644); 45 47 MODULE_PARM_DESC(tpdebug, "enable debugging, dumping packets to KERN_DEBUG."); ··· 49 47 static int recalib_delta = 100; 50 48 module_param(recalib_delta, int, 0644); 51 49 MODULE_PARM_DESC(recalib_delta, 52 - "packets containing a delta this large will cause a recalibration."); 50 + "packets containing a delta this large will be discarded, and a " 51 + "recalibration may be scheduled."); 53 52 54 - static int jumpy_delay = 1000; 53 + static int jumpy_delay = 20; 55 54 module_param(jumpy_delay, int, 0644); 56 55 MODULE_PARM_DESC(jumpy_delay, 57 56 "delay (ms) before recal after jumpiness detected"); 58 57 59 - static int spew_delay = 1000; 58 + static int spew_delay = 1; 60 59 module_param(spew_delay, int, 0644); 61 60 MODULE_PARM_DESC(spew_delay, 62 61 "delay (ms) before recal after packet spew detected"); 63 62 64 - static int recal_guard_time = 2000; 63 + static int recal_guard_time; 65 64 module_param(recal_guard_time, int, 0644); 66 65 MODULE_PARM_DESC(recal_guard_time, 67 66 "interval (ms) during which recal will be restarted if packet received"); 68 67 69 - static int post_interrupt_delay = 1000; 68 + static int post_interrupt_delay = 40; 70 69 module_param(post_interrupt_delay, int, 0644); 71 70 MODULE_PARM_DESC(post_interrupt_delay, 72 71 "delay (ms) before recal after recal interrupt detected"); 73 72 73 + static bool autorecal = true; 74 + module_param(autorecal, bool, 0644); 75 + MODULE_PARM_DESC(autorecal, "enable recalibration in the driver"); 76 + 77 + static char hgpk_mode_name[16]; 78 + module_param_string(hgpk_mode, hgpk_mode_name, sizeof(hgpk_mode_name), 0644); 79 + MODULE_PARM_DESC(hgpk_mode, 80 + "default hgpk mode: mouse, glidesensor or pentablet"); 81 + 82 + static int hgpk_default_mode = HGPK_MODE_MOUSE; 83 + 84 + static const char * const hgpk_mode_names[] = { 85 + [HGPK_MODE_MOUSE] = "Mouse", 86 + [HGPK_MODE_GLIDESENSOR] = "GlideSensor", 87 + [HGPK_MODE_PENTABLET] = "PenTablet", 88 + }; 89 + 90 + static int hgpk_mode_from_name(const char *buf, int len) 91 + { 92 + int i; 93 + 94 + for (i = 0; i < ARRAY_SIZE(hgpk_mode_names); i++) { 95 + const char *name = hgpk_mode_names[i]; 96 + if (strlen(name) == len && !strncasecmp(name, buf, len)) 97 + return i; 98 + } 99 + 100 + return HGPK_MODE_INVALID; 101 + } 102 + 74 103 /* 75 - * When the touchpad gets ultra-sensitive, one can keep their finger 1/2" 76 - * above the pad and still have it send packets. This causes a jump cursor 77 - * when one places their finger on the pad. We can probably detect the 78 - * jump as we see a large deltas (>= 100px). In mouse mode, I've been 79 - * unable to even come close to 100px deltas during normal usage, so I think 80 - * this threshold is safe. If a large delta occurs, trigger a recalibration. 104 + * see if new value is within 20% of half of old value 81 105 */ 82 - static void hgpk_jumpy_hack(struct psmouse *psmouse, int x, int y) 106 + static int approx_half(int curr, int prev) 107 + { 108 + int belowhalf, abovehalf; 109 + 110 + if (curr < 5 || prev < 5) 111 + return 0; 112 + 113 + belowhalf = (prev * 8) / 20; 114 + abovehalf = (prev * 12) / 20; 115 + 116 + return belowhalf < curr && curr <= abovehalf; 117 + } 118 + 119 + /* 120 + * Throw out oddly large delta packets, and any that immediately follow whose 121 + * values are each approximately half of the previous. It seems that the ALPS 122 + * firmware emits errant packets, and they get averaged out slowly. 123 + */ 124 + static int hgpk_discard_decay_hack(struct psmouse *psmouse, int x, int y) 83 125 { 84 126 struct hgpk_data *priv = psmouse->private; 127 + int avx, avy; 128 + bool do_recal = false; 85 129 86 - if (abs(x) > recalib_delta || abs(y) > recalib_delta) { 87 - hgpk_err(psmouse, ">%dpx jump detected (%d,%d)\n", 88 - recalib_delta, x, y); 89 - /* My car gets forty rods to the hogshead and that's the 90 - * way I likes it! */ 130 + avx = abs(x); 131 + avy = abs(y); 132 + 133 + /* discard if too big, or half that but > 4 times the prev delta */ 134 + if (avx > recalib_delta || 135 + (avx > recalib_delta / 2 && ((avx / 4) > priv->xlast))) { 136 + hgpk_err(psmouse, "detected %dpx jump in x\n", x); 137 + priv->xbigj = avx; 138 + } else if (approx_half(avx, priv->xbigj)) { 139 + hgpk_err(psmouse, "detected secondary %dpx jump in x\n", x); 140 + priv->xbigj = avx; 141 + priv->xsaw_secondary++; 142 + } else { 143 + if (priv->xbigj && priv->xsaw_secondary > 1) 144 + do_recal = true; 145 + priv->xbigj = 0; 146 + priv->xsaw_secondary = 0; 147 + } 148 + 149 + if (avy > recalib_delta || 150 + (avy > recalib_delta / 2 && ((avy / 4) > priv->ylast))) { 151 + hgpk_err(psmouse, "detected %dpx jump in y\n", y); 152 + priv->ybigj = avy; 153 + } else if (approx_half(avy, priv->ybigj)) { 154 + hgpk_err(psmouse, "detected secondary %dpx jump in y\n", y); 155 + priv->ybigj = avy; 156 + priv->ysaw_secondary++; 157 + } else { 158 + if (priv->ybigj && priv->ysaw_secondary > 1) 159 + do_recal = true; 160 + priv->ybigj = 0; 161 + priv->ysaw_secondary = 0; 162 + } 163 + 164 + priv->xlast = avx; 165 + priv->ylast = avy; 166 + 167 + if (do_recal && jumpy_delay) { 168 + hgpk_err(psmouse, "scheduling recalibration\n"); 91 169 psmouse_queue_work(psmouse, &priv->recalib_wq, 92 170 msecs_to_jiffies(jumpy_delay)); 93 171 } 172 + 173 + return priv->xbigj || priv->ybigj; 174 + } 175 + 176 + static void hgpk_reset_spew_detection(struct hgpk_data *priv) 177 + { 178 + priv->spew_count = 0; 179 + priv->dupe_count = 0; 180 + priv->x_tally = 0; 181 + priv->y_tally = 0; 182 + priv->spew_flag = NO_SPEW; 183 + } 184 + 185 + static void hgpk_reset_hack_state(struct psmouse *psmouse) 186 + { 187 + struct hgpk_data *priv = psmouse->private; 188 + 189 + priv->abs_x = priv->abs_y = -1; 190 + priv->xlast = priv->ylast = ILLEGAL_XY; 191 + priv->xbigj = priv->ybigj = 0; 192 + priv->xsaw_secondary = priv->ysaw_secondary = 0; 193 + hgpk_reset_spew_detection(priv); 94 194 } 95 195 96 196 /* ··· 220 116 if (l || r) 221 117 return; 222 118 119 + /* don't track spew if the workaround feature has been turned off */ 120 + if (!spew_delay) 121 + return; 122 + 123 + if (abs(x) > 3 || abs(y) > 3) { 124 + /* no spew, or spew ended */ 125 + hgpk_reset_spew_detection(priv); 126 + return; 127 + } 128 + 129 + /* Keep a tally of the overall delta to the cursor position caused by 130 + * the spew */ 223 131 priv->x_tally += x; 224 132 priv->y_tally += y; 225 133 226 - if (++priv->count > 100) { 134 + switch (priv->spew_flag) { 135 + case NO_SPEW: 136 + /* we're not spewing, but this packet might be the start */ 137 + priv->spew_flag = MAYBE_SPEWING; 138 + 139 + /* fall-through */ 140 + 141 + case MAYBE_SPEWING: 142 + priv->spew_count++; 143 + 144 + if (priv->spew_count < SPEW_WATCH_COUNT) 145 + break; 146 + 147 + /* excessive spew detected, request recalibration */ 148 + priv->spew_flag = SPEW_DETECTED; 149 + 150 + /* fall-through */ 151 + 152 + case SPEW_DETECTED: 153 + /* only recalibrate when the overall delta to the cursor 154 + * is really small. if the spew is causing significant cursor 155 + * movement, it is probably a case of the user moving the 156 + * cursor very slowly across the screen. */ 227 157 if (abs(priv->x_tally) < 3 && abs(priv->y_tally) < 3) { 228 - hgpk_dbg(psmouse, "packet spew detected (%d,%d)\n", 158 + hgpk_err(psmouse, "packet spew detected (%d,%d)\n", 229 159 priv->x_tally, priv->y_tally); 160 + priv->spew_flag = RECALIBRATING; 230 161 psmouse_queue_work(psmouse, &priv->recalib_wq, 231 162 msecs_to_jiffies(spew_delay)); 232 163 } 233 - /* reset every 100 packets */ 234 - priv->count = 0; 235 - priv->x_tally = 0; 236 - priv->y_tally = 0; 164 + 165 + break; 166 + case RECALIBRATING: 167 + /* we already detected a spew and requested a recalibration, 168 + * just wait for the queue to kick into action. */ 169 + break; 237 170 } 238 171 } 239 172 ··· 284 143 * swr/swl are the left/right buttons. 285 144 * x-neg/y-neg are the x and y delta negative bits 286 145 * x-over/y-over are the x and y overflow bits 146 + * 147 + * --- 148 + * 149 + * HGPK Advanced Mode - single-mode format 150 + * 151 + * byte 0(PT): 1 1 0 0 1 1 1 1 152 + * byte 0(GS): 1 1 1 1 1 1 1 1 153 + * byte 1: 0 x6 x5 x4 x3 x2 x1 x0 154 + * byte 2(PT): 0 0 x9 x8 x7 ? pt-dsw 0 155 + * byte 2(GS): 0 x10 x9 x8 x7 ? gs-dsw pt-dsw 156 + * byte 3: 0 y9 y8 y7 1 0 swr swl 157 + * byte 4: 0 y6 y5 y4 y3 y2 y1 y0 158 + * byte 5: 0 z6 z5 z4 z3 z2 z1 z0 159 + * 160 + * ?'s are not defined in the protocol spec, may vary between models. 161 + * 162 + * swr/swl are the left/right buttons. 163 + * 164 + * pt-dsw/gs-dsw indicate that the pt/gs sensor is detecting a 165 + * pen/finger 287 166 */ 288 - static int hgpk_validate_byte(unsigned char *packet) 167 + static bool hgpk_is_byte_valid(struct psmouse *psmouse, unsigned char *packet) 289 168 { 290 - return (packet[0] & 0x0C) != 0x08; 169 + struct hgpk_data *priv = psmouse->private; 170 + int pktcnt = psmouse->pktcnt; 171 + bool valid; 172 + 173 + switch (priv->mode) { 174 + case HGPK_MODE_MOUSE: 175 + valid = (packet[0] & 0x0C) == 0x08; 176 + break; 177 + 178 + case HGPK_MODE_GLIDESENSOR: 179 + valid = pktcnt == 1 ? 180 + packet[0] == HGPK_GS : !(packet[pktcnt - 1] & 0x80); 181 + break; 182 + 183 + case HGPK_MODE_PENTABLET: 184 + valid = pktcnt == 1 ? 185 + packet[0] == HGPK_PT : !(packet[pktcnt - 1] & 0x80); 186 + break; 187 + 188 + default: 189 + valid = false; 190 + break; 191 + } 192 + 193 + if (!valid) 194 + hgpk_dbg(psmouse, 195 + "bad data, mode %d (%d) %02x %02x %02x %02x %02x %02x\n", 196 + priv->mode, pktcnt, 197 + psmouse->packet[0], psmouse->packet[1], 198 + psmouse->packet[2], psmouse->packet[3], 199 + psmouse->packet[4], psmouse->packet[5]); 200 + 201 + return valid; 291 202 } 292 203 293 - static void hgpk_process_packet(struct psmouse *psmouse) 204 + static void hgpk_process_advanced_packet(struct psmouse *psmouse) 205 + { 206 + struct hgpk_data *priv = psmouse->private; 207 + struct input_dev *idev = psmouse->dev; 208 + unsigned char *packet = psmouse->packet; 209 + int down = !!(packet[2] & 2); 210 + int left = !!(packet[3] & 1); 211 + int right = !!(packet[3] & 2); 212 + int x = packet[1] | ((packet[2] & 0x78) << 4); 213 + int y = packet[4] | ((packet[3] & 0x70) << 3); 214 + 215 + if (priv->mode == HGPK_MODE_GLIDESENSOR) { 216 + int pt_down = !!(packet[2] & 1); 217 + int finger_down = !!(packet[2] & 2); 218 + int z = packet[5]; 219 + 220 + input_report_abs(idev, ABS_PRESSURE, z); 221 + if (tpdebug) 222 + hgpk_dbg(psmouse, "pd=%d fd=%d z=%d", 223 + pt_down, finger_down, z); 224 + } else { 225 + /* 226 + * PenTablet mode does not report pressure, so we don't 227 + * report it here 228 + */ 229 + if (tpdebug) 230 + hgpk_dbg(psmouse, "pd=%d ", down); 231 + } 232 + 233 + if (tpdebug) 234 + hgpk_dbg(psmouse, "l=%d r=%d x=%d y=%d\n", left, right, x, y); 235 + 236 + input_report_key(idev, BTN_TOUCH, down); 237 + input_report_key(idev, BTN_LEFT, left); 238 + input_report_key(idev, BTN_RIGHT, right); 239 + 240 + /* 241 + * If this packet says that the finger was removed, reset our position 242 + * tracking so that we don't erroneously detect a jump on next press. 243 + */ 244 + if (!down) { 245 + hgpk_reset_hack_state(psmouse); 246 + goto done; 247 + } 248 + 249 + /* 250 + * Weed out duplicate packets (we get quite a few, and they mess up 251 + * our jump detection) 252 + */ 253 + if (x == priv->abs_x && y == priv->abs_y) { 254 + if (++priv->dupe_count > SPEW_WATCH_COUNT) { 255 + if (tpdebug) 256 + hgpk_dbg(psmouse, "hard spew detected\n"); 257 + priv->spew_flag = RECALIBRATING; 258 + psmouse_queue_work(psmouse, &priv->recalib_wq, 259 + msecs_to_jiffies(spew_delay)); 260 + } 261 + goto done; 262 + } 263 + 264 + /* not a duplicate, continue with position reporting */ 265 + priv->dupe_count = 0; 266 + 267 + /* Don't apply hacks in PT mode, it seems reliable */ 268 + if (priv->mode != HGPK_MODE_PENTABLET && priv->abs_x != -1) { 269 + int x_diff = priv->abs_x - x; 270 + int y_diff = priv->abs_y - y; 271 + if (hgpk_discard_decay_hack(psmouse, x_diff, y_diff)) { 272 + if (tpdebug) 273 + hgpk_dbg(psmouse, "discarding\n"); 274 + goto done; 275 + } 276 + hgpk_spewing_hack(psmouse, left, right, x_diff, y_diff); 277 + } 278 + 279 + input_report_abs(idev, ABS_X, x); 280 + input_report_abs(idev, ABS_Y, y); 281 + priv->abs_x = x; 282 + priv->abs_y = y; 283 + 284 + done: 285 + input_sync(idev); 286 + } 287 + 288 + static void hgpk_process_simple_packet(struct psmouse *psmouse) 294 289 { 295 290 struct input_dev *dev = psmouse->dev; 296 291 unsigned char *packet = psmouse->packet; 297 - int x, y, left, right; 292 + int left = packet[0] & 1; 293 + int right = (packet[0] >> 1) & 1; 294 + int x = packet[1] - ((packet[0] << 4) & 0x100); 295 + int y = ((packet[0] << 3) & 0x100) - packet[2]; 298 296 299 - left = packet[0] & 1; 300 - right = (packet[0] >> 1) & 1; 297 + if (packet[0] & 0xc0) 298 + hgpk_dbg(psmouse, 299 + "overflow -- 0x%02x 0x%02x 0x%02x\n", 300 + packet[0], packet[1], packet[2]); 301 301 302 - x = packet[1] - ((packet[0] << 4) & 0x100); 303 - y = ((packet[0] << 3) & 0x100) - packet[2]; 302 + if (hgpk_discard_decay_hack(psmouse, x, y)) { 303 + if (tpdebug) 304 + hgpk_dbg(psmouse, "discarding\n"); 305 + return; 306 + } 304 307 305 - hgpk_jumpy_hack(psmouse, x, y); 306 308 hgpk_spewing_hack(psmouse, left, right, x, y); 307 309 308 310 if (tpdebug) ··· 464 180 { 465 181 struct hgpk_data *priv = psmouse->private; 466 182 467 - if (hgpk_validate_byte(psmouse->packet)) { 468 - hgpk_dbg(psmouse, "%s: (%d) %02x %02x %02x\n", 469 - __func__, psmouse->pktcnt, psmouse->packet[0], 470 - psmouse->packet[1], psmouse->packet[2]); 183 + if (!hgpk_is_byte_valid(psmouse, psmouse->packet)) 471 184 return PSMOUSE_BAD_DATA; 472 - } 473 185 474 186 if (psmouse->pktcnt >= psmouse->pktsize) { 475 - hgpk_process_packet(psmouse); 187 + if (priv->mode == HGPK_MODE_MOUSE) 188 + hgpk_process_simple_packet(psmouse); 189 + else 190 + hgpk_process_advanced_packet(psmouse); 476 191 return PSMOUSE_FULL_PACKET; 477 192 } 478 193 ··· 493 210 return PSMOUSE_GOOD_DATA; 494 211 } 495 212 213 + static int hgpk_select_mode(struct psmouse *psmouse) 214 + { 215 + struct ps2dev *ps2dev = &psmouse->ps2dev; 216 + struct hgpk_data *priv = psmouse->private; 217 + int i; 218 + int cmd; 219 + 220 + /* 221 + * 4 disables to enable advanced mode 222 + * then 3 0xf2 bytes as the preamble for GS/PT selection 223 + */ 224 + const int advanced_init[] = { 225 + PSMOUSE_CMD_DISABLE, PSMOUSE_CMD_DISABLE, 226 + PSMOUSE_CMD_DISABLE, PSMOUSE_CMD_DISABLE, 227 + 0xf2, 0xf2, 0xf2, 228 + }; 229 + 230 + switch (priv->mode) { 231 + case HGPK_MODE_MOUSE: 232 + psmouse->pktsize = 3; 233 + break; 234 + 235 + case HGPK_MODE_GLIDESENSOR: 236 + case HGPK_MODE_PENTABLET: 237 + psmouse->pktsize = 6; 238 + 239 + /* Switch to 'Advanced mode.', four disables in a row. */ 240 + for (i = 0; i < ARRAY_SIZE(advanced_init); i++) 241 + if (ps2_command(ps2dev, NULL, advanced_init[i])) 242 + return -EIO; 243 + 244 + /* select between GlideSensor (mouse) or PenTablet */ 245 + cmd = priv->mode == HGPK_MODE_GLIDESENSOR ? 246 + PSMOUSE_CMD_SETSCALE11 : PSMOUSE_CMD_SETSCALE21; 247 + 248 + if (ps2_command(ps2dev, NULL, cmd)) 249 + return -EIO; 250 + break; 251 + 252 + default: 253 + return -EINVAL; 254 + } 255 + 256 + return 0; 257 + } 258 + 259 + static void hgpk_setup_input_device(struct input_dev *input, 260 + struct input_dev *old_input, 261 + enum hgpk_mode mode) 262 + { 263 + if (old_input) { 264 + input->name = old_input->name; 265 + input->phys = old_input->phys; 266 + input->id = old_input->id; 267 + input->dev.parent = old_input->dev.parent; 268 + } 269 + 270 + memset(input->evbit, 0, sizeof(input->evbit)); 271 + memset(input->relbit, 0, sizeof(input->relbit)); 272 + memset(input->keybit, 0, sizeof(input->keybit)); 273 + 274 + /* All modes report left and right buttons */ 275 + __set_bit(EV_KEY, input->evbit); 276 + __set_bit(BTN_LEFT, input->keybit); 277 + __set_bit(BTN_RIGHT, input->keybit); 278 + 279 + switch (mode) { 280 + case HGPK_MODE_MOUSE: 281 + __set_bit(EV_REL, input->evbit); 282 + __set_bit(REL_X, input->relbit); 283 + __set_bit(REL_Y, input->relbit); 284 + break; 285 + 286 + case HGPK_MODE_GLIDESENSOR: 287 + __set_bit(BTN_TOUCH, input->keybit); 288 + __set_bit(BTN_TOOL_FINGER, input->keybit); 289 + 290 + __set_bit(EV_ABS, input->evbit); 291 + 292 + /* GlideSensor has pressure sensor, PenTablet does not */ 293 + input_set_abs_params(input, ABS_PRESSURE, 0, 15, 0, 0); 294 + 295 + /* From device specs */ 296 + input_set_abs_params(input, ABS_X, 0, 399, 0, 0); 297 + input_set_abs_params(input, ABS_Y, 0, 290, 0, 0); 298 + 299 + /* Calculated by hand based on usable size (52mm x 38mm) */ 300 + input_abs_set_res(input, ABS_X, 8); 301 + input_abs_set_res(input, ABS_Y, 8); 302 + break; 303 + 304 + case HGPK_MODE_PENTABLET: 305 + __set_bit(BTN_TOUCH, input->keybit); 306 + __set_bit(BTN_TOOL_FINGER, input->keybit); 307 + 308 + __set_bit(EV_ABS, input->evbit); 309 + 310 + /* From device specs */ 311 + input_set_abs_params(input, ABS_X, 0, 999, 0, 0); 312 + input_set_abs_params(input, ABS_Y, 5, 239, 0, 0); 313 + 314 + /* Calculated by hand based on usable size (156mm x 38mm) */ 315 + input_abs_set_res(input, ABS_X, 6); 316 + input_abs_set_res(input, ABS_Y, 8); 317 + break; 318 + 319 + default: 320 + BUG(); 321 + } 322 + } 323 + 324 + static int hgpk_reset_device(struct psmouse *psmouse, bool recalibrate) 325 + { 326 + int err; 327 + 328 + psmouse_reset(psmouse); 329 + 330 + if (recalibrate) { 331 + struct ps2dev *ps2dev = &psmouse->ps2dev; 332 + 333 + /* send the recalibrate request */ 334 + if (ps2_command(ps2dev, NULL, 0xf5) || 335 + ps2_command(ps2dev, NULL, 0xf5) || 336 + ps2_command(ps2dev, NULL, 0xe6) || 337 + ps2_command(ps2dev, NULL, 0xf5)) { 338 + return -1; 339 + } 340 + 341 + /* according to ALPS, 150mS is required for recalibration */ 342 + msleep(150); 343 + } 344 + 345 + err = hgpk_select_mode(psmouse); 346 + if (err) { 347 + hgpk_err(psmouse, "failed to select mode\n"); 348 + return err; 349 + } 350 + 351 + hgpk_reset_hack_state(psmouse); 352 + 353 + return 0; 354 + } 355 + 496 356 static int hgpk_force_recalibrate(struct psmouse *psmouse) 497 357 { 498 358 struct ps2dev *ps2dev = &psmouse->ps2dev; 499 359 struct hgpk_data *priv = psmouse->private; 360 + int err; 500 361 501 362 /* C-series touchpads added the recalibrate command */ 502 363 if (psmouse->model < HGPK_MODEL_C) 503 364 return 0; 504 365 366 + if (!autorecal) { 367 + hgpk_dbg(psmouse, "recalibrations disabled, ignoring\n"); 368 + return 0; 369 + } 370 + 371 + hgpk_dbg(psmouse, "recalibrating touchpad..\n"); 372 + 505 373 /* we don't want to race with the irq handler, nor with resyncs */ 506 374 psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); 507 375 508 376 /* start by resetting the device */ 509 - psmouse_reset(psmouse); 377 + err = hgpk_reset_device(psmouse, true); 378 + if (err) 379 + return err; 510 380 511 - /* send the recalibrate request */ 512 - if (ps2_command(ps2dev, NULL, 0xf5) || 513 - ps2_command(ps2dev, NULL, 0xf5) || 514 - ps2_command(ps2dev, NULL, 0xe6) || 515 - ps2_command(ps2dev, NULL, 0xf5)) { 516 - return -1; 517 - } 518 - 519 - /* according to ALPS, 150mS is required for recalibration */ 520 - msleep(150); 521 - 522 - /* XXX: If a finger is down during this delay, recalibration will 381 + /* 382 + * XXX: If a finger is down during this delay, recalibration will 523 383 * detect capacitance incorrectly. This is a hardware bug, and 524 384 * we don't have a good way to deal with it. The 2s window stuff 525 385 * (below) is our best option for now. ··· 673 247 674 248 psmouse_set_state(psmouse, PSMOUSE_ACTIVATED); 675 249 676 - /* After we recalibrate, we shouldn't get any packets for 2s. If 677 - * we do, it's likely that someone's finger was on the touchpad. 678 - * If someone's finger *was* on the touchpad, it's probably 679 - * miscalibrated. So, we should schedule another recalibration 250 + if (tpdebug) 251 + hgpk_dbg(psmouse, "touchpad reactivated\n"); 252 + 253 + /* 254 + * If we get packets right away after recalibrating, it's likely 255 + * that a finger was on the touchpad. If so, it's probably 256 + * miscalibrated, so we optionally schedule another. 680 257 */ 681 - priv->recalib_window = jiffies + msecs_to_jiffies(recal_guard_time); 258 + if (recal_guard_time) 259 + priv->recalib_window = jiffies + 260 + msecs_to_jiffies(recal_guard_time); 682 261 683 262 return 0; 684 263 } 685 264 686 265 /* 687 - * This kills power to the touchpad; according to ALPS, current consumption 688 - * goes down to 50uA after running this. To turn power back on, we drive 689 - * MS-DAT low. 266 + * This puts the touchpad in a power saving mode; according to ALPS, current 267 + * consumption goes down to 50uA after running this. To turn power back on, 268 + * we drive MS-DAT low. Measuring with a 1mA resolution ammeter says that 269 + * the current on the SUS_3.3V rail drops from 3mA or 4mA to 0 when we do this. 270 + * 271 + * We have no formal spec that details this operation -- the low-power 272 + * sequence came from a long-lost email trail. 690 273 */ 691 - static int hgpk_toggle_power(struct psmouse *psmouse, int enable) 274 + static int hgpk_toggle_powersave(struct psmouse *psmouse, int enable) 692 275 { 693 276 struct ps2dev *ps2dev = &psmouse->ps2dev; 694 277 int timeo; 278 + int err; 695 279 696 280 /* Added on D-series touchpads */ 697 281 if (psmouse->model < HGPK_MODEL_D) ··· 715 279 * the controller. Once we get an ACK back from it, it 716 280 * means we can continue with the touchpad re-init. ALPS 717 281 * tells us that 1s should be long enough, so set that as 718 - * the upper bound. 282 + * the upper bound. (in practice, it takes about 3 loops.) 719 283 */ 720 284 for (timeo = 20; timeo > 0; timeo--) { 721 285 if (!ps2_sendbyte(&psmouse->ps2dev, 722 286 PSMOUSE_CMD_DISABLE, 20)) 723 287 break; 724 - msleep(50); 288 + msleep(25); 725 289 } 726 290 727 - psmouse_reset(psmouse); 291 + err = hgpk_reset_device(psmouse, false); 292 + if (err) { 293 + hgpk_err(psmouse, "Failed to reset device!\n"); 294 + return err; 295 + } 728 296 729 297 /* should be all set, enable the touchpad */ 730 298 ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE); 731 299 psmouse_set_state(psmouse, PSMOUSE_ACTIVATED); 732 - 300 + hgpk_dbg(psmouse, "Touchpad powered up.\n"); 733 301 } else { 734 302 hgpk_dbg(psmouse, "Powering off touchpad.\n"); 735 - psmouse_set_state(psmouse, PSMOUSE_IGNORE); 736 303 737 304 if (ps2_command(ps2dev, NULL, 0xec) || 738 305 ps2_command(ps2dev, NULL, 0xec) || 739 306 ps2_command(ps2dev, NULL, 0xea)) { 740 307 return -1; 741 308 } 309 + 310 + psmouse_set_state(psmouse, PSMOUSE_IGNORE); 742 311 743 312 /* probably won't see an ACK, the touchpad will be off */ 744 313 ps2_sendbyte(&psmouse->ps2dev, 0xec, 20); ··· 760 319 761 320 static int hgpk_reconnect(struct psmouse *psmouse) 762 321 { 763 - /* During suspend/resume the ps2 rails remain powered. We don't want 322 + struct hgpk_data *priv = psmouse->private; 323 + 324 + /* 325 + * During suspend/resume the ps2 rails remain powered. We don't want 764 326 * to do a reset because it's flush data out of buffers; however, 765 - * earlier prototypes (B1) had some brokenness that required a reset. */ 327 + * earlier prototypes (B1) had some brokenness that required a reset. 328 + */ 766 329 if (olpc_board_at_least(olpc_board(0xb2))) 767 330 if (psmouse->ps2dev.serio->dev.power.power_state.event != 768 331 PM_EVENT_ON) 769 332 return 0; 770 333 771 - psmouse_reset(psmouse); 772 - 773 - return 0; 334 + priv->powered = 1; 335 + return hgpk_reset_device(psmouse, false); 774 336 } 775 337 776 338 static ssize_t hgpk_show_powered(struct psmouse *psmouse, void *data, char *buf) ··· 799 355 * hgpk_toggle_power will deal w/ state so 800 356 * we're not racing w/ irq 801 357 */ 802 - err = hgpk_toggle_power(psmouse, value); 358 + err = hgpk_toggle_powersave(psmouse, value); 803 359 if (!err) 804 360 priv->powered = value; 805 361 } ··· 809 365 810 366 __PSMOUSE_DEFINE_ATTR(powered, S_IWUSR | S_IRUGO, NULL, 811 367 hgpk_show_powered, hgpk_set_powered, false); 368 + 369 + static ssize_t attr_show_mode(struct psmouse *psmouse, void *data, char *buf) 370 + { 371 + struct hgpk_data *priv = psmouse->private; 372 + 373 + return sprintf(buf, "%s\n", hgpk_mode_names[priv->mode]); 374 + } 375 + 376 + static ssize_t attr_set_mode(struct psmouse *psmouse, void *data, 377 + const char *buf, size_t len) 378 + { 379 + struct hgpk_data *priv = psmouse->private; 380 + enum hgpk_mode old_mode = priv->mode; 381 + enum hgpk_mode new_mode = hgpk_mode_from_name(buf, len); 382 + struct input_dev *old_dev = psmouse->dev; 383 + struct input_dev *new_dev; 384 + int err; 385 + 386 + if (new_mode == HGPK_MODE_INVALID) 387 + return -EINVAL; 388 + 389 + if (old_mode == new_mode) 390 + return len; 391 + 392 + new_dev = input_allocate_device(); 393 + if (!new_dev) 394 + return -ENOMEM; 395 + 396 + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); 397 + 398 + /* Switch device into the new mode */ 399 + priv->mode = new_mode; 400 + err = hgpk_reset_device(psmouse, false); 401 + if (err) 402 + goto err_try_restore; 403 + 404 + hgpk_setup_input_device(new_dev, old_dev, new_mode); 405 + 406 + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 407 + 408 + err = input_register_device(new_dev); 409 + if (err) 410 + goto err_try_restore; 411 + 412 + psmouse->dev = new_dev; 413 + input_unregister_device(old_dev); 414 + 415 + return len; 416 + 417 + err_try_restore: 418 + input_free_device(new_dev); 419 + priv->mode = old_mode; 420 + hgpk_reset_device(psmouse, false); 421 + 422 + return err; 423 + } 424 + 425 + PSMOUSE_DEFINE_ATTR(hgpk_mode, S_IWUSR | S_IRUGO, NULL, 426 + attr_show_mode, attr_set_mode); 812 427 813 428 static ssize_t hgpk_trigger_recal_show(struct psmouse *psmouse, 814 429 void *data, char *buf) ··· 904 401 905 402 device_remove_file(&psmouse->ps2dev.serio->dev, 906 403 &psmouse_attr_powered.dattr); 404 + device_remove_file(&psmouse->ps2dev.serio->dev, 405 + &psmouse_attr_hgpk_mode.dattr); 907 406 908 407 if (psmouse->model >= HGPK_MODEL_C) 909 408 device_remove_file(&psmouse->ps2dev.serio->dev, ··· 921 416 struct hgpk_data *priv = container_of(w, struct hgpk_data, recalib_wq); 922 417 struct psmouse *psmouse = priv->psmouse; 923 418 924 - hgpk_dbg(psmouse, "recalibrating touchpad..\n"); 925 - 926 419 if (hgpk_force_recalibrate(psmouse)) 927 420 hgpk_err(psmouse, "recalibration failed!\n"); 928 421 } 929 422 930 423 static int hgpk_register(struct psmouse *psmouse) 931 424 { 425 + struct hgpk_data *priv = psmouse->private; 932 426 int err; 933 427 934 428 /* register handlers */ ··· 935 431 psmouse->poll = hgpk_poll; 936 432 psmouse->disconnect = hgpk_disconnect; 937 433 psmouse->reconnect = hgpk_reconnect; 938 - psmouse->pktsize = 3; 939 434 940 435 /* Disable the idle resync. */ 941 436 psmouse->resync_time = 0; 942 437 /* Reset after a lot of bad bytes. */ 943 438 psmouse->resetafter = 1024; 944 439 440 + hgpk_setup_input_device(psmouse->dev, NULL, priv->mode); 441 + 945 442 err = device_create_file(&psmouse->ps2dev.serio->dev, 946 443 &psmouse_attr_powered.dattr); 947 444 if (err) { 948 445 hgpk_err(psmouse, "Failed creating 'powered' sysfs node\n"); 949 446 return err; 447 + } 448 + 449 + err = device_create_file(&psmouse->ps2dev.serio->dev, 450 + &psmouse_attr_hgpk_mode.dattr); 451 + if (err) { 452 + hgpk_err(psmouse, "Failed creating 'hgpk_mode' sysfs node\n"); 453 + goto err_remove_powered; 950 454 } 951 455 952 456 /* C-series touchpads added the recalibrate command */ ··· 964 452 if (err) { 965 453 hgpk_err(psmouse, 966 454 "Failed creating 'recalibrate' sysfs node\n"); 967 - device_remove_file(&psmouse->ps2dev.serio->dev, 968 - &psmouse_attr_powered.dattr); 969 - return err; 455 + goto err_remove_mode; 970 456 } 971 457 } 972 458 973 459 return 0; 460 + 461 + err_remove_mode: 462 + device_remove_file(&psmouse->ps2dev.serio->dev, 463 + &psmouse_attr_hgpk_mode.dattr); 464 + err_remove_powered: 465 + device_remove_file(&psmouse->ps2dev.serio->dev, 466 + &psmouse_attr_powered.dattr); 467 + return err; 974 468 } 975 469 976 470 int hgpk_init(struct psmouse *psmouse) 977 471 { 978 472 struct hgpk_data *priv; 979 - int err = -ENOMEM; 473 + int err; 980 474 981 475 priv = kzalloc(sizeof(struct hgpk_data), GFP_KERNEL); 982 - if (!priv) 476 + if (!priv) { 477 + err = -ENOMEM; 983 478 goto alloc_fail; 479 + } 984 480 985 481 psmouse->private = priv; 482 + 986 483 priv->psmouse = psmouse; 987 484 priv->powered = true; 485 + priv->mode = hgpk_default_mode; 988 486 INIT_DELAYED_WORK(&priv->recalib_wq, hgpk_recalib_work); 989 487 990 - err = psmouse_reset(psmouse); 488 + err = hgpk_reset_device(psmouse, false); 991 489 if (err) 992 490 goto init_fail; 993 491 ··· 1052 530 } 1053 531 1054 532 return 0; 533 + } 534 + 535 + void hgpk_module_init(void) 536 + { 537 + hgpk_default_mode = hgpk_mode_from_name(hgpk_mode_name, 538 + strlen(hgpk_mode_name)); 539 + if (hgpk_default_mode == HGPK_MODE_INVALID) { 540 + hgpk_default_mode = HGPK_MODE_MOUSE; 541 + strlcpy(hgpk_mode_name, hgpk_mode_names[HGPK_MODE_MOUSE], 542 + sizeof(hgpk_mode_name)); 543 + } 1055 544 }
+30 -1
drivers/input/mouse/hgpk.h
··· 5 5 #ifndef _HGPK_H 6 6 #define _HGPK_H 7 7 8 + #define HGPK_GS 0xff /* The GlideSensor */ 9 + #define HGPK_PT 0xcf /* The PenTablet */ 10 + 8 11 enum hgpk_model_t { 9 12 HGPK_MODEL_PREA = 0x0a, /* pre-B1s */ 10 13 HGPK_MODEL_A = 0x14, /* found on B1s, PT disabled in hardware */ ··· 16 13 HGPK_MODEL_D = 0x50, /* C1, mass production */ 17 14 }; 18 15 16 + enum hgpk_spew_flag { 17 + NO_SPEW, 18 + MAYBE_SPEWING, 19 + SPEW_DETECTED, 20 + RECALIBRATING, 21 + }; 22 + 23 + #define SPEW_WATCH_COUNT 42 /* at 12ms/packet, this is 1/2 second */ 24 + 25 + enum hgpk_mode { 26 + HGPK_MODE_MOUSE, 27 + HGPK_MODE_GLIDESENSOR, 28 + HGPK_MODE_PENTABLET, 29 + HGPK_MODE_INVALID 30 + }; 31 + 19 32 struct hgpk_data { 20 33 struct psmouse *psmouse; 34 + enum hgpk_mode mode; 21 35 bool powered; 22 - int count, x_tally, y_tally; /* hardware workaround stuff */ 36 + enum hgpk_spew_flag spew_flag; 37 + int spew_count, x_tally, y_tally; /* spew detection */ 23 38 unsigned long recalib_window; 24 39 struct delayed_work recalib_wq; 40 + int abs_x, abs_y; 41 + int dupe_count; 42 + int xbigj, ybigj, xlast, ylast; /* jumpiness detection */ 43 + int xsaw_secondary, ysaw_secondary; /* jumpiness detection */ 25 44 }; 26 45 27 46 #define hgpk_dbg(psmouse, format, arg...) \ ··· 58 33 dev_notice(&(psmouse)->ps2dev.serio->dev, format, ## arg) 59 34 60 35 #ifdef CONFIG_MOUSE_PS2_OLPC 36 + void hgpk_module_init(void); 61 37 int hgpk_detect(struct psmouse *psmouse, bool set_properties); 62 38 int hgpk_init(struct psmouse *psmouse); 63 39 #else 40 + static inline void hgpk_module_init(void) 41 + { 42 + } 64 43 static inline int hgpk_detect(struct psmouse *psmouse, bool set_properties) 65 44 { 66 45 return -ENODEV;
+1
drivers/input/mouse/psmouse-base.c
··· 1711 1711 1712 1712 lifebook_module_init(); 1713 1713 synaptics_module_init(); 1714 + hgpk_module_init(); 1714 1715 1715 1716 kpsmoused_wq = create_singlethread_workqueue("kpsmoused"); 1716 1717 if (!kpsmoused_wq) {
+122 -7
drivers/input/mouse/synaptics.c
··· 25 25 26 26 #include <linux/module.h> 27 27 #include <linux/dmi.h> 28 - #include <linux/input.h> 28 + #include <linux/input/mt.h> 29 29 #include <linux/serio.h> 30 30 #include <linux/libps2.h> 31 31 #include <linux/slab.h> ··· 279 279 synaptics_mode_cmd(psmouse, priv->mode); 280 280 } 281 281 282 + static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse) 283 + { 284 + static unsigned char param = 0xc8; 285 + struct synaptics_data *priv = psmouse->private; 286 + 287 + if (!SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) 288 + return 0; 289 + 290 + if (psmouse_sliced_command(psmouse, SYN_QUE_MODEL)) 291 + return -1; 292 + if (ps2_command(&psmouse->ps2dev, &param, PSMOUSE_CMD_SETRATE)) 293 + return -1; 294 + 295 + /* Advanced gesture mode also sends multi finger data */ 296 + priv->capabilities |= BIT(1); 297 + 298 + return 0; 299 + } 300 + 282 301 /***************************************************************************** 283 302 * Synaptics pass-through PS/2 port support 284 303 ****************************************************************************/ ··· 399 380 * Functions to interpret the absolute mode packets 400 381 ****************************************************************************/ 401 382 402 - static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data *priv, struct synaptics_hw_state *hw) 383 + static int synaptics_parse_hw_state(const unsigned char buf[], 384 + struct synaptics_data *priv, 385 + struct synaptics_hw_state *hw) 403 386 { 404 387 memset(hw, 0, sizeof(struct synaptics_hw_state)); 405 388 ··· 417 396 hw->w = (((buf[0] & 0x30) >> 2) | 418 397 ((buf[0] & 0x04) >> 1) | 419 398 ((buf[3] & 0x04) >> 2)); 399 + 400 + if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) && hw->w == 2) { 401 + /* Gesture packet: (x, y, z) at half resolution */ 402 + priv->mt.x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1; 403 + priv->mt.y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1; 404 + priv->mt.z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1; 405 + return 1; 406 + } 420 407 421 408 hw->left = (buf[0] & 0x01) ? 1 : 0; 422 409 hw->right = (buf[0] & 0x02) ? 1 : 0; ··· 481 452 hw->left = (buf[0] & 0x01) ? 1 : 0; 482 453 hw->right = (buf[0] & 0x02) ? 1 : 0; 483 454 } 455 + 456 + return 0; 457 + } 458 + 459 + static void set_slot(struct input_dev *dev, int slot, bool active, int x, int y) 460 + { 461 + input_mt_slot(dev, slot); 462 + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); 463 + if (active) { 464 + input_report_abs(dev, ABS_MT_POSITION_X, x); 465 + input_report_abs(dev, ABS_MT_POSITION_Y, 466 + YMAX_NOMINAL + YMIN_NOMINAL - y); 467 + } 468 + } 469 + 470 + static void synaptics_report_semi_mt_data(struct input_dev *dev, 471 + const struct synaptics_hw_state *a, 472 + const struct synaptics_hw_state *b, 473 + int num_fingers) 474 + { 475 + if (num_fingers >= 2) { 476 + set_slot(dev, 0, true, min(a->x, b->x), min(a->y, b->y)); 477 + set_slot(dev, 1, true, max(a->x, b->x), max(a->y, b->y)); 478 + } else if (num_fingers == 1) { 479 + set_slot(dev, 0, true, a->x, a->y); 480 + set_slot(dev, 1, false, 0, 0); 481 + } else { 482 + set_slot(dev, 0, false, 0, 0); 483 + set_slot(dev, 1, false, 0, 0); 484 + } 484 485 } 485 486 486 487 /* ··· 525 466 int finger_width; 526 467 int i; 527 468 528 - synaptics_parse_hw_state(psmouse->packet, priv, &hw); 469 + if (synaptics_parse_hw_state(psmouse->packet, priv, &hw)) 470 + return; 529 471 530 472 if (hw.scroll) { 531 473 priv->scroll += hw.scroll; ··· 548 488 return; 549 489 } 550 490 551 - if (hw.z > 0) { 491 + if (hw.z > 0 && hw.x > 1) { 552 492 num_fingers = 1; 553 493 finger_width = 5; 554 494 if (SYN_CAP_EXTENDED(priv->capabilities)) { ··· 572 512 finger_width = 0; 573 513 } 574 514 515 + if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) 516 + synaptics_report_semi_mt_data(dev, &hw, &priv->mt, num_fingers); 517 + 575 518 /* Post events 576 519 * BTN_TOUCH has to be first as mousedev relies on it when doing 577 520 * absolute -> relative conversion ··· 582 519 if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1); 583 520 if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0); 584 521 585 - if (hw.z > 0) { 522 + if (num_fingers > 0) { 586 523 input_report_abs(dev, ABS_X, hw.x); 587 524 input_report_abs(dev, ABS_Y, YMAX_NOMINAL + YMIN_NOMINAL - hw.y); 588 525 } ··· 685 622 { 686 623 int i; 687 624 625 + __set_bit(INPUT_PROP_POINTER, dev->propbit); 626 + 688 627 __set_bit(EV_ABS, dev->evbit); 689 628 input_set_abs_params(dev, ABS_X, 690 629 XMIN_NOMINAL, priv->x_max ?: XMAX_NOMINAL, 0, 0); 691 630 input_set_abs_params(dev, ABS_Y, 692 631 YMIN_NOMINAL, priv->y_max ?: YMAX_NOMINAL, 0, 0); 693 632 input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); 633 + 634 + if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) { 635 + __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); 636 + input_mt_init_slots(dev, 2); 637 + input_set_abs_params(dev, ABS_MT_POSITION_X, XMIN_NOMINAL, 638 + priv->x_max ?: XMAX_NOMINAL, 0, 0); 639 + input_set_abs_params(dev, ABS_MT_POSITION_Y, YMIN_NOMINAL, 640 + priv->y_max ?: YMAX_NOMINAL, 0, 0); 641 + } 694 642 695 643 if (SYN_CAP_PALMDETECT(priv->capabilities)) 696 644 input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0); ··· 737 663 input_abs_set_res(dev, ABS_Y, priv->y_res); 738 664 739 665 if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { 666 + __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); 740 667 /* Clickpads report only left button */ 741 668 __clear_bit(BTN_RIGHT, dev->keybit); 742 669 __clear_bit(BTN_MIDDLE, dev->keybit); ··· 774 699 775 700 if (synaptics_set_absolute_mode(psmouse)) { 776 701 printk(KERN_ERR "Unable to initialize Synaptics hardware.\n"); 702 + return -1; 703 + } 704 + 705 + if (synaptics_set_advanced_gesture_mode(psmouse)) { 706 + printk(KERN_ERR "Advanced gesture mode reconnect failed.\n"); 777 707 return -1; 778 708 } 779 709 ··· 824 744 #endif 825 745 }; 826 746 747 + static bool broken_olpc_ec; 748 + 749 + static const struct dmi_system_id __initconst olpc_dmi_table[] = { 750 + #if defined(CONFIG_DMI) && defined(CONFIG_OLPC) 751 + { 752 + /* OLPC XO-1 or XO-1.5 */ 753 + .matches = { 754 + DMI_MATCH(DMI_SYS_VENDOR, "OLPC"), 755 + DMI_MATCH(DMI_PRODUCT_NAME, "XO"), 756 + }, 757 + }, 758 + { } 759 + #endif 760 + }; 761 + 827 762 void __init synaptics_module_init(void) 828 763 { 829 764 impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); 765 + broken_olpc_ec = dmi_check_system(olpc_dmi_table); 830 766 } 831 767 832 768 int synaptics_init(struct psmouse *psmouse) 833 769 { 834 770 struct synaptics_data *priv; 771 + 772 + /* 773 + * The OLPC XO has issues with Synaptics' absolute mode; similarly to 774 + * the HGPK, it quickly degrades and the hardware becomes jumpy and 775 + * overly sensitive. Not only that, but the constant packet spew 776 + * (even at a lowered 40pps rate) overloads the EC such that key 777 + * presses on the keyboard are missed. Given all of that, don't 778 + * even attempt to use Synaptics mode. Relative mode seems to work 779 + * just fine. 780 + */ 781 + if (broken_olpc_ec) { 782 + printk(KERN_INFO "synaptics: OLPC XO detected, not enabling Synaptics protocol.\n"); 783 + return -ENODEV; 784 + } 835 785 836 786 psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL); 837 787 if (!priv) ··· 876 766 877 767 if (synaptics_set_absolute_mode(psmouse)) { 878 768 printk(KERN_ERR "Unable to initialize Synaptics hardware.\n"); 769 + goto init_fail; 770 + } 771 + 772 + if (synaptics_set_advanced_gesture_mode(psmouse)) { 773 + printk(KERN_ERR "Advanced gesture mode init failed.\n"); 879 774 goto init_fail; 880 775 } 881 776 ··· 917 802 918 803 /* 919 804 * Toshiba's KBC seems to have trouble handling data from 920 - * Synaptics as full rate, switch to lower rate which is roughly 921 - * thye same as rate of standard PS/2 mouse. 805 + * Synaptics at full rate. Switch to a lower rate (roughly 806 + * the same rate as a standard PS/2 mouse). 922 807 */ 923 808 if (psmouse->rate >= 80 && impaired_toshiba_kbc) { 924 809 printk(KERN_INFO "synaptics: Toshiba %s detected, limiting rate to 40pps.\n",
+3
drivers/input/mouse/synaptics.h
··· 54 54 #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */ 55 55 #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ 56 56 #define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000) 57 + #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) 57 58 58 59 /* synaptics modes query bits */ 59 60 #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) ··· 114 113 int scroll; 115 114 116 115 struct serio *pt_port; /* Pass-through serio port */ 116 + 117 + struct synaptics_hw_state mt; /* current gesture packet */ 117 118 }; 118 119 119 120 void synaptics_module_init(void);
+6 -4
drivers/input/mousedev.c
··· 9 9 * the Free Software Foundation. 10 10 */ 11 11 12 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 13 + 12 14 #define MOUSEDEV_MINOR_BASE 32 13 15 #define MOUSEDEV_MINORS 32 14 16 #define MOUSEDEV_MIX 31 ··· 979 977 break; 980 978 981 979 if (minor == MOUSEDEV_MINORS) { 982 - printk(KERN_ERR "mousedev: no more free mousedev devices\n"); 980 + pr_err("no more free mousedev devices\n"); 983 981 return -ENFILE; 984 982 } 985 983 ··· 1089 1087 #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX 1090 1088 error = misc_register(&psaux_mouse); 1091 1089 if (error) 1092 - printk(KERN_WARNING "mice: could not register psaux device, " 1093 - "error: %d\n", error); 1090 + pr_warning("could not register psaux device, error: %d\n", 1091 + error); 1094 1092 else 1095 1093 psaux_registered = 1; 1096 1094 #endif 1097 1095 1098 - printk(KERN_INFO "mice: PS/2 mouse device common for all mice\n"); 1096 + pr_info("PS/2 mouse device common for all mice\n"); 1099 1097 1100 1098 return 0; 1101 1099 }
-1
drivers/input/serio/ams_delta_serio.c
··· 172 172 free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0); 173 173 gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); 174 174 gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); 175 - kfree(ams_delta_serio); 176 175 } 177 176 module_exit(ams_delta_serio_exit);
+3 -5
drivers/input/serio/ct82c710.c
··· 191 191 192 192 serio_register_port(ct82c710_port); 193 193 194 + printk(KERN_INFO "serio: C&T 82c710 mouse port at %#llx irq %d\n", 195 + (unsigned long long)CT82C710_DATA, CT82C710_IRQ); 196 + 194 197 return 0; 195 198 } 196 199 ··· 239 236 error = platform_device_add(ct82c710_device); 240 237 if (error) 241 238 goto err_free_device; 242 - 243 - serio_register_port(ct82c710_port); 244 - 245 - printk(KERN_INFO "serio: C&T 82c710 mouse port at %#llx irq %d\n", 246 - (unsigned long long)CT82C710_DATA, CT82C710_IRQ); 247 239 248 240 return 0; 249 241
+5
drivers/input/serio/hil_mlc.c
··· 932 932 hil_mlc_copy_di_scratch(mlc, i); 933 933 mlc_serio = kzalloc(sizeof(*mlc_serio), GFP_KERNEL); 934 934 mlc->serio[i] = mlc_serio; 935 + if (!mlc->serio[i]) { 936 + for (; i >= 0; i--) 937 + kfree(mlc->serio[i]); 938 + return -ENOMEM; 939 + } 935 940 snprintf(mlc_serio->name, sizeof(mlc_serio->name)-1, "HIL_SERIO%d", i); 936 941 snprintf(mlc_serio->phys, sizeof(mlc_serio->phys)-1, "HIL%d", i); 937 942 mlc_serio->id = hil_mlc_serio_id;
+9 -9
drivers/input/serio/hp_sdc_mlc.c
··· 305 305 static int __init hp_sdc_mlc_init(void) 306 306 { 307 307 hil_mlc *mlc = &hp_sdc_mlc; 308 + int err; 308 309 309 310 #ifdef __mc68000__ 310 311 if (!MACH_IS_HP300) ··· 324 323 mlc->out = &hp_sdc_mlc_out; 325 324 mlc->priv = &hp_sdc_mlc_priv; 326 325 327 - if (hil_mlc_register(mlc)) { 326 + err = hil_mlc_register(mlc); 327 + if (err) { 328 328 printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n"); 329 - goto err0; 329 + return err; 330 330 } 331 331 332 332 if (hp_sdc_request_hil_irq(&hp_sdc_mlc_isr)) { 333 333 printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n"); 334 - goto err1; 334 + if (hil_mlc_unregister(mlc)) 335 + printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n" 336 + "This is bad. Could cause an oops.\n"); 337 + return -EBUSY; 335 338 } 339 + 336 340 return 0; 337 - err1: 338 - if (hil_mlc_unregister(mlc)) 339 - printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n" 340 - "This is bad. Could cause an oops.\n"); 341 - err0: 342 - return -EBUSY; 343 341 } 344 342 345 343 static void __exit hp_sdc_mlc_exit(void)
+18 -19
drivers/input/serio/i8042-x86ia64io.h
··· 553 553 */ 554 554 static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { 555 555 { 556 + /* Acer Aspire 5100 */ 557 + .matches = { 558 + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 559 + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), 560 + }, 561 + }, 562 + { 556 563 /* Acer Aspire 5610 */ 557 564 .matches = { 558 565 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), ··· 759 752 #endif 760 753 761 754 if (i8042_nopnp) { 762 - printk(KERN_INFO "i8042: PNP detection disabled\n"); 755 + pr_info("PNP detection disabled\n"); 763 756 return 0; 764 757 } 765 758 ··· 776 769 #if defined(__ia64__) 777 770 return -ENODEV; 778 771 #else 779 - printk(KERN_INFO "PNP: No PS/2 controller found. Probing ports directly.\n"); 772 + pr_info("PNP: No PS/2 controller found. Probing ports directly.\n"); 780 773 return 0; 781 774 #endif 782 775 } ··· 788 781 snprintf(aux_irq_str, sizeof(aux_irq_str), 789 782 "%d", i8042_pnp_aux_irq); 790 783 791 - printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", 784 + pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", 792 785 i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 793 786 i8042_pnp_aux_name, 794 787 i8042_pnp_data_reg, i8042_pnp_command_reg, ··· 805 798 if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && 806 799 i8042_pnp_data_reg != i8042_data_reg) || 807 800 !i8042_pnp_data_reg) { 808 - printk(KERN_WARNING 809 - "PNP: PS/2 controller has invalid data port %#x; " 810 - "using default %#x\n", 801 + pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n", 811 802 i8042_pnp_data_reg, i8042_data_reg); 812 803 i8042_pnp_data_reg = i8042_data_reg; 813 804 pnp_data_busted = true; ··· 814 809 if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) && 815 810 i8042_pnp_command_reg != i8042_command_reg) || 816 811 !i8042_pnp_command_reg) { 817 - printk(KERN_WARNING 818 - "PNP: PS/2 controller has invalid command port %#x; " 819 - "using default %#x\n", 812 + pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n", 820 813 i8042_pnp_command_reg, i8042_command_reg); 821 814 i8042_pnp_command_reg = i8042_command_reg; 822 815 pnp_data_busted = true; 823 816 } 824 817 825 818 if (!i8042_nokbd && !i8042_pnp_kbd_irq) { 826 - printk(KERN_WARNING 827 - "PNP: PS/2 controller doesn't have KBD irq; " 828 - "using default %d\n", i8042_kbd_irq); 819 + pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n", 820 + i8042_kbd_irq); 829 821 i8042_pnp_kbd_irq = i8042_kbd_irq; 830 822 pnp_data_busted = true; 831 823 } 832 824 833 825 if (!i8042_noaux && !i8042_pnp_aux_irq) { 834 826 if (!pnp_data_busted && i8042_pnp_kbd_irq) { 835 - printk(KERN_WARNING 836 - "PNP: PS/2 appears to have AUX port disabled, " 837 - "if this is incorrect please boot with " 838 - "i8042.nopnp\n"); 827 + pr_warn("PNP: PS/2 appears to have AUX port disabled, " 828 + "if this is incorrect please boot with i8042.nopnp\n"); 839 829 i8042_noaux = true; 840 830 } else { 841 - printk(KERN_WARNING 842 - "PNP: PS/2 controller doesn't have AUX irq; " 843 - "using default %d\n", i8042_aux_irq); 831 + pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n", 832 + i8042_aux_irq); 844 833 i8042_pnp_aux_irq = i8042_aux_irq; 845 834 } 846 835 }
+43 -49
drivers/input/serio/i8042.c
··· 10 10 * the Free Software Foundation. 11 11 */ 12 12 13 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 14 + 13 15 #include <linux/types.h> 14 16 #include <linux/delay.h> 15 17 #include <linux/module.h> ··· 227 225 udelay(50); 228 226 data = i8042_read_data(); 229 227 i++; 230 - dbg("%02x <- i8042 (flush, %s)", data, 231 - str & I8042_STR_AUXDATA ? "aux" : "kbd"); 228 + dbg("%02x <- i8042 (flush, %s)\n", 229 + data, str & I8042_STR_AUXDATA ? "aux" : "kbd"); 232 230 } 233 231 234 232 spin_unlock_irqrestore(&i8042_lock, flags); ··· 255 253 if (error) 256 254 return error; 257 255 258 - dbg("%02x -> i8042 (command)", command & 0xff); 256 + dbg("%02x -> i8042 (command)\n", command & 0xff); 259 257 i8042_write_command(command & 0xff); 260 258 261 259 for (i = 0; i < ((command >> 12) & 0xf); i++) { 262 260 error = i8042_wait_write(); 263 261 if (error) 264 262 return error; 265 - dbg("%02x -> i8042 (parameter)", param[i]); 263 + dbg("%02x -> i8042 (parameter)\n", param[i]); 266 264 i8042_write_data(param[i]); 267 265 } 268 266 269 267 for (i = 0; i < ((command >> 8) & 0xf); i++) { 270 268 error = i8042_wait_read(); 271 269 if (error) { 272 - dbg(" -- i8042 (timeout)"); 270 + dbg(" -- i8042 (timeout)\n"); 273 271 return error; 274 272 } 275 273 276 274 if (command == I8042_CMD_AUX_LOOP && 277 275 !(i8042_read_status() & I8042_STR_AUXDATA)) { 278 - dbg(" -- i8042 (auxerr)"); 276 + dbg(" -- i8042 (auxerr)\n"); 279 277 return -1; 280 278 } 281 279 282 280 param[i] = i8042_read_data(); 283 - dbg("%02x <- i8042 (return)", param[i]); 281 + dbg("%02x <- i8042 (return)\n", param[i]); 284 282 } 285 283 286 284 return 0; ··· 311 309 spin_lock_irqsave(&i8042_lock, flags); 312 310 313 311 if (!(retval = i8042_wait_write())) { 314 - dbg("%02x -> i8042 (kbd-data)", c); 312 + dbg("%02x -> i8042 (kbd-data)\n", c); 315 313 i8042_write_data(c); 316 314 } 317 315 ··· 357 355 358 356 i8042_ctr &= ~irq_bit; 359 357 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) 360 - printk(KERN_WARNING 361 - "i8042.c: Can't write CTR while closing %s port.\n", 362 - port_name); 358 + pr_warn("Can't write CTR while closing %s port\n", port_name); 363 359 364 360 udelay(50); 365 361 366 362 i8042_ctr &= ~disable_bit; 367 363 i8042_ctr |= irq_bit; 368 364 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) 369 - printk(KERN_ERR "i8042.c: Can't reactivate %s port.\n", 370 - port_name); 365 + pr_err("Can't reactivate %s port\n", port_name); 371 366 372 367 /* 373 368 * See if there is any data appeared while we were messing with ··· 455 456 str = i8042_read_status(); 456 457 if (unlikely(~str & I8042_STR_OBF)) { 457 458 spin_unlock_irqrestore(&i8042_lock, flags); 458 - if (irq) dbg("Interrupt %d, without any data", irq); 459 + if (irq) 460 + dbg("Interrupt %d, without any data\n", irq); 459 461 ret = 0; 460 462 goto out; 461 463 } ··· 469 469 470 470 dfl = 0; 471 471 if (str & I8042_STR_MUXERR) { 472 - dbg("MUX error, status is %02x, data is %02x", str, data); 472 + dbg("MUX error, status is %02x, data is %02x\n", 473 + str, data); 473 474 /* 474 475 * When MUXERR condition is signalled the data register can only contain 475 476 * 0xfd, 0xfe or 0xff if implementation follows the spec. Unfortunately ··· 513 512 port = &i8042_ports[port_no]; 514 513 serio = port->exists ? port->serio : NULL; 515 514 516 - dbg("%02x <- i8042 (interrupt, %d, %d%s%s)", 515 + dbg("%02x <- i8042 (interrupt, %d, %d%s%s)\n", 517 516 data, port_no, irq, 518 517 dfl & SERIO_PARITY ? ", bad parity" : "", 519 518 dfl & SERIO_TIMEOUT ? ", timeout" : ""); ··· 541 540 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { 542 541 i8042_ctr &= ~I8042_CTR_KBDINT; 543 542 i8042_ctr |= I8042_CTR_KBDDIS; 544 - printk(KERN_ERR "i8042.c: Failed to enable KBD port.\n"); 543 + pr_err("Failed to enable KBD port\n"); 545 544 return -EIO; 546 545 } 547 546 ··· 560 559 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { 561 560 i8042_ctr &= ~I8042_CTR_AUXINT; 562 561 i8042_ctr |= I8042_CTR_AUXDIS; 563 - printk(KERN_ERR "i8042.c: Failed to enable AUX port.\n"); 562 + pr_err("Failed to enable AUX port\n"); 564 563 return -EIO; 565 564 } 566 565 ··· 642 641 if (i8042_set_mux_mode(true, &mux_version)) 643 642 return -1; 644 643 645 - printk(KERN_INFO "i8042.c: Detected active multiplexing controller, rev %d.%d.\n", 644 + pr_info("Detected active multiplexing controller, rev %d.%d\n", 646 645 (mux_version >> 4) & 0xf, mux_version & 0xf); 647 646 648 647 /* ··· 652 651 i8042_ctr &= ~I8042_CTR_AUXINT; 653 652 654 653 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { 655 - printk(KERN_ERR "i8042.c: Failed to disable AUX port, can't use MUX.\n"); 654 + pr_err("Failed to disable AUX port, can't use MUX\n"); 656 655 return -EIO; 657 656 } 658 657 ··· 677 676 str = i8042_read_status(); 678 677 if (str & I8042_STR_OBF) { 679 678 data = i8042_read_data(); 680 - dbg("%02x <- i8042 (aux_test_irq, %s)", 681 - data, str & I8042_STR_AUXDATA ? "aux" : "kbd"); 679 + dbg("%02x <- i8042 (aux_test_irq, %s)\n", 680 + data, str & I8042_STR_AUXDATA ? "aux" : "kbd"); 682 681 if (i8042_irq_being_tested && 683 682 data == 0xa5 && (str & I8042_STR_AUXDATA)) 684 683 complete(&i8042_aux_irq_delivered); ··· 771 770 */ 772 771 773 772 if (i8042_toggle_aux(false)) { 774 - printk(KERN_WARNING "Failed to disable AUX port, but continuing anyway... Is this a SiS?\n"); 775 - printk(KERN_WARNING "If AUX port is really absent please use the 'i8042.noaux' option.\n"); 773 + pr_warn("Failed to disable AUX port, but continuing anyway... Is this a SiS?\n"); 774 + pr_warn("If AUX port is really absent please use the 'i8042.noaux' option\n"); 776 775 } 777 776 778 777 if (i8042_toggle_aux(true)) ··· 820 819 * AUX IRQ was never delivered so we need to flush the controller to 821 820 * get rid of the byte we put there; otherwise keyboard may not work. 822 821 */ 823 - dbg(" -- i8042 (aux irq test timeout)"); 822 + dbg(" -- i8042 (aux irq test timeout)\n"); 824 823 i8042_flush(); 825 824 retval = -1; 826 825 } ··· 846 845 static int i8042_controller_check(void) 847 846 { 848 847 if (i8042_flush() == I8042_BUFFER_SIZE) { 849 - printk(KERN_ERR "i8042.c: No controller found.\n"); 848 + pr_err("No controller found\n"); 850 849 return -ENODEV; 851 850 } 852 851 ··· 865 864 do { 866 865 867 866 if (i8042_command(&param, I8042_CMD_CTL_TEST)) { 868 - printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n"); 867 + pr_err("i8042 controller self test timeout\n"); 869 868 return -ENODEV; 870 869 } 871 870 872 871 if (param == I8042_RET_CTL_TEST) 873 872 return 0; 874 873 875 - printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n", 876 - param, I8042_RET_CTL_TEST); 874 + pr_err("i8042 controller selftest failed. (%#x != %#x)\n", 875 + param, I8042_RET_CTL_TEST); 877 876 msleep(50); 878 877 } while (i++ < 5); 879 878 ··· 884 883 * and user will still get a working keyboard. This is especially 885 884 * important on netbooks. On other arches we trust hardware more. 886 885 */ 887 - printk(KERN_INFO 888 - "i8042: giving up on controller selftest, continuing anyway...\n"); 886 + pr_info("giving up on controller selftest, continuing anyway...\n"); 889 887 return 0; 890 888 #else 891 889 return -EIO; ··· 909 909 910 910 do { 911 911 if (n >= 10) { 912 - printk(KERN_ERR 913 - "i8042.c: Unable to get stable CTR read.\n"); 912 + pr_err("Unable to get stable CTR read\n"); 914 913 return -EIO; 915 914 } 916 915 ··· 917 918 udelay(50); 918 919 919 920 if (i8042_command(&ctr[n++ % 2], I8042_CMD_CTL_RCTR)) { 920 - printk(KERN_ERR 921 - "i8042.c: Can't read CTR while initializing i8042.\n"); 921 + pr_err("Can't read CTR while initializing i8042\n"); 922 922 return -EIO; 923 923 } 924 924 ··· 941 943 if (i8042_unlock) 942 944 i8042_ctr |= I8042_CTR_IGNKEYLOCK; 943 945 else 944 - printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n"); 946 + pr_warn("Warning: Keylock active\n"); 945 947 } 946 948 spin_unlock_irqrestore(&i8042_lock, flags); 947 949 ··· 968 970 */ 969 971 970 972 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { 971 - printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n"); 973 + pr_err("Can't write CTR while initializing i8042\n"); 972 974 return -EIO; 973 975 } 974 976 ··· 998 1000 i8042_ctr &= ~(I8042_CTR_KBDINT | I8042_CTR_AUXINT); 999 1001 1000 1002 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) 1001 - printk(KERN_WARNING "i8042.c: Can't write CTR while resetting.\n"); 1003 + pr_warn("Can't write CTR while resetting\n"); 1002 1004 1003 1005 /* 1004 1006 * Disable MUX mode if present. ··· 1019 1021 */ 1020 1022 1021 1023 if (i8042_command(&i8042_initial_ctr, I8042_CMD_CTL_WCTR)) 1022 - printk(KERN_WARNING "i8042.c: Can't restore CTR.\n"); 1024 + pr_warn("Can't restore CTR\n"); 1023 1025 } 1024 1026 1025 1027 ··· 1043 1045 led = (state) ? 0x01 | 0x04 : 0; 1044 1046 while (i8042_read_status() & I8042_STR_IBF) 1045 1047 DELAY; 1046 - dbg("%02x -> i8042 (panic blink)", 0xed); 1048 + dbg("%02x -> i8042 (panic blink)\n", 0xed); 1047 1049 i8042_suppress_kbd_ack = 2; 1048 1050 i8042_write_data(0xed); /* set leds */ 1049 1051 DELAY; 1050 1052 while (i8042_read_status() & I8042_STR_IBF) 1051 1053 DELAY; 1052 1054 DELAY; 1053 - dbg("%02x -> i8042 (panic blink)", led); 1055 + dbg("%02x -> i8042 (panic blink)\n", led); 1054 1056 i8042_write_data(led); 1055 1057 DELAY; 1056 1058 return delay; ··· 1066 1068 1067 1069 error = i8042_command(&param, 0x1059); 1068 1070 if (error) 1069 - printk(KERN_WARNING 1070 - "Failed to enable DRITEK extension: %d\n", 1071 - error); 1071 + pr_warn("Failed to enable DRITEK extension: %d\n", error); 1072 1072 } 1073 1073 #endif 1074 1074 ··· 1101 1105 i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS; 1102 1106 i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT); 1103 1107 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { 1104 - printk(KERN_WARNING "i8042: Can't write CTR to resume, retrying...\n"); 1108 + pr_warn("Can't write CTR to resume, retrying...\n"); 1105 1109 msleep(50); 1106 1110 if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { 1107 - printk(KERN_ERR "i8042: CTR write retry failed\n"); 1111 + pr_err("CTR write retry failed\n"); 1108 1112 return -EIO; 1109 1113 } 1110 1114 } ··· 1117 1121 1118 1122 if (i8042_mux_present) { 1119 1123 if (i8042_set_mux_mode(true, NULL) || i8042_enable_mux_ports()) 1120 - printk(KERN_WARNING 1121 - "i8042: failed to resume active multiplexor, " 1122 - "mouse won't work.\n"); 1124 + pr_warn("failed to resume active multiplexor, mouse won't work\n"); 1123 1125 } else if (i8042_ports[I8042_AUX_PORT_NO].serio) 1124 1126 i8042_enable_aux_port(); 1125 1127
+9 -5
drivers/input/serio/i8042.h
··· 89 89 #ifdef DEBUG 90 90 static unsigned long i8042_start_time; 91 91 #define dbg_init() do { i8042_start_time = jiffies; } while (0) 92 - #define dbg(format, arg...) \ 93 - do { \ 92 + #define dbg(format, arg...) \ 93 + do { \ 94 94 if (i8042_debug) \ 95 - printk(KERN_DEBUG __FILE__ ": " format " [%d]\n" , \ 96 - ## arg, (int) (jiffies - i8042_start_time)); \ 95 + printk(KERN_DEBUG KBUILD_MODNAME ": [%d] " format, \ 96 + (int) (jiffies - i8042_start_time), ##arg); \ 97 97 } while (0) 98 98 #else 99 99 #define dbg_init() do { } while (0) 100 - #define dbg(format, arg...) do {} while (0) 100 + #define dbg(format, arg...) \ 101 + do { \ 102 + if (0) \ 103 + printk(KERN_DEBUG pr_fmt(format), ##arg); \ 104 + } while (0) 101 105 #endif 102 106 103 107 #endif /* _I8042_H */
+1 -1
drivers/input/serio/ps2mult.c
··· 207 207 err_out: 208 208 while (--i >= 0) 209 209 kfree(psm->ports[i].serio); 210 - kfree(serio); 210 + kfree(psm); 211 211 return error; 212 212 } 213 213
+98 -115
drivers/input/serio/serio.c
··· 32 32 #include <linux/module.h> 33 33 #include <linux/serio.h> 34 34 #include <linux/errno.h> 35 - #include <linux/wait.h> 36 35 #include <linux/sched.h> 37 36 #include <linux/slab.h> 38 - #include <linux/kthread.h> 37 + #include <linux/workqueue.h> 39 38 #include <linux/mutex.h> 40 39 41 40 MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>"); ··· 43 44 44 45 /* 45 46 * serio_mutex protects entire serio subsystem and is taken every time 46 - * serio port or driver registrered or unregistered. 47 + * serio port or driver registered or unregistered. 47 48 */ 48 49 static DEFINE_MUTEX(serio_mutex); 49 50 ··· 164 165 165 166 static DEFINE_SPINLOCK(serio_event_lock); /* protects serio_event_list */ 166 167 static LIST_HEAD(serio_event_list); 167 - static DECLARE_WAIT_QUEUE_HEAD(serio_wait); 168 - static struct task_struct *serio_task; 168 + 169 + static struct serio_event *serio_get_event(void) 170 + { 171 + struct serio_event *event = NULL; 172 + unsigned long flags; 173 + 174 + spin_lock_irqsave(&serio_event_lock, flags); 175 + 176 + if (!list_empty(&serio_event_list)) { 177 + event = list_first_entry(&serio_event_list, 178 + struct serio_event, node); 179 + list_del_init(&event->node); 180 + } 181 + 182 + spin_unlock_irqrestore(&serio_event_lock, flags); 183 + return event; 184 + } 185 + 186 + static void serio_free_event(struct serio_event *event) 187 + { 188 + module_put(event->owner); 189 + kfree(event); 190 + } 191 + 192 + static void serio_remove_duplicate_events(struct serio_event *event) 193 + { 194 + struct serio_event *e, *next; 195 + unsigned long flags; 196 + 197 + spin_lock_irqsave(&serio_event_lock, flags); 198 + 199 + list_for_each_entry_safe(e, next, &serio_event_list, node) { 200 + if (event->object == e->object) { 201 + /* 202 + * If this event is of different type we should not 203 + * look further - we only suppress duplicate events 204 + * that were sent back-to-back. 205 + */ 206 + if (event->type != e->type) 207 + break; 208 + 209 + list_del_init(&e->node); 210 + serio_free_event(e); 211 + } 212 + } 213 + 214 + spin_unlock_irqrestore(&serio_event_lock, flags); 215 + } 216 + 217 + static void serio_handle_event(struct work_struct *work) 218 + { 219 + struct serio_event *event; 220 + 221 + mutex_lock(&serio_mutex); 222 + 223 + while ((event = serio_get_event())) { 224 + 225 + switch (event->type) { 226 + 227 + case SERIO_REGISTER_PORT: 228 + serio_add_port(event->object); 229 + break; 230 + 231 + case SERIO_RECONNECT_PORT: 232 + serio_reconnect_port(event->object); 233 + break; 234 + 235 + case SERIO_RESCAN_PORT: 236 + serio_disconnect_port(event->object); 237 + serio_find_driver(event->object); 238 + break; 239 + 240 + case SERIO_RECONNECT_SUBTREE: 241 + serio_reconnect_subtree(event->object); 242 + break; 243 + 244 + case SERIO_ATTACH_DRIVER: 245 + serio_attach_driver(event->object); 246 + break; 247 + } 248 + 249 + serio_remove_duplicate_events(event); 250 + serio_free_event(event); 251 + } 252 + 253 + mutex_unlock(&serio_mutex); 254 + } 255 + 256 + static DECLARE_WORK(serio_event_work, serio_handle_event); 169 257 170 258 static int serio_queue_event(void *object, struct module *owner, 171 259 enum serio_event_type event_type) ··· 298 212 event->owner = owner; 299 213 300 214 list_add_tail(&event->node, &serio_event_list); 301 - wake_up(&serio_wait); 215 + schedule_work(&serio_event_work); 302 216 303 217 out: 304 218 spin_unlock_irqrestore(&serio_event_lock, flags); 305 219 return retval; 306 - } 307 - 308 - static void serio_free_event(struct serio_event *event) 309 - { 310 - module_put(event->owner); 311 - kfree(event); 312 - } 313 - 314 - static void serio_remove_duplicate_events(struct serio_event *event) 315 - { 316 - struct serio_event *e, *next; 317 - unsigned long flags; 318 - 319 - spin_lock_irqsave(&serio_event_lock, flags); 320 - 321 - list_for_each_entry_safe(e, next, &serio_event_list, node) { 322 - if (event->object == e->object) { 323 - /* 324 - * If this event is of different type we should not 325 - * look further - we only suppress duplicate events 326 - * that were sent back-to-back. 327 - */ 328 - if (event->type != e->type) 329 - break; 330 - 331 - list_del_init(&e->node); 332 - serio_free_event(e); 333 - } 334 - } 335 - 336 - spin_unlock_irqrestore(&serio_event_lock, flags); 337 - } 338 - 339 - 340 - static struct serio_event *serio_get_event(void) 341 - { 342 - struct serio_event *event = NULL; 343 - unsigned long flags; 344 - 345 - spin_lock_irqsave(&serio_event_lock, flags); 346 - 347 - if (!list_empty(&serio_event_list)) { 348 - event = list_first_entry(&serio_event_list, 349 - struct serio_event, node); 350 - list_del_init(&event->node); 351 - } 352 - 353 - spin_unlock_irqrestore(&serio_event_lock, flags); 354 - return event; 355 - } 356 - 357 - static void serio_handle_event(void) 358 - { 359 - struct serio_event *event; 360 - 361 - mutex_lock(&serio_mutex); 362 - 363 - while ((event = serio_get_event())) { 364 - 365 - switch (event->type) { 366 - 367 - case SERIO_REGISTER_PORT: 368 - serio_add_port(event->object); 369 - break; 370 - 371 - case SERIO_RECONNECT_PORT: 372 - serio_reconnect_port(event->object); 373 - break; 374 - 375 - case SERIO_RESCAN_PORT: 376 - serio_disconnect_port(event->object); 377 - serio_find_driver(event->object); 378 - break; 379 - 380 - case SERIO_RECONNECT_SUBTREE: 381 - serio_reconnect_subtree(event->object); 382 - break; 383 - 384 - case SERIO_ATTACH_DRIVER: 385 - serio_attach_driver(event->object); 386 - break; 387 - } 388 - 389 - serio_remove_duplicate_events(event); 390 - serio_free_event(event); 391 - } 392 - 393 - mutex_unlock(&serio_mutex); 394 220 } 395 221 396 222 /* ··· 353 355 spin_unlock_irqrestore(&serio_event_lock, flags); 354 356 return child; 355 357 } 356 - 357 - static int serio_thread(void *nothing) 358 - { 359 - do { 360 - serio_handle_event(); 361 - wait_event_interruptible(serio_wait, 362 - kthread_should_stop() || !list_empty(&serio_event_list)); 363 - } while (!kthread_should_stop()); 364 - 365 - return 0; 366 - } 367 - 368 358 369 359 /* 370 360 * Serio port operations ··· 1026 1040 return error; 1027 1041 } 1028 1042 1029 - serio_task = kthread_run(serio_thread, NULL, "kseriod"); 1030 - if (IS_ERR(serio_task)) { 1031 - bus_unregister(&serio_bus); 1032 - error = PTR_ERR(serio_task); 1033 - pr_err("Failed to start kseriod, error: %d\n", error); 1034 - return error; 1035 - } 1036 - 1037 1043 return 0; 1038 1044 } 1039 1045 1040 1046 static void __exit serio_exit(void) 1041 1047 { 1042 1048 bus_unregister(&serio_bus); 1043 - kthread_stop(serio_task); 1049 + 1050 + /* 1051 + * There should not be any outstanding events but work may 1052 + * still be scheduled so simply cancel it. 1053 + */ 1054 + cancel_work_sync(&serio_event_work); 1044 1055 } 1045 1056 1046 1057 subsys_initcall(serio_init);
+7 -19
drivers/input/tablet/wacom_wac.c
··· 14 14 15 15 #include "wacom_wac.h" 16 16 #include "wacom.h" 17 + #include <linux/input/mt.h> 17 18 18 19 static int wacom_penpartner_irq(struct wacom_wac *wacom) 19 20 { ··· 863 862 struct wacom_features *features = &wacom->features; 864 863 struct input_dev *input = wacom->input; 865 864 unsigned char *data = wacom->data; 866 - int sp = 0, sx = 0, sy = 0, count = 0; 867 865 int i; 868 866 869 867 for (i = 0; i < 2; i++) { 870 868 int p = data[9 * i + 2]; 869 + bool touch = p && !wacom->shared->stylus_in_proximity; 870 + 871 871 input_mt_slot(input, i); 872 + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); 872 873 /* 873 874 * Touch events need to be disabled while stylus is 874 875 * in proximity because user's hand is resting on touchpad 875 876 * and sending unwanted events. User expects tablet buttons 876 877 * to continue working though. 877 878 */ 878 - if (p && !wacom->shared->stylus_in_proximity) { 879 + if (touch) { 879 880 int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff; 880 881 int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff; 881 882 if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) { ··· 887 884 input_report_abs(input, ABS_MT_PRESSURE, p); 888 885 input_report_abs(input, ABS_MT_POSITION_X, x); 889 886 input_report_abs(input, ABS_MT_POSITION_Y, y); 890 - if (wacom->id[i] < 0) 891 - wacom->id[i] = wacom->trk_id++ & MAX_TRACKING_ID; 892 - if (!count++) 893 - sp = p, sx = x, sy = y; 894 - } else { 895 - wacom->id[i] = -1; 896 887 } 897 - input_report_abs(input, ABS_MT_TRACKING_ID, wacom->id[i]); 898 888 } 899 889 900 - input_report_key(input, BTN_TOUCH, count > 0); 901 - input_report_key(input, BTN_TOOL_FINGER, count == 1); 902 - input_report_key(input, BTN_TOOL_DOUBLETAP, count == 2); 903 - 904 - input_report_abs(input, ABS_PRESSURE, sp); 905 - input_report_abs(input, ABS_X, sx); 906 - input_report_abs(input, ABS_Y, sy); 890 + input_mt_report_pointer_emulation(input, true); 907 891 908 892 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); 909 893 input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0); ··· 1262 1272 __set_bit(BTN_TOOL_FINGER, input_dev->keybit); 1263 1273 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); 1264 1274 1265 - input_mt_create_slots(input_dev, 2); 1275 + input_mt_init_slots(input_dev, 2); 1266 1276 input_set_abs_params(input_dev, ABS_MT_POSITION_X, 1267 1277 0, features->x_max, 1268 1278 features->x_fuzz, 0); ··· 1272 1282 input_set_abs_params(input_dev, ABS_MT_PRESSURE, 1273 1283 0, features->pressure_max, 1274 1284 features->pressure_fuzz, 0); 1275 - input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 1276 - MAX_TRACKING_ID, 0, 0); 1277 1285 } else if (features->device_type == BTN_TOOL_PEN) { 1278 1286 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 1279 1287 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
-4
drivers/input/tablet/wacom_wac.h
··· 42 42 #define WACOM_QUIRK_MULTI_INPUT 0x0001 43 43 #define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002 44 44 45 - /* largest reported tracking id */ 46 - #define MAX_TRACKING_ID 0xfff 47 - 48 45 enum { 49 46 PENPARTNER = 0, 50 47 GRAPHIRE, ··· 97 100 int id[3]; 98 101 __u32 serial[2]; 99 102 int last_finger; 100 - int trk_id; 101 103 struct wacom_features features; 102 104 struct wacom_shared *shared; 103 105 struct input_dev *input;
+22 -10
drivers/input/touchscreen/Kconfig
··· 659 659 To compile this driver as a module, choose M here: the 660 660 module will be called pcap_ts. 661 661 662 + config TOUCHSCREEN_ST1232 663 + tristate "Sitronix ST1232 touchscreen controllers" 664 + depends on I2C 665 + help 666 + Say Y here if you want to support Sitronix ST1232 667 + touchscreen controller. 668 + 669 + If unsure, say N. 670 + 671 + To compile this driver as a module, choose M here: the 672 + module will be called st1232_ts. 673 + 674 + config TOUCHSCREEN_STMPE 675 + tristate "STMicroelectronics STMPE touchscreens" 676 + depends on MFD_STMPE 677 + help 678 + Say Y here if you want support for STMicroelectronics 679 + STMPE touchscreen controllers. 680 + 681 + To compile this driver as a module, choose M here: the 682 + module will be called stmpe-ts. 683 + 662 684 config TOUCHSCREEN_TPS6507X 663 685 tristate "TPS6507x based touchscreens" 664 686 depends on I2C ··· 692 670 693 671 To compile this driver as a module, choose M here: the 694 672 module will be called tps6507x_ts. 695 - 696 - config TOUCHSCREEN_STMPE 697 - tristate "STMicroelectronics STMPE touchscreens" 698 - depends on MFD_STMPE 699 - help 700 - Say Y here if you want support for STMicroelectronics 701 - STMPE touchscreen controllers. 702 - 703 - To compile this driver as a module, choose M here: the 704 - module will be called stmpe-ts. 705 673 706 674 endif
+1
drivers/input/touchscreen/Makefile
··· 39 39 obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o 40 40 obj-$(CONFIG_TOUCHSCREEN_QT602240) += qt602240_ts.o 41 41 obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o 42 + obj-$(CONFIG_TOUCHSCREEN_ST1232) += st1232.o 42 43 obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o 43 44 obj-$(CONFIG_TOUCHSCREEN_TNETV107X) += tnetv107x-ts.o 44 45 obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o
+1 -1
drivers/input/touchscreen/bu21013_ts.c
··· 365 365 } 366 366 367 367 retval = i2c_smbus_write_byte_data(i2c, BU21013_TH_OFF_REG, 368 - BU21013_TH_OFF_4 || BU21013_TH_OFF_3); 368 + BU21013_TH_OFF_4 | BU21013_TH_OFF_3); 369 369 if (retval < 0) { 370 370 dev_err(&i2c->dev, "BU21013_TH_OFF reg write failed\n"); 371 371 return retval;
+13 -8
drivers/input/touchscreen/qt602240_ts.c
··· 969 969 return error; 970 970 971 971 data->object_table = kcalloc(info->object_num, 972 - sizeof(struct qt602240_data), 972 + sizeof(struct qt602240_object), 973 973 GFP_KERNEL); 974 974 if (!data->object_table) { 975 975 dev_err(&client->dev, "Failed to allocate memory\n"); ··· 1324 1324 } 1325 1325 1326 1326 #ifdef CONFIG_PM 1327 - static int qt602240_suspend(struct i2c_client *client, pm_message_t mesg) 1327 + static int qt602240_suspend(struct device *dev) 1328 1328 { 1329 + struct i2c_client *client = to_i2c_client(dev); 1329 1330 struct qt602240_data *data = i2c_get_clientdata(client); 1330 1331 struct input_dev *input_dev = data->input_dev; 1331 1332 ··· 1340 1339 return 0; 1341 1340 } 1342 1341 1343 - static int qt602240_resume(struct i2c_client *client) 1342 + static int qt602240_resume(struct device *dev) 1344 1343 { 1344 + struct i2c_client *client = to_i2c_client(dev); 1345 1345 struct qt602240_data *data = i2c_get_clientdata(client); 1346 1346 struct input_dev *input_dev = data->input_dev; 1347 1347 ··· 1361 1359 1362 1360 return 0; 1363 1361 } 1364 - #else 1365 - #define qt602240_suspend NULL 1366 - #define qt602240_resume NULL 1362 + 1363 + static const struct dev_pm_ops qt602240_pm_ops = { 1364 + .suspend = qt602240_suspend, 1365 + .resume = qt602240_resume, 1366 + }; 1367 1367 #endif 1368 1368 1369 1369 static const struct i2c_device_id qt602240_id[] = { ··· 1378 1374 .driver = { 1379 1375 .name = "qt602240_ts", 1380 1376 .owner = THIS_MODULE, 1377 + #ifdef CONFIG_PM 1378 + .pm = &qt602240_pm_ops, 1379 + #endif 1381 1380 }, 1382 1381 .probe = qt602240_probe, 1383 1382 .remove = __devexit_p(qt602240_remove), 1384 - .suspend = qt602240_suspend, 1385 - .resume = qt602240_resume, 1386 1383 .id_table = qt602240_id, 1387 1384 }; 1388 1385
+274
drivers/input/touchscreen/st1232.c
··· 1 + /* 2 + * ST1232 Touchscreen Controller Driver 3 + * 4 + * Copyright (C) 2010 Renesas Solutions Corp. 5 + * Tony SIM <chinyeow.sim.xt@renesas.com> 6 + * 7 + * Using code from: 8 + * - android.git.kernel.org: projects/kernel/common.git: synaptics_i2c_rmi.c 9 + * Copyright (C) 2007 Google, Inc. 10 + * 11 + * This software is licensed under the terms of the GNU General Public 12 + * License version 2, as published by the Free Software Foundation, and 13 + * may be copied, distributed, and modified under those terms. 14 + * 15 + * This program is distributed in the hope that it will be useful, 16 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 + * GNU General Public License for more details. 19 + */ 20 + 21 + #include <linux/delay.h> 22 + #include <linux/i2c.h> 23 + #include <linux/input.h> 24 + #include <linux/interrupt.h> 25 + #include <linux/module.h> 26 + #include <linux/slab.h> 27 + #include <linux/types.h> 28 + 29 + #define ST1232_TS_NAME "st1232-ts" 30 + 31 + #define MIN_X 0x00 32 + #define MIN_Y 0x00 33 + #define MAX_X 0x31f /* (800 - 1) */ 34 + #define MAX_Y 0x1df /* (480 - 1) */ 35 + #define MAX_AREA 0xff 36 + #define MAX_FINGERS 2 37 + 38 + struct st1232_ts_finger { 39 + u16 x; 40 + u16 y; 41 + u8 t; 42 + bool is_valid; 43 + }; 44 + 45 + struct st1232_ts_data { 46 + struct i2c_client *client; 47 + struct input_dev *input_dev; 48 + struct st1232_ts_finger finger[MAX_FINGERS]; 49 + }; 50 + 51 + static int st1232_ts_read_data(struct st1232_ts_data *ts) 52 + { 53 + struct st1232_ts_finger *finger = ts->finger; 54 + struct i2c_client *client = ts->client; 55 + struct i2c_msg msg[2]; 56 + int error; 57 + u8 start_reg; 58 + u8 buf[10]; 59 + 60 + /* read touchscreen data from ST1232 */ 61 + msg[0].addr = client->addr; 62 + msg[0].flags = 0; 63 + msg[0].len = 1; 64 + msg[0].buf = &start_reg; 65 + start_reg = 0x10; 66 + 67 + msg[1].addr = ts->client->addr; 68 + msg[1].flags = I2C_M_RD; 69 + msg[1].len = sizeof(buf); 70 + msg[1].buf = buf; 71 + 72 + error = i2c_transfer(client->adapter, msg, 2); 73 + if (error < 0) 74 + return error; 75 + 76 + /* get "valid" bits */ 77 + finger[0].is_valid = buf[2] >> 7; 78 + finger[1].is_valid = buf[5] >> 7; 79 + 80 + /* get xy coordinate */ 81 + if (finger[0].is_valid) { 82 + finger[0].x = ((buf[2] & 0x0070) << 4) | buf[3]; 83 + finger[0].y = ((buf[2] & 0x0007) << 8) | buf[4]; 84 + finger[0].t = buf[8]; 85 + } 86 + 87 + if (finger[1].is_valid) { 88 + finger[1].x = ((buf[5] & 0x0070) << 4) | buf[6]; 89 + finger[1].y = ((buf[5] & 0x0007) << 8) | buf[7]; 90 + finger[1].t = buf[9]; 91 + } 92 + 93 + return 0; 94 + } 95 + 96 + static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id) 97 + { 98 + struct st1232_ts_data *ts = dev_id; 99 + struct st1232_ts_finger *finger = ts->finger; 100 + struct input_dev *input_dev = ts->input_dev; 101 + int count = 0; 102 + int i, ret; 103 + 104 + ret = st1232_ts_read_data(ts); 105 + if (ret < 0) 106 + goto end; 107 + 108 + /* multi touch protocol */ 109 + for (i = 0; i < MAX_FINGERS; i++) { 110 + if (!finger[i].is_valid) 111 + continue; 112 + 113 + input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, finger[i].t); 114 + input_report_abs(input_dev, ABS_MT_POSITION_X, finger[i].x); 115 + input_report_abs(input_dev, ABS_MT_POSITION_Y, finger[i].y); 116 + input_mt_sync(input_dev); 117 + count++; 118 + } 119 + 120 + /* SYN_MT_REPORT only if no contact */ 121 + if (!count) 122 + input_mt_sync(input_dev); 123 + 124 + /* SYN_REPORT */ 125 + input_sync(input_dev); 126 + 127 + end: 128 + return IRQ_HANDLED; 129 + } 130 + 131 + static int __devinit st1232_ts_probe(struct i2c_client *client, 132 + const struct i2c_device_id *id) 133 + { 134 + struct st1232_ts_data *ts; 135 + struct input_dev *input_dev; 136 + int error; 137 + 138 + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 139 + dev_err(&client->dev, "need I2C_FUNC_I2C\n"); 140 + return -EIO; 141 + } 142 + 143 + if (!client->irq) { 144 + dev_err(&client->dev, "no IRQ?\n"); 145 + return -EINVAL; 146 + } 147 + 148 + 149 + ts = kzalloc(sizeof(struct st1232_ts_data), GFP_KERNEL); 150 + input_dev = input_allocate_device(); 151 + if (!ts || !input_dev) { 152 + error = -ENOMEM; 153 + goto err_free_mem; 154 + } 155 + 156 + ts->client = client; 157 + ts->input_dev = input_dev; 158 + 159 + input_dev->name = "st1232-touchscreen"; 160 + input_dev->id.bustype = BUS_I2C; 161 + input_dev->dev.parent = &client->dev; 162 + 163 + __set_bit(EV_SYN, input_dev->evbit); 164 + __set_bit(EV_KEY, input_dev->evbit); 165 + __set_bit(EV_ABS, input_dev->evbit); 166 + 167 + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, MAX_AREA, 0, 0); 168 + input_set_abs_params(input_dev, ABS_MT_POSITION_X, MIN_X, MAX_X, 0, 0); 169 + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, MIN_Y, MAX_Y, 0, 0); 170 + 171 + error = request_threaded_irq(client->irq, NULL, st1232_ts_irq_handler, 172 + IRQF_ONESHOT, client->name, ts); 173 + if (error) { 174 + dev_err(&client->dev, "Failed to register interrupt\n"); 175 + goto err_free_mem; 176 + } 177 + 178 + error = input_register_device(ts->input_dev); 179 + if (error) { 180 + dev_err(&client->dev, "Unable to register %s input device\n", 181 + input_dev->name); 182 + goto err_free_irq; 183 + } 184 + 185 + i2c_set_clientdata(client, ts); 186 + device_init_wakeup(&client->dev, 1); 187 + 188 + return 0; 189 + 190 + err_free_irq: 191 + free_irq(client->irq, ts); 192 + err_free_mem: 193 + input_free_device(input_dev); 194 + kfree(ts); 195 + return error; 196 + } 197 + 198 + static int __devexit st1232_ts_remove(struct i2c_client *client) 199 + { 200 + struct st1232_ts_data *ts = i2c_get_clientdata(client); 201 + 202 + device_init_wakeup(&client->dev, 0); 203 + free_irq(client->irq, ts); 204 + input_unregister_device(ts->input_dev); 205 + kfree(ts); 206 + 207 + return 0; 208 + } 209 + 210 + #ifdef CONFIG_PM 211 + static int st1232_ts_suspend(struct device *dev) 212 + { 213 + struct i2c_client *client = to_i2c_client(dev); 214 + 215 + if (device_may_wakeup(&client->dev)) 216 + enable_irq_wake(client->irq); 217 + else 218 + disable_irq(client->irq); 219 + 220 + return 0; 221 + } 222 + 223 + static int st1232_ts_resume(struct device *dev) 224 + { 225 + struct i2c_client *client = to_i2c_client(dev); 226 + 227 + if (device_may_wakeup(&client->dev)) 228 + disable_irq_wake(client->irq); 229 + else 230 + enable_irq(client->irq); 231 + 232 + return 0; 233 + } 234 + 235 + static const struct dev_pm_ops st1232_ts_pm_ops = { 236 + .suspend = st1232_ts_suspend, 237 + .resume = st1232_ts_resume, 238 + }; 239 + #endif 240 + 241 + static const struct i2c_device_id st1232_ts_id[] = { 242 + { ST1232_TS_NAME, 0 }, 243 + { } 244 + }; 245 + MODULE_DEVICE_TABLE(i2c, st1232_ts_id); 246 + 247 + static struct i2c_driver st1232_ts_driver = { 248 + .probe = st1232_ts_probe, 249 + .remove = __devexit_p(st1232_ts_remove), 250 + .id_table = st1232_ts_id, 251 + .driver = { 252 + .name = ST1232_TS_NAME, 253 + .owner = THIS_MODULE, 254 + #ifdef CONFIG_PM 255 + .pm = &st1232_ts_pm_ops, 256 + #endif 257 + }, 258 + }; 259 + 260 + static int __init st1232_ts_init(void) 261 + { 262 + return i2c_add_driver(&st1232_ts_driver); 263 + } 264 + module_init(st1232_ts_init); 265 + 266 + static void __exit st1232_ts_exit(void) 267 + { 268 + i2c_del_driver(&st1232_ts_driver); 269 + } 270 + module_exit(st1232_ts_exit); 271 + 272 + MODULE_AUTHOR("Tony SIM <chinyeow.sim.xt@renesas.com>"); 273 + MODULE_DESCRIPTION("SITRONIX ST1232 Touchscreen Controller Driver"); 274 + MODULE_LICENSE("GPL");
+41 -32
drivers/input/touchscreen/wacom_w8001.c
··· 15 15 #include <linux/kernel.h> 16 16 #include <linux/module.h> 17 17 #include <linux/slab.h> 18 - #include <linux/input.h> 18 + #include <linux/input/mt.h> 19 19 #include <linux/serio.h> 20 20 #include <linux/init.h> 21 21 #include <linux/ctype.h> 22 + #include <linux/delay.h> 22 23 23 24 #define DRIVER_DESC "Wacom W8001 serial touchscreen driver" 24 25 ··· 38 37 39 38 #define W8001_QUERY_PACKET 0x20 40 39 40 + #define W8001_CMD_STOP '0' 41 41 #define W8001_CMD_START '1' 42 42 #define W8001_CMD_QUERY '*' 43 43 #define W8001_CMD_TOUCHQUERY '%' ··· 49 47 #define W8001_PKTLEN_TPCPEN 9 50 48 #define W8001_PKTLEN_TPCCTL 11 /* control packet */ 51 49 #define W8001_PKTLEN_TOUCH2FG 13 52 - 53 - #define MAX_TRACKING_ID 0xFF /* arbitrarily chosen */ 54 50 55 51 struct w8001_coord { 56 52 u8 rdy; ··· 87 87 char phys[32]; 88 88 int type; 89 89 unsigned int pktlen; 90 - int trkid[2]; 91 90 }; 92 91 93 92 static void parse_data(u8 *data, struct w8001_coord *coord) ··· 115 116 116 117 static void parse_touch(struct w8001 *w8001) 117 118 { 118 - static int trkid; 119 119 struct input_dev *dev = w8001->dev; 120 120 unsigned char *data = w8001->data; 121 121 int i; 122 122 123 123 for (i = 0; i < 2; i++) { 124 - input_mt_slot(dev, i); 124 + bool touch = data[0] & (1 << i); 125 125 126 - if (data[0] & (1 << i)) { 126 + input_mt_slot(dev, i); 127 + input_mt_report_slot_state(dev, MT_TOOL_FINGER, touch); 128 + if (touch) { 127 129 int x = (data[6 * i + 1] << 7) | (data[6 * i + 2]); 128 130 int y = (data[6 * i + 3] << 7) | (data[6 * i + 4]); 129 131 /* data[5,6] and [11,12] is finger capacity */ 130 132 131 133 input_report_abs(dev, ABS_MT_POSITION_X, x); 132 134 input_report_abs(dev, ABS_MT_POSITION_Y, y); 133 - input_report_abs(dev, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER); 134 - if (w8001->trkid[i] < 0) 135 - w8001->trkid[i] = trkid++ & MAX_TRACKING_ID; 136 - } else { 137 - w8001->trkid[i] = -1; 138 135 } 139 - input_report_abs(dev, ABS_MT_TRACKING_ID, w8001->trkid[i]); 140 136 } 141 137 142 138 input_sync(dev); ··· 281 287 struct w8001_coord coord; 282 288 int error; 283 289 284 - error = w8001_command(w8001, W8001_CMD_QUERY, true); 290 + error = w8001_command(w8001, W8001_CMD_STOP, false); 285 291 if (error) 286 292 return error; 287 293 288 - parse_data(w8001->response, &coord); 294 + msleep(250); /* wait 250ms before querying the device */ 289 295 290 - input_set_abs_params(dev, ABS_X, 0, coord.x, 0, 0); 291 - input_set_abs_params(dev, ABS_Y, 0, coord.y, 0, 0); 292 - input_set_abs_params(dev, ABS_PRESSURE, 0, coord.pen_pressure, 0, 0); 293 - input_set_abs_params(dev, ABS_TILT_X, 0, coord.tilt_x, 0, 0); 294 - input_set_abs_params(dev, ABS_TILT_Y, 0, coord.tilt_y, 0, 0); 295 - 296 - error = w8001_command(w8001, W8001_CMD_TOUCHQUERY, true); 296 + /* penabled? */ 297 + error = w8001_command(w8001, W8001_CMD_QUERY, true); 297 298 if (!error) { 299 + __set_bit(BTN_TOOL_PEN, dev->keybit); 300 + __set_bit(BTN_TOOL_RUBBER, dev->keybit); 301 + __set_bit(BTN_STYLUS, dev->keybit); 302 + __set_bit(BTN_STYLUS2, dev->keybit); 303 + parse_data(w8001->response, &coord); 304 + 305 + input_set_abs_params(dev, ABS_X, 0, coord.x, 0, 0); 306 + input_set_abs_params(dev, ABS_Y, 0, coord.y, 0, 0); 307 + input_set_abs_params(dev, ABS_PRESSURE, 0, coord.pen_pressure, 0, 0); 308 + if (coord.tilt_x && coord.tilt_y) { 309 + input_set_abs_params(dev, ABS_TILT_X, 0, coord.tilt_x, 0, 0); 310 + input_set_abs_params(dev, ABS_TILT_Y, 0, coord.tilt_y, 0, 0); 311 + } 312 + } 313 + 314 + /* Touch enabled? */ 315 + error = w8001_command(w8001, W8001_CMD_TOUCHQUERY, true); 316 + 317 + /* 318 + * Some non-touch devices may reply to the touch query. But their 319 + * second byte is empty, which indicates touch is not supported. 320 + */ 321 + if (!error && w8001->response[1]) { 298 322 struct w8001_touch_query touch; 299 323 300 324 parse_touchquery(w8001->response, &touch); 325 + 326 + input_set_abs_params(dev, ABS_X, 0, touch.x, 0, 0); 327 + input_set_abs_params(dev, ABS_Y, 0, touch.y, 0, 0); 328 + __set_bit(BTN_TOOL_FINGER, dev->keybit); 301 329 302 330 switch (touch.sensor_id) { 303 331 case 0: ··· 334 318 case 5: 335 319 w8001->pktlen = W8001_PKTLEN_TOUCH2FG; 336 320 337 - input_mt_create_slots(dev, 2); 338 - input_set_abs_params(dev, ABS_MT_TRACKING_ID, 339 - 0, MAX_TRACKING_ID, 0, 0); 321 + input_mt_init_slots(dev, 2); 340 322 input_set_abs_params(dev, ABS_MT_POSITION_X, 341 323 0, touch.x, 0, 0); 342 324 input_set_abs_params(dev, ABS_MT_POSITION_Y, 343 325 0, touch.y, 0, 0); 344 326 input_set_abs_params(dev, ABS_MT_TOOL_TYPE, 345 - 0, 0, 0, 0); 327 + 0, MT_TOOL_MAX, 0, 0); 346 328 break; 347 329 } 348 330 } ··· 386 372 w8001->serio = serio; 387 373 w8001->id = serio->id.id; 388 374 w8001->dev = input_dev; 389 - w8001->trkid[0] = w8001->trkid[1] = -1; 390 375 init_completion(&w8001->cmd_done); 391 376 snprintf(w8001->phys, sizeof(w8001->phys), "%s/input0", serio->phys); 392 377 ··· 398 385 input_dev->dev.parent = &serio->dev; 399 386 400 387 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 401 - input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); 402 - input_dev->keybit[BIT_WORD(BTN_TOOL_PEN)] |= BIT_MASK(BTN_TOOL_PEN); 403 - input_dev->keybit[BIT_WORD(BTN_TOOL_RUBBER)] |= BIT_MASK(BTN_TOOL_RUBBER); 404 - input_dev->keybit[BIT_WORD(BTN_STYLUS)] |= BIT_MASK(BTN_STYLUS); 405 - input_dev->keybit[BIT_WORD(BTN_STYLUS2)] |= BIT_MASK(BTN_STYLUS2); 388 + __set_bit(BTN_TOUCH, input_dev->keybit); 406 389 407 390 serio_set_drvdata(serio, w8001); 408 391 err = serio_open(serio, drv);
+5 -5
drivers/input/xen-kbdfront.c
··· 17 17 * Switch to grant tables together with xen-fbfront.c. 18 18 */ 19 19 20 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 21 + 20 22 #include <linux/kernel.h> 21 23 #include <linux/errno.h> 22 24 #include <linux/module.h> ··· 86 84 input_report_key(dev, event->key.keycode, 87 85 event->key.pressed); 88 86 else 89 - printk(KERN_WARNING 90 - "xenkbd: unhandled keycode 0x%x\n", 91 - event->key.keycode); 87 + pr_warning("unhandled keycode 0x%x\n", 88 + event->key.keycode); 92 89 break; 93 90 case XENKBD_TYPE_POS: 94 91 input_report_abs(dev, ABS_X, event->pos.abs_x); ··· 293 292 ret = xenbus_printf(XBT_NIL, info->xbdev->nodename, 294 293 "request-abs-pointer", "1"); 295 294 if (ret) 296 - printk(KERN_WARNING 297 - "xenkbd: can't request abs-pointer"); 295 + pr_warning("can't request abs-pointer\n"); 298 296 } 299 297 xenbus_switch_state(dev, XenbusStateConnected); 300 298 break;
+8
drivers/macintosh/mac_hid.c
··· 23 23 24 24 static struct input_dev *mac_hid_emumouse_dev; 25 25 26 + static DEFINE_MUTEX(mac_hid_emumouse_mutex); 27 + 26 28 static int mac_hid_create_emumouse(void) 27 29 { 28 30 static struct lock_class_key mac_hid_emumouse_dev_event_class; ··· 189 187 int old_val = *valp; 190 188 int rc; 191 189 190 + rc = mutex_lock_killable(&mac_hid_emumouse_mutex); 191 + if (rc) 192 + return rc; 193 + 192 194 rc = proc_dointvec(table, write, buffer, lenp, ppos); 193 195 194 196 if (rc == 0 && write && *valp != old_val) { ··· 207 201 /* Restore the old value in case of error */ 208 202 if (rc) 209 203 *valp = old_val; 204 + 205 + mutex_unlock(&mac_hid_emumouse_mutex); 210 206 211 207 return rc; 212 208 }
+21 -17
include/linux/input.h
··· 112 112 #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ 113 113 #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ 114 114 #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ 115 + #define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len) /* get device properties */ 115 116 116 117 #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */ 117 118 #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ ··· 128 127 #define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */ 129 128 130 129 #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ 130 + 131 + /* 132 + * Device properties and quirks 133 + */ 134 + 135 + #define INPUT_PROP_POINTER 0x00 /* needs a pointer */ 136 + #define INPUT_PROP_DIRECT 0x01 /* direct input devices */ 137 + #define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */ 138 + #define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */ 139 + 140 + #define INPUT_PROP_MAX 0x1f 141 + #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) 131 142 132 143 /* 133 144 * Event types ··· 771 758 #define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */ 772 759 #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */ 773 760 #define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */ 761 + #define ABS_MT_DISTANCE 0x3b /* Contact hover distance */ 774 762 775 763 #ifdef __KERNEL__ 776 764 /* Implementation details, userspace should not care about these */ 777 765 #define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR 778 - #define ABS_MT_LAST ABS_MT_PRESSURE 766 + #define ABS_MT_LAST ABS_MT_DISTANCE 779 767 #endif 780 768 781 769 #define ABS_MAX 0x3f ··· 887 873 */ 888 874 #define MT_TOOL_FINGER 0 889 875 #define MT_TOOL_PEN 1 876 + #define MT_TOOL_MAX 1 890 877 891 878 /* 892 879 * Values describing the status of a force-feedback effect ··· 1123 1108 #include <linux/mod_devicetable.h> 1124 1109 1125 1110 /** 1126 - * struct input_mt_slot - represents the state of an input MT slot 1127 - * @abs: holds current values of ABS_MT axes for this slot 1128 - */ 1129 - struct input_mt_slot { 1130 - int abs[ABS_MT_LAST - ABS_MT_FIRST + 1]; 1131 - }; 1132 - 1133 - /** 1134 1111 * struct input_dev - represents an input device 1135 1112 * @name: name of the device 1136 1113 * @phys: physical path to the device in the system hierarchy 1137 1114 * @uniq: unique identification code for the device (if device has it) 1138 1115 * @id: id of the device (struct input_id) 1116 + * @propbit: bitmap of device properties and quirks 1139 1117 * @evbit: bitmap of types of events supported by the device (EV_KEY, 1140 1118 * EV_REL, etc.) 1141 1119 * @keybit: bitmap of keys/buttons this device has ··· 1163 1155 * of tracked contacts 1164 1156 * @mtsize: number of MT slots the device uses 1165 1157 * @slot: MT slot currently being transmitted 1158 + * @trkid: stores MT tracking ID for the current contact 1166 1159 * @absinfo: array of &struct input_absinfo elements holding information 1167 1160 * about absolute axes (current value, min, max, flat, fuzz, 1168 1161 * resolution) ··· 1212 1203 const char *uniq; 1213 1204 struct input_id id; 1214 1205 1206 + unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; 1207 + 1215 1208 unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; 1216 1209 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; 1217 1210 unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; ··· 1250 1239 struct input_mt_slot *mt; 1251 1240 int mtsize; 1252 1241 int slot; 1242 + int trkid; 1253 1243 1254 1244 struct input_absinfo *absinfo; 1255 1245 ··· 1500 1488 input_event(dev, EV_SYN, SYN_MT_REPORT, 0); 1501 1489 } 1502 1490 1503 - static inline void input_mt_slot(struct input_dev *dev, int slot) 1504 - { 1505 - input_event(dev, EV_ABS, ABS_MT_SLOT, slot); 1506 - } 1507 - 1508 1491 void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code); 1509 1492 1510 1493 /** ··· 1611 1604 1612 1605 int input_ff_create_memless(struct input_dev *dev, void *data, 1613 1606 int (*play_effect)(struct input_dev *, void *, struct ff_effect *)); 1614 - 1615 - int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots); 1616 - void input_mt_destroy_slots(struct input_dev *dev); 1617 1607 1618 1608 #endif 1619 1609 #endif
+59
include/linux/input/cma3000.h
··· 1 + /* 2 + * VTI CMA3000_Dxx Accelerometer driver 3 + * 4 + * Copyright (C) 2010 Texas Instruments 5 + * Author: Hemanth V <hemanthv@ti.com> 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 version 2 as published by 9 + * the Free Software Foundation. 10 + * 11 + * This program is distributed in the hope that it will be useful, but WITHOUT 12 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 + * more details. 15 + * 16 + * You should have received a copy of the GNU General Public License along with 17 + * this program. If not, see <http://www.gnu.org/licenses/>. 18 + */ 19 + 20 + #ifndef _LINUX_CMA3000_H 21 + #define _LINUX_CMA3000_H 22 + 23 + #define CMAMODE_DEFAULT 0 24 + #define CMAMODE_MEAS100 1 25 + #define CMAMODE_MEAS400 2 26 + #define CMAMODE_MEAS40 3 27 + #define CMAMODE_MOTDET 4 28 + #define CMAMODE_FF100 5 29 + #define CMAMODE_FF400 6 30 + #define CMAMODE_POFF 7 31 + 32 + #define CMARANGE_2G 2000 33 + #define CMARANGE_8G 8000 34 + 35 + /** 36 + * struct cma3000_i2c_platform_data - CMA3000 Platform data 37 + * @fuzz_x: Noise on X Axis 38 + * @fuzz_y: Noise on Y Axis 39 + * @fuzz_z: Noise on Z Axis 40 + * @g_range: G range in milli g i.e 2000 or 8000 41 + * @mode: Operating mode 42 + * @mdthr: Motion detect threshold value 43 + * @mdfftmr: Motion detect and free fall time value 44 + * @ffthr: Free fall threshold value 45 + */ 46 + 47 + struct cma3000_platform_data { 48 + int fuzz_x; 49 + int fuzz_y; 50 + int fuzz_z; 51 + int g_range; 52 + uint8_t mode; 53 + uint8_t mdthr; 54 + uint8_t mdfftmr; 55 + uint8_t ffthr; 56 + unsigned long irqflags; 57 + }; 58 + 59 + #endif
+57
include/linux/input/mt.h
··· 1 + #ifndef _INPUT_MT_H 2 + #define _INPUT_MT_H 3 + 4 + /* 5 + * Input Multitouch Library 6 + * 7 + * Copyright (c) 2010 Henrik Rydberg 8 + * 9 + * This program is free software; you can redistribute it and/or modify it 10 + * under the terms of the GNU General Public License version 2 as published by 11 + * the Free Software Foundation. 12 + */ 13 + 14 + #include <linux/input.h> 15 + 16 + #define TRKID_MAX 0xffff 17 + 18 + /** 19 + * struct input_mt_slot - represents the state of an input MT slot 20 + * @abs: holds current values of ABS_MT axes for this slot 21 + */ 22 + struct input_mt_slot { 23 + int abs[ABS_MT_LAST - ABS_MT_FIRST + 1]; 24 + }; 25 + 26 + static inline void input_mt_set_value(struct input_mt_slot *slot, 27 + unsigned code, int value) 28 + { 29 + slot->abs[code - ABS_MT_FIRST] = value; 30 + } 31 + 32 + static inline int input_mt_get_value(const struct input_mt_slot *slot, 33 + unsigned code) 34 + { 35 + return slot->abs[code - ABS_MT_FIRST]; 36 + } 37 + 38 + int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots); 39 + void input_mt_destroy_slots(struct input_dev *dev); 40 + 41 + static inline int input_mt_new_trkid(struct input_dev *dev) 42 + { 43 + return dev->trkid++ & TRKID_MAX; 44 + } 45 + 46 + static inline void input_mt_slot(struct input_dev *dev, int slot) 47 + { 48 + input_event(dev, EV_ABS, ABS_MT_SLOT, slot); 49 + } 50 + 51 + void input_mt_report_slot_state(struct input_dev *dev, 52 + unsigned int tool_type, bool active); 53 + 54 + void input_mt_report_finger_count(struct input_dev *dev, int count); 55 + void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count); 56 + 57 + #endif
+1
include/linux/uinput.h
··· 104 104 #define UI_SET_FFBIT _IOW(UINPUT_IOCTL_BASE, 107, int) 105 105 #define UI_SET_PHYS _IOW(UINPUT_IOCTL_BASE, 108, char*) 106 106 #define UI_SET_SWBIT _IOW(UINPUT_IOCTL_BASE, 109, int) 107 + #define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int) 107 108 108 109 #define UI_BEGIN_FF_UPLOAD _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload) 109 110 #define UI_END_FF_UPLOAD _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload)