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

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull input fixes from Dmitry Torokhov:
"The main item is that we try to better handle the newer trackpoints on
Lenovo devices that are now being produced by Elan/ALPS/NXP and only
implement a small subset of the original IBM trackpoint controls"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
Revert "Input: synaptics_rmi4 - use devm_device_add_group() for attributes in F01"
Input: trackpoint - only expose supported controls for Elan, ALPS and NXP
Input: trackpoint - force 3 buttons if 0 button is reported
Input: xpad - add support for PDP Xbox One controllers
Input: stmfts,s6sy671 - add SPDX identifier

+210 -130
+19
drivers/input/joystick/xpad.c
··· 229 229 { 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, 230 230 { 0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, 231 231 { 0x0e6f, 0x0246, "Rock Candy Gamepad for Xbox One 2015", 0, XTYPE_XBOXONE }, 232 + { 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE }, 232 233 { 0x0e6f, 0x0301, "Logic3 Controller", 0, XTYPE_XBOX360 }, 233 234 { 0x0e6f, 0x0346, "Rock Candy Gamepad for Xbox One 2016", 0, XTYPE_XBOXONE }, 234 235 { 0x0e6f, 0x0401, "Logic3 Controller", 0, XTYPE_XBOX360 }, ··· 477 476 }; 478 477 479 478 /* 479 + * This packet is required for some of the PDP pads to start 480 + * sending input reports. One of those pads is (0x0e6f:0x02ab). 481 + */ 482 + static const u8 xboxone_pdp_init1[] = { 483 + 0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14 484 + }; 485 + 486 + /* 487 + * This packet is required for some of the PDP pads to start 488 + * sending input reports. One of those pads is (0x0e6f:0x02ab). 489 + */ 490 + static const u8 xboxone_pdp_init2[] = { 491 + 0x06, 0x20, 0x00, 0x02, 0x01, 0x00 492 + }; 493 + 494 + /* 480 495 * A specific rumble packet is required for some PowerA pads to start 481 496 * sending input reports. One of those pads is (0x24c6:0x543a). 482 497 */ ··· 522 505 XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init), 523 506 XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init), 524 507 XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init), 508 + XBOXONE_INIT_PKT(0x0e6f, 0x02ab, xboxone_pdp_init1), 509 + XBOXONE_INIT_PKT(0x0e6f, 0x02ab, xboxone_pdp_init2), 525 510 XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init), 526 511 XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init), 527 512 XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
+151 -94
drivers/input/mouse/trackpoint.c
··· 19 19 #include "psmouse.h" 20 20 #include "trackpoint.h" 21 21 22 + static const char * const trackpoint_variants[] = { 23 + [TP_VARIANT_IBM] = "IBM", 24 + [TP_VARIANT_ALPS] = "ALPS", 25 + [TP_VARIANT_ELAN] = "Elan", 26 + [TP_VARIANT_NXP] = "NXP", 27 + }; 28 + 22 29 /* 23 30 * Power-on Reset: Resets all trackpoint parameters, including RAM values, 24 31 * to defaults. ··· 33 26 */ 34 27 static int trackpoint_power_on_reset(struct ps2dev *ps2dev) 35 28 { 36 - unsigned char results[2]; 29 + u8 results[2]; 37 30 int tries = 0; 38 31 39 32 /* Issue POR command, and repeat up to once if 0xFC00 received */ ··· 45 38 46 39 /* Check for success response -- 0xAA00 */ 47 40 if (results[0] != 0xAA || results[1] != 0x00) 48 - return -1; 41 + return -ENODEV; 49 42 50 43 return 0; 51 44 } ··· 53 46 /* 54 47 * Device IO: read, write and toggle bit 55 48 */ 56 - static int trackpoint_read(struct ps2dev *ps2dev, 57 - unsigned char loc, unsigned char *results) 49 + static int trackpoint_read(struct ps2dev *ps2dev, u8 loc, u8 *results) 58 50 { 59 51 if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || 60 52 ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 1, loc))) { ··· 63 57 return 0; 64 58 } 65 59 66 - static int trackpoint_write(struct ps2dev *ps2dev, 67 - unsigned char loc, unsigned char val) 60 + static int trackpoint_write(struct ps2dev *ps2dev, u8 loc, u8 val) 68 61 { 69 62 if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || 70 63 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_WRITE_MEM)) || ··· 75 70 return 0; 76 71 } 77 72 78 - static int trackpoint_toggle_bit(struct ps2dev *ps2dev, 79 - unsigned char loc, unsigned char mask) 73 + static int trackpoint_toggle_bit(struct ps2dev *ps2dev, u8 loc, u8 mask) 80 74 { 81 75 /* Bad things will happen if the loc param isn't in this range */ 82 76 if (loc < 0x20 || loc >= 0x2F) ··· 91 87 return 0; 92 88 } 93 89 94 - static int trackpoint_update_bit(struct ps2dev *ps2dev, unsigned char loc, 95 - unsigned char mask, unsigned char value) 90 + static int trackpoint_update_bit(struct ps2dev *ps2dev, 91 + u8 loc, u8 mask, u8 value) 96 92 { 97 93 int retval = 0; 98 - unsigned char data; 94 + u8 data; 99 95 100 96 trackpoint_read(ps2dev, loc, &data); 101 97 if (((data & mask) == mask) != !!value) ··· 109 105 */ 110 106 struct trackpoint_attr_data { 111 107 size_t field_offset; 112 - unsigned char command; 113 - unsigned char mask; 114 - unsigned char inverted; 115 - unsigned char power_on_default; 108 + u8 command; 109 + u8 mask; 110 + bool inverted; 111 + u8 power_on_default; 116 112 }; 117 113 118 - static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, void *data, char *buf) 114 + static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, 115 + void *data, char *buf) 119 116 { 120 117 struct trackpoint_data *tp = psmouse->private; 121 118 struct trackpoint_attr_data *attr = data; 122 - unsigned char value = *(unsigned char *)((char *)tp + attr->field_offset); 119 + u8 value = *(u8 *)((void *)tp + attr->field_offset); 123 120 124 121 if (attr->inverted) 125 122 value = !value; ··· 133 128 { 134 129 struct trackpoint_data *tp = psmouse->private; 135 130 struct trackpoint_attr_data *attr = data; 136 - unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); 137 - unsigned char value; 131 + u8 *field = (void *)tp + attr->field_offset; 132 + u8 value; 138 133 int err; 139 134 140 135 err = kstrtou8(buf, 10, &value); ··· 162 157 { 163 158 struct trackpoint_data *tp = psmouse->private; 164 159 struct trackpoint_attr_data *attr = data; 165 - unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); 166 - unsigned int value; 160 + bool *field = (void *)tp + attr->field_offset; 161 + bool value; 167 162 int err; 168 163 169 - err = kstrtouint(buf, 10, &value); 164 + err = kstrtobool(buf, &value); 170 165 if (err) 171 166 return err; 172 - 173 - if (value > 1) 174 - return -EINVAL; 175 167 176 168 if (attr->inverted) 177 169 value = !value; ··· 195 193 &trackpoint_attr_##_name, \ 196 194 trackpoint_show_int_attr, trackpoint_set_bit_attr) 197 195 198 - #define TRACKPOINT_UPDATE_BIT(_psmouse, _tp, _name) \ 199 - do { \ 200 - struct trackpoint_attr_data *_attr = &trackpoint_attr_##_name; \ 201 - \ 202 - trackpoint_update_bit(&_psmouse->ps2dev, \ 203 - _attr->command, _attr->mask, _tp->_name); \ 204 - } while (0) 205 - 206 - #define TRACKPOINT_UPDATE(_power_on, _psmouse, _tp, _name) \ 207 - do { \ 208 - if (!_power_on || \ 209 - _tp->_name != trackpoint_attr_##_name.power_on_default) { \ 210 - if (!trackpoint_attr_##_name.mask) \ 211 - trackpoint_write(&_psmouse->ps2dev, \ 212 - trackpoint_attr_##_name.command, \ 213 - _tp->_name); \ 214 - else \ 215 - TRACKPOINT_UPDATE_BIT(_psmouse, _tp, _name); \ 216 - } \ 217 - } while (0) 218 - 219 - #define TRACKPOINT_SET_POWER_ON_DEFAULT(_tp, _name) \ 220 - (_tp->_name = trackpoint_attr_##_name.power_on_default) 221 - 222 196 TRACKPOINT_INT_ATTR(sensitivity, TP_SENS, TP_DEF_SENS); 223 197 TRACKPOINT_INT_ATTR(speed, TP_SPEED, TP_DEF_SPEED); 224 198 TRACKPOINT_INT_ATTR(inertia, TP_INERTIA, TP_DEF_INERTIA); ··· 207 229 TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV, TP_DEF_JENKS_CURV); 208 230 TRACKPOINT_INT_ATTR(drift_time, TP_DRIFT_TIME, TP_DEF_DRIFT_TIME); 209 231 210 - TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON, 0, 232 + TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON, false, 211 233 TP_DEF_PTSON); 212 - TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK, 0, 234 + TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK, false, 213 235 TP_DEF_SKIPBACK); 214 - TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV, 1, 236 + TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV, true, 215 237 TP_DEF_EXT_DEV); 238 + 239 + static bool trackpoint_is_attr_available(struct psmouse *psmouse, 240 + struct attribute *attr) 241 + { 242 + struct trackpoint_data *tp = psmouse->private; 243 + 244 + return tp->variant_id == TP_VARIANT_IBM || 245 + attr == &psmouse_attr_sensitivity.dattr.attr || 246 + attr == &psmouse_attr_press_to_select.dattr.attr; 247 + } 248 + 249 + static umode_t trackpoint_is_attr_visible(struct kobject *kobj, 250 + struct attribute *attr, int n) 251 + { 252 + struct device *dev = container_of(kobj, struct device, kobj); 253 + struct serio *serio = to_serio_port(dev); 254 + struct psmouse *psmouse = serio_get_drvdata(serio); 255 + 256 + return trackpoint_is_attr_available(psmouse, attr) ? attr->mode : 0; 257 + } 216 258 217 259 static struct attribute *trackpoint_attrs[] = { 218 260 &psmouse_attr_sensitivity.dattr.attr, ··· 253 255 }; 254 256 255 257 static struct attribute_group trackpoint_attr_group = { 256 - .attrs = trackpoint_attrs, 258 + .is_visible = trackpoint_is_attr_visible, 259 + .attrs = trackpoint_attrs, 257 260 }; 258 261 259 - static int trackpoint_start_protocol(struct psmouse *psmouse, unsigned char *firmware_id) 262 + #define TRACKPOINT_UPDATE(_power_on, _psmouse, _tp, _name) \ 263 + do { \ 264 + struct trackpoint_attr_data *_attr = &trackpoint_attr_##_name; \ 265 + \ 266 + if ((!_power_on || _tp->_name != _attr->power_on_default) && \ 267 + trackpoint_is_attr_available(_psmouse, \ 268 + &psmouse_attr_##_name.dattr.attr)) { \ 269 + if (!_attr->mask) \ 270 + trackpoint_write(&_psmouse->ps2dev, \ 271 + _attr->command, _tp->_name); \ 272 + else \ 273 + trackpoint_update_bit(&_psmouse->ps2dev, \ 274 + _attr->command, _attr->mask, \ 275 + _tp->_name); \ 276 + } \ 277 + } while (0) 278 + 279 + #define TRACKPOINT_SET_POWER_ON_DEFAULT(_tp, _name) \ 280 + do { \ 281 + _tp->_name = trackpoint_attr_##_name.power_on_default; \ 282 + } while (0) 283 + 284 + static int trackpoint_start_protocol(struct psmouse *psmouse, 285 + u8 *variant_id, u8 *firmware_id) 260 286 { 261 - unsigned char param[2] = { 0 }; 287 + u8 param[2] = { 0 }; 288 + int error; 262 289 263 - if (ps2_command(&psmouse->ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) 264 - return -1; 290 + error = ps2_command(&psmouse->ps2dev, 291 + param, MAKE_PS2_CMD(0, 2, TP_READ_ID)); 292 + if (error) 293 + return error; 265 294 266 - /* add new TP ID. */ 267 - if (!(param[0] & TP_MAGIC_IDENT)) 268 - return -1; 295 + switch (param[0]) { 296 + case TP_VARIANT_IBM: 297 + case TP_VARIANT_ALPS: 298 + case TP_VARIANT_ELAN: 299 + case TP_VARIANT_NXP: 300 + if (variant_id) 301 + *variant_id = param[0]; 302 + if (firmware_id) 303 + *firmware_id = param[1]; 304 + return 0; 305 + } 269 306 270 - if (firmware_id) 271 - *firmware_id = param[1]; 272 - 273 - return 0; 307 + return -ENODEV; 274 308 } 275 309 276 310 /* ··· 315 285 { 316 286 struct trackpoint_data *tp = psmouse->private; 317 287 318 - if (!in_power_on_state) { 288 + if (!in_power_on_state && tp->variant_id == TP_VARIANT_IBM) { 319 289 /* 320 290 * Disable features that may make device unusable 321 291 * with this driver. ··· 377 347 378 348 static void trackpoint_disconnect(struct psmouse *psmouse) 379 349 { 380 - sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group); 350 + device_remove_group(&psmouse->ps2dev.serio->dev, 351 + &trackpoint_attr_group); 381 352 382 353 kfree(psmouse->private); 383 354 psmouse->private = NULL; ··· 386 355 387 356 static int trackpoint_reconnect(struct psmouse *psmouse) 388 357 { 389 - int reset_fail; 358 + struct trackpoint_data *tp = psmouse->private; 359 + int error; 360 + bool was_reset; 390 361 391 - if (trackpoint_start_protocol(psmouse, NULL)) 392 - return -1; 362 + error = trackpoint_start_protocol(psmouse, NULL, NULL); 363 + if (error) 364 + return error; 393 365 394 - reset_fail = trackpoint_power_on_reset(&psmouse->ps2dev); 395 - if (trackpoint_sync(psmouse, !reset_fail)) 396 - return -1; 366 + was_reset = tp->variant_id == TP_VARIANT_IBM && 367 + trackpoint_power_on_reset(&psmouse->ps2dev) == 0; 368 + 369 + error = trackpoint_sync(psmouse, was_reset); 370 + if (error) 371 + return error; 397 372 398 373 return 0; 399 374 } ··· 407 370 int trackpoint_detect(struct psmouse *psmouse, bool set_properties) 408 371 { 409 372 struct ps2dev *ps2dev = &psmouse->ps2dev; 410 - unsigned char firmware_id; 411 - unsigned char button_info; 373 + struct trackpoint_data *tp; 374 + u8 variant_id; 375 + u8 firmware_id; 376 + u8 button_info; 412 377 int error; 413 378 414 - if (trackpoint_start_protocol(psmouse, &firmware_id)) 415 - return -1; 379 + error = trackpoint_start_protocol(psmouse, &variant_id, &firmware_id); 380 + if (error) 381 + return error; 416 382 417 383 if (!set_properties) 418 384 return 0; 419 385 420 - if (trackpoint_read(ps2dev, TP_EXT_BTN, &button_info)) { 421 - psmouse_warn(psmouse, "failed to get extended button data, assuming 3 buttons\n"); 422 - button_info = 0x33; 423 - } 424 - 425 - psmouse->private = kzalloc(sizeof(struct trackpoint_data), GFP_KERNEL); 426 - if (!psmouse->private) 386 + tp = kzalloc(sizeof(*tp), GFP_KERNEL); 387 + if (!tp) 427 388 return -ENOMEM; 428 389 429 - psmouse->vendor = "IBM"; 390 + trackpoint_defaults(tp); 391 + tp->variant_id = variant_id; 392 + tp->firmware_id = firmware_id; 393 + 394 + psmouse->private = tp; 395 + 396 + psmouse->vendor = trackpoint_variants[variant_id]; 430 397 psmouse->name = "TrackPoint"; 431 398 432 399 psmouse->reconnect = trackpoint_reconnect; 433 400 psmouse->disconnect = trackpoint_disconnect; 434 401 402 + if (variant_id != TP_VARIANT_IBM) { 403 + /* Newer variants do not support extended button query. */ 404 + button_info = 0x33; 405 + } else { 406 + error = trackpoint_read(ps2dev, TP_EXT_BTN, &button_info); 407 + if (error) { 408 + psmouse_warn(psmouse, 409 + "failed to get extended button data, assuming 3 buttons\n"); 410 + button_info = 0x33; 411 + } else if (!button_info) { 412 + psmouse_warn(psmouse, 413 + "got 0 in extended button data, assuming 3 buttons\n"); 414 + button_info = 0x33; 415 + } 416 + } 417 + 435 418 if ((button_info & 0x0f) >= 3) 436 - __set_bit(BTN_MIDDLE, psmouse->dev->keybit); 419 + input_set_capability(psmouse->dev, EV_KEY, BTN_MIDDLE); 437 420 438 421 __set_bit(INPUT_PROP_POINTER, psmouse->dev->propbit); 439 422 __set_bit(INPUT_PROP_POINTING_STICK, psmouse->dev->propbit); 440 423 441 - trackpoint_defaults(psmouse->private); 442 - 443 - error = trackpoint_power_on_reset(ps2dev); 444 - 445 - /* Write defaults to TP only if reset fails. */ 446 - if (error) 424 + if (variant_id != TP_VARIANT_IBM || 425 + trackpoint_power_on_reset(ps2dev) != 0) { 426 + /* 427 + * Write defaults to TP if we did not reset the trackpoint. 428 + */ 447 429 trackpoint_sync(psmouse, false); 430 + } 448 431 449 - error = sysfs_create_group(&ps2dev->serio->dev.kobj, &trackpoint_attr_group); 432 + error = device_add_group(&ps2dev->serio->dev, &trackpoint_attr_group); 450 433 if (error) { 451 434 psmouse_err(psmouse, 452 435 "failed to create sysfs attributes, error: %d\n", ··· 477 420 } 478 421 479 422 psmouse_info(psmouse, 480 - "IBM TrackPoint firmware: 0x%02x, buttons: %d/%d\n", 481 - firmware_id, 423 + "%s TrackPoint firmware: 0x%02x, buttons: %d/%d\n", 424 + psmouse->vendor, firmware_id, 482 425 (button_info & 0xf0) >> 4, button_info & 0x0f); 483 426 484 427 return 0;
+21 -13
drivers/input/mouse/trackpoint.h
··· 21 21 #define TP_COMMAND 0xE2 /* Commands start with this */ 22 22 23 23 #define TP_READ_ID 0xE1 /* Sent for device identification */ 24 - #define TP_MAGIC_IDENT 0x03 /* Sent after a TP_READ_ID followed */ 25 - /* by the firmware ID */ 26 - /* Firmware ID includes 0x1, 0x2, 0x3 */ 27 24 25 + /* 26 + * Valid first byte responses to the "Read Secondary ID" (0xE1) command. 27 + * 0x01 was the original IBM trackpoint, others implement very limited 28 + * subset of trackpoint features. 29 + */ 30 + #define TP_VARIANT_IBM 0x01 31 + #define TP_VARIANT_ALPS 0x02 32 + #define TP_VARIANT_ELAN 0x03 33 + #define TP_VARIANT_NXP 0x04 28 34 29 35 /* 30 36 * Commands ··· 142 136 143 137 #define MAKE_PS2_CMD(params, results, cmd) ((params<<12) | (results<<8) | (cmd)) 144 138 145 - struct trackpoint_data 146 - { 147 - unsigned char sensitivity, speed, inertia, reach; 148 - unsigned char draghys, mindrag; 149 - unsigned char thresh, upthresh; 150 - unsigned char ztime, jenks; 151 - unsigned char drift_time; 139 + struct trackpoint_data { 140 + u8 variant_id; 141 + u8 firmware_id; 142 + 143 + u8 sensitivity, speed, inertia, reach; 144 + u8 draghys, mindrag; 145 + u8 thresh, upthresh; 146 + u8 ztime, jenks; 147 + u8 drift_time; 152 148 153 149 /* toggles */ 154 - unsigned char press_to_select; 155 - unsigned char skipback; 156 - unsigned char ext_dev; 150 + bool press_to_select; 151 + bool skipback; 152 + bool ext_dev; 157 153 }; 158 154 159 155 #ifdef CONFIG_MOUSE_PS2_TRACKPOINT
+9 -3
drivers/input/rmi4/rmi_f01.c
··· 570 570 571 571 dev_set_drvdata(&fn->dev, f01); 572 572 573 - error = devm_device_add_group(&fn->rmi_dev->dev, &rmi_f01_attr_group); 573 + error = sysfs_create_group(&fn->rmi_dev->dev.kobj, &rmi_f01_attr_group); 574 574 if (error) 575 - dev_warn(&fn->dev, 576 - "Failed to create attribute group: %d\n", error); 575 + dev_warn(&fn->dev, "Failed to create sysfs group: %d\n", error); 577 576 578 577 return 0; 578 + } 579 + 580 + static void rmi_f01_remove(struct rmi_function *fn) 581 + { 582 + /* Note that the bus device is used, not the F01 device */ 583 + sysfs_remove_group(&fn->rmi_dev->dev.kobj, &rmi_f01_attr_group); 579 584 } 580 585 581 586 static int rmi_f01_config(struct rmi_function *fn) ··· 722 717 }, 723 718 .func = 0x01, 724 719 .probe = rmi_f01_probe, 720 + .remove = rmi_f01_remove, 725 721 .config = rmi_f01_config, 726 722 .attention = rmi_f01_attention, 727 723 .suspend = rmi_f01_suspend,
+5 -10
drivers/input/touchscreen/s6sy761.c
··· 1 - /* 2 - * Copyright (c) 2017 Samsung Electronics Co., Ltd. 3 - * Author: Andi Shyti <andi.shyti@samsung.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify 6 - * it under the terms of the GNU General Public License version 2 as 7 - * published by the Free Software Foundation. 8 - * 9 - * Samsung S6SY761 Touchscreen device driver 10 - */ 1 + // SPDX-License-Identifier: GPL-2.0 2 + // Samsung S6SY761 Touchscreen device driver 3 + // 4 + // Copyright (c) 2017 Samsung Electronics Co., Ltd. 5 + // Copyright (c) 2017 Andi Shyti <andi.shyti@samsung.com> 11 6 12 7 #include <asm/unaligned.h> 13 8 #include <linux/delay.h>
+5 -10
drivers/input/touchscreen/stmfts.c
··· 1 - /* 2 - * Copyright (c) 2017 Samsung Electronics Co., Ltd. 3 - * Author: Andi Shyti <andi.shyti@samsung.com> 4 - * 5 - * This program is free software; you can redistribute it and/or modify 6 - * it under the terms of the GNU General Public License version 2 as 7 - * published by the Free Software Foundation. 8 - * 9 - * STMicroelectronics FTS Touchscreen device driver 10 - */ 1 + // SPDX-License-Identifier: GPL-2.0 2 + // STMicroelectronics FTS Touchscreen device driver 3 + // 4 + // Copyright (c) 2017 Samsung Electronics Co., Ltd. 5 + // Copyright (c) 2017 Andi Shyti <andi.shyti@samsung.com> 11 6 12 7 #include <linux/delay.h> 13 8 #include <linux/i2c.h>