Commit d84d80f3 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Jacek Anaszewski

leds: core: avoid error message when a USB LED device is unplugged

When a USB LED device is unplugged the remove call chain calls
led_classdev_unregister which tries to switch the LED off.
As the device has been removed already this results in a ENODEV
error message in dmesg.
Avoid this error message by ignoring ENODEV in calls from
led_classdev_unregister if the LED device is flagged as pluggable.

Therefore a new flag LED_HW_PLUGGABLE was introduced which should be set by
all LED drivers handling pluggable LED devices (mainly USB LED devices).
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarJacek Anaszewski <j.anaszewski@samsung.com>
parent 70b2563b
...@@ -245,6 +245,8 @@ void led_classdev_unregister(struct led_classdev *led_cdev) ...@@ -245,6 +245,8 @@ void led_classdev_unregister(struct led_classdev *led_cdev)
up_write(&led_cdev->trigger_lock); up_write(&led_cdev->trigger_lock);
#endif #endif
led_cdev->flags |= LED_UNREGISTERING;
/* Stop blinking */ /* Stop blinking */
led_stop_software_blink(led_cdev); led_stop_software_blink(led_cdev);
......
...@@ -98,7 +98,10 @@ static void set_brightness_delayed(struct work_struct *ws) ...@@ -98,7 +98,10 @@ static void set_brightness_delayed(struct work_struct *ws)
led_cdev->delayed_set_value); led_cdev->delayed_set_value);
else else
ret = -ENOTSUPP; ret = -ENOTSUPP;
if (ret < 0) if (ret < 0 &&
/* LED HW might have been unplugged, therefore don't warn */
!(ret == -ENODEV && (led_cdev->flags & LED_UNREGISTERING) &&
(led_cdev->flags & LED_HW_PLUGGABLE)))
dev_err(led_cdev->dev, dev_err(led_cdev->dev,
"Setting an LED's brightness failed (%d)\n", ret); "Setting an LED's brightness failed (%d)\n", ret);
} }
......
...@@ -39,6 +39,7 @@ struct led_classdev { ...@@ -39,6 +39,7 @@ struct led_classdev {
/* Lower 16 bits reflect status */ /* Lower 16 bits reflect status */
#define LED_SUSPENDED (1 << 0) #define LED_SUSPENDED (1 << 0)
#define LED_UNREGISTERING (1 << 1)
/* Upper 16 bits reflect control information */ /* Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME (1 << 16) #define LED_CORE_SUSPENDRESUME (1 << 16)
#define LED_BLINK_ONESHOT (1 << 17) #define LED_BLINK_ONESHOT (1 << 17)
...@@ -48,6 +49,7 @@ struct led_classdev { ...@@ -48,6 +49,7 @@ struct led_classdev {
#define LED_BLINK_DISABLE (1 << 21) #define LED_BLINK_DISABLE (1 << 21)
#define LED_SYSFS_DISABLE (1 << 22) #define LED_SYSFS_DISABLE (1 << 22)
#define LED_DEV_CAP_FLASH (1 << 23) #define LED_DEV_CAP_FLASH (1 << 23)
#define LED_HW_PLUGGABLE (1 << 24)
/* Set LED brightness level /* Set LED brightness level
* Must not sleep. Use brightness_set_blocking for drivers * Must not sleep. Use brightness_set_blocking for drivers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment