kernel: 4.19: fix usbport led trigger regression
|In the patch "usb: simplify usbport trigger" together with |"leds: triggers: add device attribute support" caused an |regression for the usbport trigger. it will no longer |enumerate any "ports" (i.e the sysfs directory stays empty) |if the usb host drivers are fully initialized before the |usbport trigger was loaded. <https://marc.info/?l=linux-usb&m=154577101631079> Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
This commit is contained in:
		| @@ -0,0 +1,84 @@ | ||||
| From 38a3549ffc0033761063cc5c7b994ab075694db8 Mon Sep 17 00:00:00 2001 | ||||
| From: Christian Lamparter <chunkeey@gmail.com> | ||||
| Date: Tue, 25 Dec 2018 21:11:08 +0100 | ||||
| Subject: [RFC PATCH] leds: fix regression in usbport led trigger | ||||
|  | ||||
| In the patch "usb: simplify usbport trigger" together with | ||||
| "leds: triggers: add device attribute support" caused an | ||||
| regression for the usbport trigger. it will no longer | ||||
| enumerate any "ports" (i.e the sysfs directory stays empty) | ||||
| if the usb host drivers are fully initialized before the | ||||
| usbport trigger was loaded. | ||||
|  | ||||
| The reason is that the usbport driver registers the sysfs | ||||
| entries in the ports subdirectory during the activate() | ||||
| callback. Whereas the patch | ||||
| "leds: triggers: add device attribute support" made it so | ||||
| that the sysfs "ports" group was only being added after | ||||
| the activate() callback succeeded. | ||||
|  | ||||
| This patch moves the device_add_groups() in front of the | ||||
| call to the trigger's activate() function in order to | ||||
| solve the problem. | ||||
|  | ||||
| Fixes: 6f7b0bad8839 ("usb: simplify usbport trigger") | ||||
| Signed-off-by: Christian Lamparter <chunkeey@gmail.com> | ||||
| --- | ||||
|  drivers/leds/led-triggers.c | 19 ++++++++++--------- | ||||
|  1 file changed, 10 insertions(+), 9 deletions(-) | ||||
|  | ||||
| diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c | ||||
| index 17d73db1456e..08e7c724a9dc 100644 | ||||
| --- a/drivers/leds/led-triggers.c | ||||
| +++ b/drivers/leds/led-triggers.c | ||||
| @@ -134,6 +134,12 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) | ||||
|  		led_set_brightness(led_cdev, LED_OFF); | ||||
|  	} | ||||
|  	if (trig) { | ||||
| +		ret = device_add_groups(led_cdev->dev, trig->groups); | ||||
| +		if (ret) { | ||||
| +			dev_err(led_cdev->dev, "Failed to add trigger attributes\n"); | ||||
| +			goto err_add_groups; | ||||
| +		} | ||||
| + | ||||
|  		write_lock_irqsave(&trig->leddev_list_lock, flags); | ||||
|  		list_add_tail(&led_cdev->trig_list, &trig->led_cdevs); | ||||
|  		write_unlock_irqrestore(&trig->leddev_list_lock, flags); | ||||
| @@ -146,12 +152,6 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) | ||||
|   | ||||
|  		if (ret) | ||||
|  			goto err_activate; | ||||
| - | ||||
| -		ret = device_add_groups(led_cdev->dev, trig->groups); | ||||
| -		if (ret) { | ||||
| -			dev_err(led_cdev->dev, "Failed to add trigger attributes\n"); | ||||
| -			goto err_add_groups; | ||||
| -		} | ||||
|  	} | ||||
|   | ||||
|  	if (event) { | ||||
| @@ -165,17 +165,18 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) | ||||
|   | ||||
|  	return 0; | ||||
|   | ||||
| -err_add_groups: | ||||
| - | ||||
| +err_activate: | ||||
| +	device_remove_groups(led_cdev->dev, trig->groups); | ||||
|  	if (trig->deactivate) | ||||
|  		trig->deactivate(led_cdev); | ||||
| -err_activate: | ||||
|   | ||||
|  	led_cdev->trigger = NULL; | ||||
|  	led_cdev->trigger_data = NULL; | ||||
|  	write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); | ||||
|  	list_del(&led_cdev->trig_list); | ||||
|  	write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, flags); | ||||
| + | ||||
| +err_add_groups: | ||||
|  	led_set_brightness(led_cdev, LED_OFF); | ||||
|   | ||||
|  	return ret; | ||||
| --  | ||||
| 2.20.1 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Christian Lamparter
					Christian Lamparter