160-leds-fix-regression-in-usbport-led-trigger.patch 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. From 38a3549ffc0033761063cc5c7b994ab075694db8 Mon Sep 17 00:00:00 2001
  2. From: Christian Lamparter <[email protected]>
  3. Date: Tue, 25 Dec 2018 21:11:08 +0100
  4. Subject: [RFC PATCH] leds: fix regression in usbport led trigger
  5. In the patch "usb: simplify usbport trigger" together with
  6. "leds: triggers: add device attribute support" caused an
  7. regression for the usbport trigger. it will no longer
  8. enumerate any "ports" (i.e the sysfs directory stays empty)
  9. if the usb host drivers are fully initialized before the
  10. usbport trigger was loaded.
  11. The reason is that the usbport driver registers the sysfs
  12. entries in the ports subdirectory during the activate()
  13. callback. Whereas the patch
  14. "leds: triggers: add device attribute support" made it so
  15. that the sysfs "ports" group was only being added after
  16. the activate() callback succeeded.
  17. This patch moves the device_add_groups() in front of the
  18. call to the trigger's activate() function in order to
  19. solve the problem.
  20. Fixes: 6f7b0bad8839 ("usb: simplify usbport trigger")
  21. Signed-off-by: Christian Lamparter <[email protected]>
  22. ---
  23. drivers/leds/led-triggers.c | 19 ++++++++++---------
  24. 1 file changed, 10 insertions(+), 9 deletions(-)
  25. --- a/drivers/leds/led-triggers.c
  26. +++ b/drivers/leds/led-triggers.c
  27. @@ -134,6 +134,12 @@ int led_trigger_set(struct led_classdev
  28. led_set_brightness(led_cdev, LED_OFF);
  29. }
  30. if (trig) {
  31. + ret = device_add_groups(led_cdev->dev, trig->groups);
  32. + if (ret) {
  33. + dev_err(led_cdev->dev, "Failed to add trigger attributes\n");
  34. + goto err_add_groups;
  35. + }
  36. +
  37. write_lock_irqsave(&trig->leddev_list_lock, flags);
  38. list_add_tail(&led_cdev->trig_list, &trig->led_cdevs);
  39. write_unlock_irqrestore(&trig->leddev_list_lock, flags);
  40. @@ -146,12 +152,6 @@ int led_trigger_set(struct led_classdev
  41. if (ret)
  42. goto err_activate;
  43. -
  44. - ret = device_add_groups(led_cdev->dev, trig->groups);
  45. - if (ret) {
  46. - dev_err(led_cdev->dev, "Failed to add trigger attributes\n");
  47. - goto err_add_groups;
  48. - }
  49. }
  50. if (event) {
  51. @@ -165,17 +165,18 @@ int led_trigger_set(struct led_classdev
  52. return 0;
  53. -err_add_groups:
  54. -
  55. +err_activate:
  56. + device_remove_groups(led_cdev->dev, trig->groups);
  57. if (trig->deactivate)
  58. trig->deactivate(led_cdev);
  59. -err_activate:
  60. led_cdev->trigger = NULL;
  61. led_cdev->trigger_data = NULL;
  62. write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags);
  63. list_del(&led_cdev->trig_list);
  64. write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, flags);
  65. +
  66. +err_add_groups:
  67. led_set_brightness(led_cdev, LED_OFF);
  68. return ret;