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

Changed files
+78 -58
drivers
input
joystick
rmi4
+3
drivers/input/joystick/xpad.c
··· 290 290 { 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, 291 291 { 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 }, 292 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 }, 293 295 { 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 }, 294 296 { 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 }, 295 297 { 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 }, ··· 356 354 { 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 }, 357 355 { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE }, 358 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 }, 359 358 { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 }, 360 359 { 0x20d6, 0x400b, "PowerA FUSION Pro 4 Wired Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE }, 361 360 { 0x20d6, 0x890b, "PowerA MOGA XP-Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
+75 -58
drivers/input/rmi4/rmi_f34.c
··· 4 4 * Copyright (C) 2016 Zodiac Inflight Innovations 5 5 */ 6 6 7 + #include "linux/device.h" 7 8 #include <linux/kernel.h> 8 9 #include <linux/rmi.h> 9 10 #include <linux/firmware.h> ··· 290 289 return rmi_f34_flash_firmware(f34, syn_fw); 291 290 } 292 291 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 292 static ssize_t rmi_driver_bootloader_id_show(struct device *dev, 305 293 struct device_attribute *dattr, 306 294 char *buf) 307 295 { 308 296 struct rmi_driver_data *data = dev_get_drvdata(dev); 309 - struct rmi_function *fn = data->f34_container; 297 + struct rmi_function *fn; 310 298 struct f34_data *f34; 311 299 312 - if (fn) { 313 - f34 = dev_get_drvdata(&fn->dev); 300 + fn = data->f34_container; 301 + if (!fn) 302 + return -ENODEV; 314 303 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 - } 304 + f34 = dev_get_drvdata(&fn->dev); 305 + if (!f34) 306 + return -ENODEV; 324 307 325 - return 0; 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]); 326 316 } 327 317 328 318 static DEVICE_ATTR(bootloader_id, 0444, rmi_driver_bootloader_id_show, NULL); ··· 326 334 struct rmi_function *fn = data->f34_container; 327 335 struct f34_data *f34; 328 336 329 - if (fn) { 330 - f34 = dev_get_drvdata(&fn->dev); 337 + fn = data->f34_container; 338 + if (!fn) 339 + return -ENODEV; 331 340 332 - return sysfs_emit(buf, "%s\n", f34->configuration_id); 333 - } 341 + f34 = dev_get_drvdata(&fn->dev); 342 + if (!f34) 343 + return -ENODEV; 334 344 335 - return 0; 345 + 346 + return sysfs_emit(buf, "%s\n", f34->configuration_id); 336 347 } 337 348 338 349 static DEVICE_ATTR(configuration_id, 0444, ··· 351 356 352 357 if (!data->f34_container) { 353 358 dev_warn(dev, "%s: No F34 present!\n", __func__); 354 - return -EINVAL; 359 + return -ENODEV; 355 360 } 356 361 357 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 + } 358 367 359 368 if (f34->bl_version >= 7) { 360 369 if (data->pdt_props & HAS_BSR) { ··· 484 485 char *buf) 485 486 { 486 487 struct rmi_driver_data *data = dev_get_drvdata(dev); 487 - int update_status = 0; 488 + struct f34_data *f34; 489 + int update_status = -ENODEV; 488 490 489 - if (data->f34_container) 490 - update_status = rmi_f34_status(data->f34_container); 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 + } 491 500 492 501 return sysfs_emit(buf, "%d\n", update_status); 493 502 } ··· 515 508 .attrs = rmi_firmware_attrs, 516 509 }; 517 510 518 - static int rmi_f34_probe(struct rmi_function *fn) 511 + static int rmi_f34v5_probe(struct f34_data *f34) 519 512 { 520 - struct f34_data *f34; 521 - unsigned char f34_queries[9]; 513 + struct rmi_function *fn = f34->fn; 514 + u8 f34_queries[9]; 522 515 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); 516 + int error; 536 517 537 518 f34->bl_version = 5; 538 519 539 - ret = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 540 - f34_queries, sizeof(f34_queries)); 541 - if (ret) { 520 + error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, 521 + f34_queries, sizeof(f34_queries)); 522 + if (error) { 542 523 dev_err(&fn->dev, "%s: Failed to query properties\n", 543 524 __func__); 544 - return ret; 525 + return error; 545 526 } 546 527 547 528 snprintf(f34->bootloader_id, sizeof(f34->bootloader_id), ··· 555 560 f34->v5.config_blocks); 556 561 557 562 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) { 563 + error = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr, 564 + f34_queries, sizeof(f34_queries)); 565 + if (error) { 561 566 dev_err(&fn->dev, "Failed to read F34 config ID\n"); 562 - return ret; 567 + return error; 563 568 } 564 569 565 570 snprintf(f34->configuration_id, sizeof(f34->configuration_id), ··· 568 573 f34_queries[2], f34_queries[3]); 569 574 570 575 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Configuration ID: %s\n", 571 - f34->configuration_id); 576 + f34->configuration_id); 572 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); 573 600 574 601 return 0; 575 602 }