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

Configure Feed

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

Merge tag 'input-for-v6.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input

Pull input fixes from Dmitry Torokhov:

- even more Xbox controllers added to xpad driver: Turtle Beach Recon
Wired Controller, Turtle Beach Stealth Ultra, and PowerA Wired
Controller

- a fix to Synaptics RMI driver to not crash if controller reports
unsupported version of F34 (firmware flash) function

* tag 'input-for-v6.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
Input: synaptics-rmi - fix crash with unsupported versions of F34
Input: xpad - add more controllers

+78 -58
+3
drivers/input/joystick/xpad.c
··· 290 { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, 291 { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, 292 { 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE }, 293 { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 }, 294 { 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 }, 295 { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 }, ··· 356 { 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 }, 357 { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE }, 358 { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE }, 359 { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 }, 360 { 0x20d6, 0x400b, "PowerA FUSION Pro 4 Wired Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, 361 { 0x20d6, 0x890b, "PowerA MOGA XP-Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
··· 290 { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, 291 { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, 292 { 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE }, 293 + { 0x10f5, 0x7008, "Turtle Beach Recon Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, 294 + { 0x10f5, 0x7073, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, 295 { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 }, 296 { 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 }, 297 { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 }, ··· 354 { 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 }, 355 { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE }, 356 { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE }, 357 + { 0x20d6, 0x2064, "PowerA Wired Controller for Xbox", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, 358 { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 }, 359 { 0x20d6, 0x400b, "PowerA FUSION Pro 4 Wired Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, 360 { 0x20d6, 0x890b, "PowerA MOGA XP-Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
+75 -58
drivers/input/rmi4/rmi_f34.c
··· 4 * Copyright (C) 2016 Zodiac Inflight Innovations 5 */ 6 7 #include <linux/kernel.h> 8 #include <linux/rmi.h> 9 #include <linux/firmware.h> ··· 290 return rmi_f34_flash_firmware(f34, syn_fw); 291 } 292 293 - static int rmi_f34_status(struct rmi_function *fn) 294 - { 295 - struct f34_data *f34 = dev_get_drvdata(&fn->dev); 296 - 297 - /* 298 - * The status is the percentage complete, or once complete, 299 - * zero for success or a negative return code. 300 - */ 301 - return f34->update_status; 302 - } 303 - 304 static ssize_t rmi_driver_bootloader_id_show(struct device *dev, 305 struct device_attribute *dattr, 306 char *buf) 307 { 308 struct rmi_driver_data *data = dev_get_drvdata(dev); 309 - struct rmi_function *fn = data->f34_container; 310 struct f34_data *f34; 311 312 - if (fn) { 313 - f34 = dev_get_drvdata(&fn->dev); 314 315 - if (f34->bl_version == 5) 316 - return sysfs_emit(buf, "%c%c\n", 317 - f34->bootloader_id[0], 318 - f34->bootloader_id[1]); 319 - else 320 - return sysfs_emit(buf, "V%d.%d\n", 321 - f34->bootloader_id[1], 322 - f34->bootloader_id[0]); 323 - } 324 325 - return 0; 326 } 327 328 static DEVICE_ATTR(bootloader_id, 0444, rmi_driver_bootloader_id_show, NULL); ··· 326 struct rmi_function *fn = data->f34_container; 327 struct f34_data *f34; 328 329 - if (fn) { 330 - f34 = dev_get_drvdata(&fn->dev); 331 332 - return sysfs_emit(buf, "%s\n", f34->configuration_id); 333 - } 334 335 - return 0; 336 } 337 338 static DEVICE_ATTR(configuration_id, 0444, ··· 351 352 if (!data->f34_container) { 353 dev_warn(dev, "%s: No F34 present!\n", __func__); 354 - return -EINVAL; 355 } 356 357 f34 = dev_get_drvdata(&data->f34_container->dev); 358 359 if (f34->bl_version >= 7) { 360 if (data->pdt_props & HAS_BSR) { ··· 484 char *buf) 485 { 486 struct rmi_driver_data *data = dev_get_drvdata(dev); 487 - int update_status = 0; 488 489 - if (data->f34_container) 490 - update_status = rmi_f34_status(data->f34_container); 491 492 return sysfs_emit(buf, "%d\n", update_status); 493 } ··· 515 .attrs = rmi_firmware_attrs, 516 }; 517 518 - static int rmi_f34_probe(struct rmi_function *fn) 519 { 520 - struct f34_data *f34; 521 - unsigned char f34_queries[9]; 522 bool has_config_id; 523 - u8 version = fn->fd.function_version; 524 - int ret; 525 - 526 - f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); 527 - if (!f34) 528 - return -ENOMEM; 529 - 530 - f34->fn = fn; 531 - dev_set_drvdata(&fn->dev, f34); 532 - 533 - /* v5 code only supported version 0, try V7 probe */ 534 - if (version > 0) 535 - return rmi_f34v7_probe(f34); 536 537 f34->bl_version = 5; 538 539 - ret = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 540 - f34_queries, sizeof(f34_queries)); 541 - if (ret) { 542 dev_err(&fn->dev, "%s: Failed to query properties\n", 543 __func__); 544 - return ret; 545 } 546 547 snprintf(f34->bootloader_id, sizeof(f34->bootloader_id), ··· 555 f34->v5.config_blocks); 556 557 if (has_config_id) { 558 - ret = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, 559 - f34_queries, sizeof(f34_queries)); 560 - if (ret) { 561 dev_err(&fn->dev, "Failed to read F34 config ID\n"); 562 - return ret; 563 } 564 565 snprintf(f34->configuration_id, sizeof(f34->configuration_id), ··· 568 f34_queries[2], f34_queries[3]); 569 570 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Configuration ID: %s\n", 571 - f34->configuration_id); 572 } 573 574 return 0; 575 }
··· 4 * Copyright (C) 2016 Zodiac Inflight Innovations 5 */ 6 7 + #include "linux/device.h" 8 #include <linux/kernel.h> 9 #include <linux/rmi.h> 10 #include <linux/firmware.h> ··· 289 return rmi_f34_flash_firmware(f34, syn_fw); 290 } 291 292 static ssize_t rmi_driver_bootloader_id_show(struct device *dev, 293 struct device_attribute *dattr, 294 char *buf) 295 { 296 struct rmi_driver_data *data = dev_get_drvdata(dev); 297 + struct rmi_function *fn; 298 struct f34_data *f34; 299 300 + fn = data->f34_container; 301 + if (!fn) 302 + return -ENODEV; 303 304 + f34 = dev_get_drvdata(&fn->dev); 305 + if (!f34) 306 + return -ENODEV; 307 308 + if (f34->bl_version == 5) 309 + return sysfs_emit(buf, "%c%c\n", 310 + f34->bootloader_id[0], 311 + f34->bootloader_id[1]); 312 + else 313 + return sysfs_emit(buf, "V%d.%d\n", 314 + f34->bootloader_id[1], 315 + f34->bootloader_id[0]); 316 } 317 318 static DEVICE_ATTR(bootloader_id, 0444, rmi_driver_bootloader_id_show, NULL); ··· 334 struct rmi_function *fn = data->f34_container; 335 struct f34_data *f34; 336 337 + fn = data->f34_container; 338 + if (!fn) 339 + return -ENODEV; 340 341 + f34 = dev_get_drvdata(&fn->dev); 342 + if (!f34) 343 + return -ENODEV; 344 345 + 346 + return sysfs_emit(buf, "%s\n", f34->configuration_id); 347 } 348 349 static DEVICE_ATTR(configuration_id, 0444, ··· 356 357 if (!data->f34_container) { 358 dev_warn(dev, "%s: No F34 present!\n", __func__); 359 + return -ENODEV; 360 } 361 362 f34 = dev_get_drvdata(&data->f34_container->dev); 363 + if (!f34) { 364 + dev_warn(dev, "%s: No valid F34 present!\n", __func__); 365 + return -ENODEV; 366 + } 367 368 if (f34->bl_version >= 7) { 369 if (data->pdt_props & HAS_BSR) { ··· 485 char *buf) 486 { 487 struct rmi_driver_data *data = dev_get_drvdata(dev); 488 + struct f34_data *f34; 489 + int update_status = -ENODEV; 490 491 + /* 492 + * The status is the percentage complete, or once complete, 493 + * zero for success or a negative return code. 494 + */ 495 + if (data->f34_container) { 496 + f34 = dev_get_drvdata(&data->f34_container->dev); 497 + if (f34) 498 + update_status = f34->update_status; 499 + } 500 501 return sysfs_emit(buf, "%d\n", update_status); 502 } ··· 508 .attrs = rmi_firmware_attrs, 509 }; 510 511 + static int rmi_f34v5_probe(struct f34_data *f34) 512 { 513 + struct rmi_function *fn = f34->fn; 514 + u8 f34_queries[9]; 515 bool has_config_id; 516 + int error; 517 518 f34->bl_version = 5; 519 520 + error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 521 + f34_queries, sizeof(f34_queries)); 522 + if (error) { 523 dev_err(&fn->dev, "%s: Failed to query properties\n", 524 __func__); 525 + return error; 526 } 527 528 snprintf(f34->bootloader_id, sizeof(f34->bootloader_id), ··· 560 f34->v5.config_blocks); 561 562 if (has_config_id) { 563 + error = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, 564 + f34_queries, sizeof(f34_queries)); 565 + if (error) { 566 dev_err(&fn->dev, "Failed to read F34 config ID\n"); 567 + return error; 568 } 569 570 snprintf(f34->configuration_id, sizeof(f34->configuration_id), ··· 573 f34_queries[2], f34_queries[3]); 574 575 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Configuration ID: %s\n", 576 + f34->configuration_id); 577 } 578 + 579 + return 0; 580 + } 581 + 582 + static int rmi_f34_probe(struct rmi_function *fn) 583 + { 584 + struct f34_data *f34; 585 + u8 version = fn->fd.function_version; 586 + int error; 587 + 588 + f34 = devm_kzalloc(&fn->dev, sizeof(struct f34_data), GFP_KERNEL); 589 + if (!f34) 590 + return -ENOMEM; 591 + 592 + f34->fn = fn; 593 + 594 + /* v5 code only supported version 0 */ 595 + error = version == 0 ? rmi_f34v5_probe(f34) : rmi_f34v7_probe(f34); 596 + if (error) 597 + return error; 598 + 599 + dev_set_drvdata(&fn->dev, f34); 600 601 return 0; 602 }