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

[PATCH] INPUT: Create symlinks for backwards compatibility

This creates symlinks in /sys/class/input/ to the nested class devices
to help userspace cope with the nesting.

Unfortunatly udev still needs to be updated as it can't handle symlinks
properly here :(

Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

+32 -8
+8 -2
drivers/input/evdev.c
··· 661 661 static struct input_handle *evdev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id) 662 662 { 663 663 struct evdev *evdev; 664 + struct class_device *cdev; 664 665 int minor; 665 666 666 667 for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++); ··· 687 686 688 687 evdev_table[minor] = evdev; 689 688 690 - class_device_create(&input_class, &dev->cdev, 689 + cdev = class_device_create(&input_class, &dev->cdev, 691 690 MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor), 692 - dev->cdev.dev, "event%d", minor); 691 + dev->cdev.dev, evdev->name); 692 + 693 + /* temporary symlink to keep userspace happy */ 694 + sysfs_create_link(&input_class.subsys.kset.kobj, &cdev->kobj, 695 + evdev->name); 693 696 694 697 return &evdev->handle; 695 698 } ··· 703 698 struct evdev *evdev = handle->private; 704 699 struct evdev_list *list; 705 700 701 + sysfs_remove_link(&input_class.subsys.kset.kobj, evdev->name); 706 702 class_device_destroy(&input_class, 707 703 MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev->minor)); 708 704 evdev->exist = 0;
+8 -2
drivers/input/joydev.c
··· 448 448 static struct input_handle *joydev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id) 449 449 { 450 450 struct joydev *joydev; 451 + struct class_device *cdev; 451 452 int i, j, t, minor; 452 453 453 454 for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++); ··· 514 513 515 514 joydev_table[minor] = joydev; 516 515 517 - class_device_create(&input_class, &dev->cdev, 516 + cdev = class_device_create(&input_class, &dev->cdev, 518 517 MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor), 519 - dev->cdev.dev, "js%d", minor); 518 + dev->cdev.dev, joydev->name); 519 + 520 + /* temporary symlink to keep userspace happy */ 521 + sysfs_create_link(&input_class.subsys.kset.kobj, &cdev->kobj, 522 + joydev->name); 520 523 521 524 return &joydev->handle; 522 525 } ··· 530 525 struct joydev *joydev = handle->private; 531 526 struct joydev_list *list; 532 527 528 + sysfs_remove_link(&input_class.subsys.kset.kobj, joydev->name); 533 529 class_device_destroy(&input_class, MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + joydev->minor)); 534 530 joydev->exist = 0; 535 531
+8 -2
drivers/input/mousedev.c
··· 620 620 static struct input_handle *mousedev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id) 621 621 { 622 622 struct mousedev *mousedev; 623 + struct class_device *cdev; 623 624 int minor = 0; 624 625 625 626 for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++); ··· 649 648 650 649 mousedev_table[minor] = mousedev; 651 650 652 - class_device_create(&input_class, &dev->cdev, 651 + cdev = class_device_create(&input_class, &dev->cdev, 653 652 MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor), 654 - dev->cdev.dev, "mouse%d", minor); 653 + dev->cdev.dev, mousedev->name); 654 + 655 + /* temporary symlink to keep userspace happy */ 656 + sysfs_create_link(&input_class.subsys.kset.kobj, &cdev->kobj, 657 + mousedev->name); 655 658 656 659 return &mousedev->handle; 657 660 } ··· 665 660 struct mousedev *mousedev = handle->private; 666 661 struct mousedev_list *list; 667 662 663 + sysfs_remove_link(&input_class.subsys.kset.kobj, mousedev->name); 668 664 class_device_destroy(&input_class, 669 665 MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + mousedev->minor)); 670 666 mousedev->exist = 0;
+8 -2
drivers/input/tsdev.c
··· 368 368 struct input_device_id *id) 369 369 { 370 370 struct tsdev *tsdev; 371 + struct class_device *cdev; 371 372 int minor, delta; 372 373 373 374 for (minor = 0; minor < TSDEV_MINORS/2 && tsdev_table[minor]; ··· 410 409 411 410 tsdev_table[minor] = tsdev; 412 411 413 - class_device_create(&input_class, &dev->cdev, 412 + cdev = class_device_create(&input_class, &dev->cdev, 414 413 MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor), 415 - dev->cdev.dev, "ts%d", minor); 414 + dev->cdev.dev, tsdev->name); 415 + 416 + /* temporary symlink to keep userspace happy */ 417 + sysfs_create_link(&input_class.subsys.kset.kobj, &cdev->kobj, 418 + tsdev->name); 416 419 417 420 return &tsdev->handle; 418 421 } ··· 426 421 struct tsdev *tsdev = handle->private; 427 422 struct tsdev_list *list; 428 423 424 + sysfs_remove_link(&input_class.subsys.kset.kobj, tsdev->name); 429 425 class_device_destroy(&input_class, 430 426 MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + tsdev->minor)); 431 427 tsdev->exist = 0;