1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Apple USB BCM5974 (Macbook Air and Penryn Macbook Pro) multitouch driver 4 * 5 * Copyright (C) 2008 Henrik Rydberg (rydberg@euromail.se) 6 * Copyright (C) 2015 John Horan (knasher@gmail.com) 7 * 8 * The USB initialization and package decoding was made by 9 * Scott Shawcroft as part of the touchd user-space driver project: 10 * Copyright (C) 2008 Scott Shawcroft (scott.shawcroft@gmail.com) 11 * 12 * The BCM5974 driver is based on the appletouch driver: 13 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) 14 * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) 15 * Copyright (C) 2005 Stelian Pop (stelian@popies.net) 16 * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) 17 * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) 18 * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) 19 * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/errno.h> 24 #include <linux/slab.h> 25 #include <linux/module.h> 26 #include <linux/usb/input.h> 27 #include <linux/hid.h> 28 #include <linux/mutex.h> 29 #include <linux/input/mt.h> 30 31 #define USB_VENDOR_ID_APPLE 0x05ac 32 33 /* MacbookAir, aka wellspring */ 34 #define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 35 #define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 36 #define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 37 /* MacbookProPenryn, aka wellspring2 */ 38 #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 39 #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 40 #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 41 /* Macbook5,1 (unibody), aka wellspring3 */ 42 #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 43 #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 44 #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 45 /* MacbookAir3,2 (unibody), aka wellspring5 */ 46 #define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f 47 #define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240 48 #define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241 49 /* MacbookAir3,1 (unibody), aka wellspring4 */ 50 #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242 51 #define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243 52 #define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244 53 /* Macbook8 (unibody, March 2011) */ 54 #define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 55 #define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 56 #define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 57 /* MacbookAir4,1 (unibody, July 2011) */ 58 #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI 0x0249 59 #define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO 0x024a 60 #define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS 0x024b 61 /* MacbookAir4,2 (unibody, July 2011) */ 62 #define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c 63 #define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d 64 #define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e 65 /* Macbook8,2 (unibody) */ 66 #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 67 #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 68 #define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 69 /* MacbookPro10,1 (unibody, June 2012) */ 70 #define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 71 #define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 72 #define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 73 /* MacbookPro10,2 (unibody, October 2012) */ 74 #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI 0x0259 75 #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a 76 #define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b 77 /* MacbookAir6,2 (unibody, June 2013) */ 78 #define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 79 #define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 80 #define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 81 /* MacbookPro12,1 (2015) */ 82 #define USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI 0x0272 83 #define USB_DEVICE_ID_APPLE_WELLSPRING9_ISO 0x0273 84 #define USB_DEVICE_ID_APPLE_WELLSPRING9_JIS 0x0274 85 86 #define BCM5974_DEVICE(prod) { \ 87 .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ 88 USB_DEVICE_ID_MATCH_INT_CLASS | \ 89 USB_DEVICE_ID_MATCH_INT_PROTOCOL), \ 90 .idVendor = USB_VENDOR_ID_APPLE, \ 91 .idProduct = (prod), \ 92 .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ 93 .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE \ 94 } 95 96 /* table of devices that work with this driver */ 97 static const struct usb_device_id bcm5974_table[] = { 98 /* MacbookAir1.1 */ 99 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), 100 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ISO), 101 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_JIS), 102 /* MacbookProPenryn */ 103 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), 104 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), 105 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), 106 /* Macbook5,1 */ 107 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), 108 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), 109 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), 110 /* MacbookAir3,2 */ 111 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI), 112 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ISO), 113 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_JIS), 114 /* MacbookAir3,1 */ 115 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI), 116 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO), 117 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS), 118 /* MacbookPro8 */ 119 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI), 120 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ISO), 121 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), 122 /* MacbookAir4,1 */ 123 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), 124 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), 125 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS), 126 /* MacbookAir4,2 */ 127 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI), 128 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_ISO), 129 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_JIS), 130 /* MacbookPro8,2 */ 131 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), 132 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), 133 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), 134 /* MacbookPro10,1 */ 135 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), 136 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), 137 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), 138 /* MacbookPro10,2 */ 139 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI), 140 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO), 141 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS), 142 /* MacbookAir6,2 */ 143 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI), 144 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_ISO), 145 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_JIS), 146 /* MacbookPro12,1 */ 147 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI), 148 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING9_ISO), 149 BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING9_JIS), 150 /* Terminating entry */ 151 {} 152 }; 153 MODULE_DEVICE_TABLE(usb, bcm5974_table); 154 155 MODULE_AUTHOR("Henrik Rydberg"); 156 MODULE_DESCRIPTION("Apple USB BCM5974 multitouch driver"); 157 MODULE_LICENSE("GPL"); 158 159 #define dprintk(level, format, a...)\ 160 { if (debug >= level) printk(KERN_DEBUG format, ##a); } 161 162 static int debug = 1; 163 module_param(debug, int, 0644); 164 MODULE_PARM_DESC(debug, "Activate debugging output"); 165 166 /* button data structure */ 167 struct bt_data { 168 u8 unknown1; /* constant */ 169 u8 button; /* left button */ 170 u8 rel_x; /* relative x coordinate */ 171 u8 rel_y; /* relative y coordinate */ 172 }; 173 174 /* trackpad header types */ 175 enum tp_type { 176 TYPE1, /* plain trackpad */ 177 TYPE2, /* button integrated in trackpad */ 178 TYPE3, /* additional header fields since June 2013 */ 179 TYPE4 /* additional header field for pressure data */ 180 }; 181 182 /* trackpad finger data offsets, le16-aligned */ 183 #define HEADER_TYPE1 (13 * sizeof(__le16)) 184 #define HEADER_TYPE2 (15 * sizeof(__le16)) 185 #define HEADER_TYPE3 (19 * sizeof(__le16)) 186 #define HEADER_TYPE4 (23 * sizeof(__le16)) 187 188 /* trackpad button data offsets */ 189 #define BUTTON_TYPE1 0 190 #define BUTTON_TYPE2 15 191 #define BUTTON_TYPE3 23 192 #define BUTTON_TYPE4 31 193 194 /* list of device capability bits */ 195 #define HAS_INTEGRATED_BUTTON 1 196 197 /* trackpad finger data block size */ 198 #define FSIZE_TYPE1 (14 * sizeof(__le16)) 199 #define FSIZE_TYPE2 (14 * sizeof(__le16)) 200 #define FSIZE_TYPE3 (14 * sizeof(__le16)) 201 #define FSIZE_TYPE4 (15 * sizeof(__le16)) 202 203 /* offset from header to finger struct */ 204 #define DELTA_TYPE1 (0 * sizeof(__le16)) 205 #define DELTA_TYPE2 (0 * sizeof(__le16)) 206 #define DELTA_TYPE3 (0 * sizeof(__le16)) 207 #define DELTA_TYPE4 (1 * sizeof(__le16)) 208 209 /* usb control message mode switch data */ 210 #define USBMSG_TYPE1 8, 0x300, 0, 0, 0x1, 0x8 211 #define USBMSG_TYPE2 8, 0x300, 0, 0, 0x1, 0x8 212 #define USBMSG_TYPE3 8, 0x300, 0, 0, 0x1, 0x8 213 #define USBMSG_TYPE4 2, 0x302, 2, 1, 0x1, 0x0 214 215 /* Wellspring initialization constants */ 216 #define BCM5974_WELLSPRING_MODE_READ_REQUEST_ID 1 217 #define BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID 9 218 219 /* trackpad finger structure, le16-aligned */ 220 struct tp_finger { 221 __le16 origin; /* zero when switching track finger */ 222 __le16 abs_x; /* absolute x coodinate */ 223 __le16 abs_y; /* absolute y coodinate */ 224 __le16 rel_x; /* relative x coodinate */ 225 __le16 rel_y; /* relative y coodinate */ 226 __le16 tool_major; /* tool area, major axis */ 227 __le16 tool_minor; /* tool area, minor axis */ 228 __le16 orientation; /* 16384 when point, else 15 bit angle */ 229 __le16 touch_major; /* touch area, major axis */ 230 __le16 touch_minor; /* touch area, minor axis */ 231 __le16 unused[2]; /* zeros */ 232 __le16 pressure; /* pressure on forcetouch touchpad */ 233 __le16 multi; /* one finger: varies, more fingers: constant */ 234 } __attribute__((packed,aligned(2))); 235 236 /* trackpad finger data size, empirically at least ten fingers */ 237 #define MAX_FINGERS 16 238 #define MAX_FINGER_ORIENTATION 16384 239 240 /* device-specific parameters */ 241 struct bcm5974_param { 242 int snratio; /* signal-to-noise ratio */ 243 int min; /* device minimum reading */ 244 int max; /* device maximum reading */ 245 }; 246 247 /* device-specific configuration */ 248 struct bcm5974_config { 249 int ansi, iso, jis; /* the product id of this device */ 250 int caps; /* device capability bitmask */ 251 int bt_ep; /* the endpoint of the button interface */ 252 int bt_datalen; /* data length of the button interface */ 253 int tp_ep; /* the endpoint of the trackpad interface */ 254 enum tp_type tp_type; /* type of trackpad interface */ 255 int tp_header; /* bytes in header block */ 256 int tp_datalen; /* data length of the trackpad interface */ 257 int tp_button; /* offset to button data */ 258 int tp_fsize; /* bytes in single finger block */ 259 int tp_delta; /* offset from header to finger struct */ 260 int um_size; /* usb control message length */ 261 int um_req_val; /* usb control message value */ 262 int um_req_idx; /* usb control message index */ 263 int um_switch_idx; /* usb control message mode switch index */ 264 int um_switch_on; /* usb control message mode switch on */ 265 int um_switch_off; /* usb control message mode switch off */ 266 struct bcm5974_param p; /* finger pressure limits */ 267 struct bcm5974_param w; /* finger width limits */ 268 struct bcm5974_param x; /* horizontal limits */ 269 struct bcm5974_param y; /* vertical limits */ 270 struct bcm5974_param o; /* orientation limits */ 271 }; 272 273 /* logical device structure */ 274 struct bcm5974 { 275 char phys[64]; 276 struct usb_device *udev; /* usb device */ 277 struct usb_interface *intf; /* our interface */ 278 struct input_dev *input; /* input dev */ 279 struct bcm5974_config cfg; /* device configuration */ 280 struct mutex pm_mutex; /* serialize access to open/suspend */ 281 int opened; /* 1: opened, 0: closed */ 282 struct urb *bt_urb; /* button usb request block */ 283 struct bt_data *bt_data; /* button transferred data */ 284 struct urb *tp_urb; /* trackpad usb request block */ 285 u8 *tp_data; /* trackpad transferred data */ 286 const struct tp_finger *index[MAX_FINGERS]; /* finger index data */ 287 struct input_mt_pos pos[MAX_FINGERS]; /* position array */ 288 int slots[MAX_FINGERS]; /* slot assignments */ 289 }; 290 291 /* trackpad finger block data, le16-aligned */ 292 static const struct tp_finger *get_tp_finger(const struct bcm5974 *dev, int i) 293 { 294 const struct bcm5974_config *c = &dev->cfg; 295 u8 *f_base = dev->tp_data + c->tp_header + c->tp_delta; 296 297 return (const struct tp_finger *)(f_base + i * c->tp_fsize); 298 } 299 300 #define DATAFORMAT(type) \ 301 type, \ 302 HEADER_##type, \ 303 HEADER_##type + (MAX_FINGERS) * (FSIZE_##type), \ 304 BUTTON_##type, \ 305 FSIZE_##type, \ 306 DELTA_##type, \ 307 USBMSG_##type 308 309 /* logical signal quality */ 310 #define SN_PRESSURE 45 /* pressure signal-to-noise ratio */ 311 #define SN_WIDTH 25 /* width signal-to-noise ratio */ 312 #define SN_COORD 250 /* coordinate signal-to-noise ratio */ 313 #define SN_ORIENT 10 /* orientation signal-to-noise ratio */ 314 315 /* device constants */ 316 static const struct bcm5974_config bcm5974_config_table[] = { 317 { 318 USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, 319 USB_DEVICE_ID_APPLE_WELLSPRING_ISO, 320 USB_DEVICE_ID_APPLE_WELLSPRING_JIS, 321 0, 322 0x84, sizeof(struct bt_data), 323 0x81, DATAFORMAT(TYPE1), 324 { SN_PRESSURE, 0, 256 }, 325 { SN_WIDTH, 0, 2048 }, 326 { SN_COORD, -4824, 5342 }, 327 { SN_COORD, -172, 5820 }, 328 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 329 }, 330 { 331 USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, 332 USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, 333 USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, 334 0, 335 0x84, sizeof(struct bt_data), 336 0x81, DATAFORMAT(TYPE1), 337 { SN_PRESSURE, 0, 256 }, 338 { SN_WIDTH, 0, 2048 }, 339 { SN_COORD, -4824, 4824 }, 340 { SN_COORD, -172, 4290 }, 341 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 342 }, 343 { 344 USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI, 345 USB_DEVICE_ID_APPLE_WELLSPRING3_ISO, 346 USB_DEVICE_ID_APPLE_WELLSPRING3_JIS, 347 HAS_INTEGRATED_BUTTON, 348 0x84, sizeof(struct bt_data), 349 0x81, DATAFORMAT(TYPE2), 350 { SN_PRESSURE, 0, 300 }, 351 { SN_WIDTH, 0, 2048 }, 352 { SN_COORD, -4460, 5166 }, 353 { SN_COORD, -75, 6700 }, 354 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 355 }, 356 { 357 USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI, 358 USB_DEVICE_ID_APPLE_WELLSPRING4_ISO, 359 USB_DEVICE_ID_APPLE_WELLSPRING4_JIS, 360 HAS_INTEGRATED_BUTTON, 361 0x84, sizeof(struct bt_data), 362 0x81, DATAFORMAT(TYPE2), 363 { SN_PRESSURE, 0, 300 }, 364 { SN_WIDTH, 0, 2048 }, 365 { SN_COORD, -4620, 5140 }, 366 { SN_COORD, -150, 6600 }, 367 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 368 }, 369 { 370 USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI, 371 USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO, 372 USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS, 373 HAS_INTEGRATED_BUTTON, 374 0x84, sizeof(struct bt_data), 375 0x81, DATAFORMAT(TYPE2), 376 { SN_PRESSURE, 0, 300 }, 377 { SN_WIDTH, 0, 2048 }, 378 { SN_COORD, -4616, 5112 }, 379 { SN_COORD, -142, 5234 }, 380 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 381 }, 382 { 383 USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI, 384 USB_DEVICE_ID_APPLE_WELLSPRING5_ISO, 385 USB_DEVICE_ID_APPLE_WELLSPRING5_JIS, 386 HAS_INTEGRATED_BUTTON, 387 0x84, sizeof(struct bt_data), 388 0x81, DATAFORMAT(TYPE2), 389 { SN_PRESSURE, 0, 300 }, 390 { SN_WIDTH, 0, 2048 }, 391 { SN_COORD, -4415, 5050 }, 392 { SN_COORD, -55, 6680 }, 393 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 394 }, 395 { 396 USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI, 397 USB_DEVICE_ID_APPLE_WELLSPRING6_ISO, 398 USB_DEVICE_ID_APPLE_WELLSPRING6_JIS, 399 HAS_INTEGRATED_BUTTON, 400 0x84, sizeof(struct bt_data), 401 0x81, DATAFORMAT(TYPE2), 402 { SN_PRESSURE, 0, 300 }, 403 { SN_WIDTH, 0, 2048 }, 404 { SN_COORD, -4620, 5140 }, 405 { SN_COORD, -150, 6600 }, 406 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 407 }, 408 { 409 USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI, 410 USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO, 411 USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS, 412 HAS_INTEGRATED_BUTTON, 413 0x84, sizeof(struct bt_data), 414 0x81, DATAFORMAT(TYPE2), 415 { SN_PRESSURE, 0, 300 }, 416 { SN_WIDTH, 0, 2048 }, 417 { SN_COORD, -4750, 5280 }, 418 { SN_COORD, -150, 6730 }, 419 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 420 }, 421 { 422 USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI, 423 USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO, 424 USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS, 425 HAS_INTEGRATED_BUTTON, 426 0x84, sizeof(struct bt_data), 427 0x81, DATAFORMAT(TYPE2), 428 { SN_PRESSURE, 0, 300 }, 429 { SN_WIDTH, 0, 2048 }, 430 { SN_COORD, -4620, 5140 }, 431 { SN_COORD, -150, 6600 }, 432 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 433 }, 434 { 435 USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI, 436 USB_DEVICE_ID_APPLE_WELLSPRING7_ISO, 437 USB_DEVICE_ID_APPLE_WELLSPRING7_JIS, 438 HAS_INTEGRATED_BUTTON, 439 0x84, sizeof(struct bt_data), 440 0x81, DATAFORMAT(TYPE2), 441 { SN_PRESSURE, 0, 300 }, 442 { SN_WIDTH, 0, 2048 }, 443 { SN_COORD, -4750, 5280 }, 444 { SN_COORD, -150, 6730 }, 445 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 446 }, 447 { 448 USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI, 449 USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO, 450 USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS, 451 HAS_INTEGRATED_BUTTON, 452 0x84, sizeof(struct bt_data), 453 0x81, DATAFORMAT(TYPE2), 454 { SN_PRESSURE, 0, 300 }, 455 { SN_WIDTH, 0, 2048 }, 456 { SN_COORD, -4750, 5280 }, 457 { SN_COORD, -150, 6730 }, 458 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 459 }, 460 { 461 USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI, 462 USB_DEVICE_ID_APPLE_WELLSPRING8_ISO, 463 USB_DEVICE_ID_APPLE_WELLSPRING8_JIS, 464 HAS_INTEGRATED_BUTTON, 465 0, sizeof(struct bt_data), 466 0x83, DATAFORMAT(TYPE3), 467 { SN_PRESSURE, 0, 300 }, 468 { SN_WIDTH, 0, 2048 }, 469 { SN_COORD, -4620, 5140 }, 470 { SN_COORD, -150, 6600 }, 471 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 472 }, 473 { 474 USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI, 475 USB_DEVICE_ID_APPLE_WELLSPRING9_ISO, 476 USB_DEVICE_ID_APPLE_WELLSPRING9_JIS, 477 HAS_INTEGRATED_BUTTON, 478 0, sizeof(struct bt_data), 479 0x83, DATAFORMAT(TYPE4), 480 { SN_PRESSURE, 0, 300 }, 481 { SN_WIDTH, 0, 2048 }, 482 { SN_COORD, -4828, 5345 }, 483 { SN_COORD, -203, 6803 }, 484 { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } 485 }, 486 {} 487 }; 488 489 /* return the device-specific configuration by device */ 490 static const struct bcm5974_config *bcm5974_get_config(struct usb_device *udev) 491 { 492 u16 id = le16_to_cpu(udev->descriptor.idProduct); 493 const struct bcm5974_config *cfg; 494 495 for (cfg = bcm5974_config_table; cfg->ansi; ++cfg) 496 if (cfg->ansi == id || cfg->iso == id || cfg->jis == id) 497 return cfg; 498 499 return bcm5974_config_table; 500 } 501 502 /* convert 16-bit little endian to signed integer */ 503 static inline int raw2int(__le16 x) 504 { 505 return (signed short)le16_to_cpu(x); 506 } 507 508 static void set_abs(struct input_dev *input, unsigned int code, 509 const struct bcm5974_param *p) 510 { 511 int fuzz = p->snratio ? (p->max - p->min) / p->snratio : 0; 512 input_set_abs_params(input, code, p->min, p->max, fuzz, 0); 513 } 514 515 /* setup which logical events to report */ 516 static void setup_events_to_report(struct input_dev *input_dev, 517 const struct bcm5974_config *cfg) 518 { 519 __set_bit(EV_ABS, input_dev->evbit); 520 521 /* for synaptics only */ 522 input_set_abs_params(input_dev, ABS_PRESSURE, 0, 256, 5, 0); 523 input_set_abs_params(input_dev, ABS_TOOL_WIDTH, 0, 16, 0, 0); 524 525 /* finger touch area */ 526 set_abs(input_dev, ABS_MT_TOUCH_MAJOR, &cfg->w); 527 set_abs(input_dev, ABS_MT_TOUCH_MINOR, &cfg->w); 528 /* finger approach area */ 529 set_abs(input_dev, ABS_MT_WIDTH_MAJOR, &cfg->w); 530 set_abs(input_dev, ABS_MT_WIDTH_MINOR, &cfg->w); 531 /* finger orientation */ 532 set_abs(input_dev, ABS_MT_ORIENTATION, &cfg->o); 533 /* finger position */ 534 set_abs(input_dev, ABS_MT_POSITION_X, &cfg->x); 535 set_abs(input_dev, ABS_MT_POSITION_Y, &cfg->y); 536 537 __set_bit(EV_KEY, input_dev->evbit); 538 __set_bit(BTN_LEFT, input_dev->keybit); 539 540 if (cfg->caps & HAS_INTEGRATED_BUTTON) 541 __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); 542 543 input_mt_init_slots(input_dev, MAX_FINGERS, 544 INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK); 545 } 546 547 /* report button data as logical button state */ 548 static int report_bt_state(struct bcm5974 *dev, int size) 549 { 550 if (size != sizeof(struct bt_data)) 551 return -EIO; 552 553 dprintk(7, 554 "bcm5974: button data: %x %x %x %x\n", 555 dev->bt_data->unknown1, dev->bt_data->button, 556 dev->bt_data->rel_x, dev->bt_data->rel_y); 557 558 input_report_key(dev->input, BTN_LEFT, dev->bt_data->button); 559 input_sync(dev->input); 560 561 return 0; 562 } 563 564 static void report_finger_data(struct input_dev *input, int slot, 565 const struct input_mt_pos *pos, 566 const struct tp_finger *f) 567 { 568 input_mt_slot(input, slot); 569 input_mt_report_slot_state(input, MT_TOOL_FINGER, true); 570 571 input_report_abs(input, ABS_MT_TOUCH_MAJOR, 572 raw2int(f->touch_major) << 1); 573 input_report_abs(input, ABS_MT_TOUCH_MINOR, 574 raw2int(f->touch_minor) << 1); 575 input_report_abs(input, ABS_MT_WIDTH_MAJOR, 576 raw2int(f->tool_major) << 1); 577 input_report_abs(input, ABS_MT_WIDTH_MINOR, 578 raw2int(f->tool_minor) << 1); 579 input_report_abs(input, ABS_MT_ORIENTATION, 580 MAX_FINGER_ORIENTATION - raw2int(f->orientation)); 581 input_report_abs(input, ABS_MT_POSITION_X, pos->x); 582 input_report_abs(input, ABS_MT_POSITION_Y, pos->y); 583 } 584 585 static void report_synaptics_data(struct input_dev *input, 586 const struct bcm5974_config *cfg, 587 const struct tp_finger *f, int raw_n) 588 { 589 int abs_p = 0, abs_w = 0; 590 591 if (raw_n) { 592 int p = raw2int(f->touch_major); 593 int w = raw2int(f->tool_major); 594 if (p > 0 && raw2int(f->origin)) { 595 abs_p = clamp_val(256 * p / cfg->p.max, 0, 255); 596 abs_w = clamp_val(16 * w / cfg->w.max, 0, 15); 597 } 598 } 599 600 input_report_abs(input, ABS_PRESSURE, abs_p); 601 input_report_abs(input, ABS_TOOL_WIDTH, abs_w); 602 } 603 604 /* report trackpad data as logical trackpad state */ 605 static int report_tp_state(struct bcm5974 *dev, int size) 606 { 607 const struct bcm5974_config *c = &dev->cfg; 608 const struct tp_finger *f; 609 struct input_dev *input = dev->input; 610 int raw_n, i, n = 0; 611 612 if (size < c->tp_header || (size - c->tp_header) % c->tp_fsize != 0) 613 return -EIO; 614 615 raw_n = (size - c->tp_header) / c->tp_fsize; 616 617 for (i = 0; i < raw_n; i++) { 618 f = get_tp_finger(dev, i); 619 if (raw2int(f->touch_major) == 0) 620 continue; 621 dev->pos[n].x = raw2int(f->abs_x); 622 dev->pos[n].y = c->y.min + c->y.max - raw2int(f->abs_y); 623 dev->index[n++] = f; 624 } 625 626 input_mt_assign_slots(input, dev->slots, dev->pos, n, 0); 627 628 for (i = 0; i < n; i++) 629 report_finger_data(input, dev->slots[i], 630 &dev->pos[i], dev->index[i]); 631 632 input_mt_sync_frame(input); 633 634 report_synaptics_data(input, c, get_tp_finger(dev, 0), raw_n); 635 636 /* later types report button events via integrated button only */ 637 if (c->caps & HAS_INTEGRATED_BUTTON) { 638 int ibt = raw2int(dev->tp_data[c->tp_button]); 639 input_report_key(input, BTN_LEFT, ibt); 640 } 641 642 input_sync(input); 643 644 return 0; 645 } 646 647 static int bcm5974_wellspring_mode(struct bcm5974 *dev, bool on) 648 { 649 const struct bcm5974_config *c = &dev->cfg; 650 int retval = 0, size; 651 char *data; 652 653 /* Type 3 does not require a mode switch */ 654 if (c->tp_type == TYPE3) 655 return 0; 656 657 data = kmalloc(c->um_size, GFP_KERNEL); 658 if (!data) { 659 dev_err(&dev->intf->dev, "out of memory\n"); 660 retval = -ENOMEM; 661 goto out; 662 } 663 664 /* read configuration */ 665 size = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), 666 BCM5974_WELLSPRING_MODE_READ_REQUEST_ID, 667 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 668 c->um_req_val, c->um_req_idx, data, c->um_size, 5000); 669 670 if (size != c->um_size) { 671 dev_err(&dev->intf->dev, "could not read from device\n"); 672 retval = -EIO; 673 goto out; 674 } 675 676 /* apply the mode switch */ 677 data[c->um_switch_idx] = on ? c->um_switch_on : c->um_switch_off; 678 679 /* write configuration */ 680 size = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), 681 BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID, 682 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 683 c->um_req_val, c->um_req_idx, data, c->um_size, 5000); 684 685 if (size != c->um_size) { 686 dev_err(&dev->intf->dev, "could not write to device\n"); 687 retval = -EIO; 688 goto out; 689 } 690 691 dprintk(2, "bcm5974: switched to %s mode.\n", 692 on ? "wellspring" : "normal"); 693 694 out: 695 kfree(data); 696 return retval; 697 } 698 699 static void bcm5974_irq_button(struct urb *urb) 700 { 701 struct bcm5974 *dev = urb->context; 702 struct usb_interface *intf = dev->intf; 703 int error; 704 705 switch (urb->status) { 706 case 0: 707 break; 708 case -EOVERFLOW: 709 case -ECONNRESET: 710 case -ENOENT: 711 case -ESHUTDOWN: 712 dev_dbg(&intf->dev, "button urb shutting down: %d\n", 713 urb->status); 714 return; 715 default: 716 dev_dbg(&intf->dev, "button urb status: %d\n", urb->status); 717 goto exit; 718 } 719 720 if (report_bt_state(dev, dev->bt_urb->actual_length)) 721 dprintk(1, "bcm5974: bad button package, length: %d\n", 722 dev->bt_urb->actual_length); 723 724 exit: 725 error = usb_submit_urb(dev->bt_urb, GFP_ATOMIC); 726 if (error) 727 dev_err(&intf->dev, "button urb failed: %d\n", error); 728 } 729 730 static void bcm5974_irq_trackpad(struct urb *urb) 731 { 732 struct bcm5974 *dev = urb->context; 733 struct usb_interface *intf = dev->intf; 734 int error; 735 736 switch (urb->status) { 737 case 0: 738 break; 739 case -EOVERFLOW: 740 case -ECONNRESET: 741 case -ENOENT: 742 case -ESHUTDOWN: 743 dev_dbg(&intf->dev, "trackpad urb shutting down: %d\n", 744 urb->status); 745 return; 746 default: 747 dev_dbg(&intf->dev, "trackpad urb status: %d\n", urb->status); 748 goto exit; 749 } 750 751 /* control response ignored */ 752 if (dev->tp_urb->actual_length == 2) 753 goto exit; 754 755 if (report_tp_state(dev, dev->tp_urb->actual_length)) 756 dprintk(1, "bcm5974: bad trackpad package, length: %d\n", 757 dev->tp_urb->actual_length); 758 759 exit: 760 error = usb_submit_urb(dev->tp_urb, GFP_ATOMIC); 761 if (error) 762 dev_err(&intf->dev, "trackpad urb failed: %d\n", error); 763 } 764 765 /* 766 * The Wellspring trackpad, like many recent Apple trackpads, share 767 * the usb device with the keyboard. Since keyboards are usually 768 * handled by the HID system, the device ends up being handled by two 769 * modules. Setting up the device therefore becomes slightly 770 * complicated. To enable multitouch features, a mode switch is 771 * required, which is usually applied via the control interface of the 772 * device. It can be argued where this switch should take place. In 773 * some drivers, like appletouch, the switch is made during 774 * probe. However, the hid module may also alter the state of the 775 * device, resulting in trackpad malfunction under certain 776 * circumstances. To get around this problem, there is at least one 777 * example that utilizes the USB_QUIRK_RESET_RESUME quirk in order to 778 * receive a reset_resume request rather than the normal resume. 779 * Since the implementation of reset_resume is equal to mode switch 780 * plus start_traffic, it seems easier to always do the switch when 781 * starting traffic on the device. 782 */ 783 static int bcm5974_start_traffic(struct bcm5974 *dev) 784 { 785 int error; 786 787 error = bcm5974_wellspring_mode(dev, true); 788 if (error) { 789 dprintk(1, "bcm5974: mode switch failed\n"); 790 goto err_out; 791 } 792 793 if (dev->bt_urb) { 794 error = usb_submit_urb(dev->bt_urb, GFP_KERNEL); 795 if (error) 796 goto err_reset_mode; 797 } 798 799 error = usb_submit_urb(dev->tp_urb, GFP_KERNEL); 800 if (error) 801 goto err_kill_bt; 802 803 return 0; 804 805 err_kill_bt: 806 usb_kill_urb(dev->bt_urb); 807 err_reset_mode: 808 bcm5974_wellspring_mode(dev, false); 809 err_out: 810 return error; 811 } 812 813 static void bcm5974_pause_traffic(struct bcm5974 *dev) 814 { 815 usb_kill_urb(dev->tp_urb); 816 usb_kill_urb(dev->bt_urb); 817 bcm5974_wellspring_mode(dev, false); 818 } 819 820 /* 821 * The code below implements open/close and manual suspend/resume. 822 * All functions may be called in random order. 823 * 824 * Opening a suspended device fails with EACCES - permission denied. 825 * 826 * Failing a resume leaves the device resumed but closed. 827 */ 828 static int bcm5974_open(struct input_dev *input) 829 { 830 struct bcm5974 *dev = input_get_drvdata(input); 831 int error; 832 833 error = usb_autopm_get_interface(dev->intf); 834 if (error) 835 return error; 836 837 scoped_guard(mutex, &dev->pm_mutex) { 838 error = bcm5974_start_traffic(dev); 839 if (!error) 840 dev->opened = 1; 841 } 842 843 if (error) 844 usb_autopm_put_interface(dev->intf); 845 846 return error; 847 } 848 849 static void bcm5974_close(struct input_dev *input) 850 { 851 struct bcm5974 *dev = input_get_drvdata(input); 852 853 scoped_guard(mutex, &dev->pm_mutex) { 854 bcm5974_pause_traffic(dev); 855 dev->opened = 0; 856 } 857 858 usb_autopm_put_interface(dev->intf); 859 } 860 861 static int bcm5974_suspend(struct usb_interface *iface, pm_message_t message) 862 { 863 struct bcm5974 *dev = usb_get_intfdata(iface); 864 865 guard(mutex)(&dev->pm_mutex); 866 867 if (dev->opened) 868 bcm5974_pause_traffic(dev); 869 870 return 0; 871 } 872 873 static int bcm5974_resume(struct usb_interface *iface) 874 { 875 struct bcm5974 *dev = usb_get_intfdata(iface); 876 877 guard(mutex)(&dev->pm_mutex); 878 879 if (dev->opened) 880 return bcm5974_start_traffic(dev); 881 882 return 0; 883 } 884 885 static int bcm5974_probe(struct usb_interface *iface, 886 const struct usb_device_id *id) 887 { 888 struct usb_device *udev = interface_to_usbdev(iface); 889 const struct bcm5974_config *cfg; 890 struct bcm5974 *dev; 891 struct input_dev *input_dev; 892 int error = -ENOMEM; 893 894 /* find the product index */ 895 cfg = bcm5974_get_config(udev); 896 897 /* allocate memory for our device state and initialize it */ 898 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 899 input_dev = input_allocate_device(); 900 if (!dev || !input_dev) { 901 dev_err(&iface->dev, "out of memory\n"); 902 goto err_free_devs; 903 } 904 905 dev->udev = udev; 906 dev->intf = iface; 907 dev->input = input_dev; 908 dev->cfg = *cfg; 909 mutex_init(&dev->pm_mutex); 910 911 /* setup urbs */ 912 if (cfg->tp_type == TYPE1) { 913 dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL); 914 if (!dev->bt_urb) 915 goto err_free_devs; 916 } 917 918 dev->tp_urb = usb_alloc_urb(0, GFP_KERNEL); 919 if (!dev->tp_urb) 920 goto err_free_bt_urb; 921 922 if (dev->bt_urb) { 923 dev->bt_data = usb_alloc_coherent(dev->udev, 924 dev->cfg.bt_datalen, GFP_KERNEL, 925 &dev->bt_urb->transfer_dma); 926 if (!dev->bt_data) 927 goto err_free_urb; 928 } 929 930 dev->tp_data = usb_alloc_coherent(dev->udev, 931 dev->cfg.tp_datalen, GFP_KERNEL, 932 &dev->tp_urb->transfer_dma); 933 if (!dev->tp_data) 934 goto err_free_bt_buffer; 935 936 if (dev->bt_urb) { 937 usb_fill_int_urb(dev->bt_urb, udev, 938 usb_rcvintpipe(udev, cfg->bt_ep), 939 dev->bt_data, dev->cfg.bt_datalen, 940 bcm5974_irq_button, dev, 1); 941 942 dev->bt_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 943 } 944 945 usb_fill_int_urb(dev->tp_urb, udev, 946 usb_rcvintpipe(udev, cfg->tp_ep), 947 dev->tp_data, dev->cfg.tp_datalen, 948 bcm5974_irq_trackpad, dev, 1); 949 950 dev->tp_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 951 952 /* create bcm5974 device */ 953 usb_make_path(udev, dev->phys, sizeof(dev->phys)); 954 strlcat(dev->phys, "/input0", sizeof(dev->phys)); 955 956 input_dev->name = "bcm5974"; 957 input_dev->phys = dev->phys; 958 usb_to_input_id(dev->udev, &input_dev->id); 959 /* report driver capabilities via the version field */ 960 input_dev->id.version = cfg->caps; 961 input_dev->dev.parent = &iface->dev; 962 963 input_set_drvdata(input_dev, dev); 964 965 input_dev->open = bcm5974_open; 966 input_dev->close = bcm5974_close; 967 968 setup_events_to_report(input_dev, cfg); 969 970 error = input_register_device(dev->input); 971 if (error) 972 goto err_free_buffer; 973 974 /* save our data pointer in this interface device */ 975 usb_set_intfdata(iface, dev); 976 977 return 0; 978 979 err_free_buffer: 980 usb_free_coherent(dev->udev, dev->cfg.tp_datalen, 981 dev->tp_data, dev->tp_urb->transfer_dma); 982 err_free_bt_buffer: 983 if (dev->bt_urb) 984 usb_free_coherent(dev->udev, dev->cfg.bt_datalen, 985 dev->bt_data, dev->bt_urb->transfer_dma); 986 err_free_urb: 987 usb_free_urb(dev->tp_urb); 988 err_free_bt_urb: 989 usb_free_urb(dev->bt_urb); 990 err_free_devs: 991 usb_set_intfdata(iface, NULL); 992 input_free_device(input_dev); 993 kfree(dev); 994 return error; 995 } 996 997 static void bcm5974_disconnect(struct usb_interface *iface) 998 { 999 struct bcm5974 *dev = usb_get_intfdata(iface); 1000 1001 usb_set_intfdata(iface, NULL); 1002 1003 input_unregister_device(dev->input); 1004 usb_free_coherent(dev->udev, dev->cfg.tp_datalen, 1005 dev->tp_data, dev->tp_urb->transfer_dma); 1006 if (dev->bt_urb) 1007 usb_free_coherent(dev->udev, dev->cfg.bt_datalen, 1008 dev->bt_data, dev->bt_urb->transfer_dma); 1009 usb_free_urb(dev->tp_urb); 1010 usb_free_urb(dev->bt_urb); 1011 kfree(dev); 1012 } 1013 1014 static struct usb_driver bcm5974_driver = { 1015 .name = "bcm5974", 1016 .probe = bcm5974_probe, 1017 .disconnect = bcm5974_disconnect, 1018 .suspend = bcm5974_suspend, 1019 .resume = bcm5974_resume, 1020 .id_table = bcm5974_table, 1021 .supports_autosuspend = 1, 1022 }; 1023 1024 module_usb_driver(bcm5974_driver); 1025