mirror of
https://github.com/openwrt/openwrt.git
synced 2026-06-17 14:50:15 +04:00
realtek: Indicate that RTL8231 LED ops can sleep
The RTL8231 LED driver is using the .brightness_set op, which according
to the documentation should not sleep. Since the RTL8231 is controlled
via an MDIO bus, this is not the case.
When using a non-offloaded LED driver such as netdev, this may currently
trigger kernel warnings:
WARNING: CPU: 0 PID: 14 at kernel/time/timer.c:1754 call_timer_fn.isra.0+0x84/0x8c
timer: led_timer_function+0x0/0x1d8 preempt leak: 00000100 -> 00000000
Switch to the .brightness_set_blocking op to indicate the operation
might sleep.
Fixes: 6ef6014887 ("realtek: Add pinctrl support for RTL8231")
Signed-off-by: Sander Vanheule <sander@svanheule.net>
This commit is contained in:
+4
-4
@@ -129,15 +129,15 @@ Signed-off-by: Sander Vanheule <sander@svanheule.net>
|
||||
+ .toggle_rates = rtl8231_toggle_rates,
|
||||
+};
|
||||
+
|
||||
+static void rtl8231_led_brightness_set(struct led_classdev *led_cdev,
|
||||
+static int rtl8231_led_brightness_set(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtl8231_led *pled = to_rtl8231_led(led_cdev);
|
||||
+
|
||||
+ if (brightness)
|
||||
+ regmap_field_write(pled->reg_field, pled->modes->on);
|
||||
+ return regmap_field_write(pled->reg_field, pled->modes->on);
|
||||
+ else
|
||||
+ regmap_field_write(pled->reg_field, pled->modes->off);
|
||||
+ return regmap_field_write(pled->reg_field, pled->modes->off);
|
||||
+}
|
||||
+
|
||||
+static enum led_brightness rtl8231_led_brightness_get(struct led_classdev *led_cdev)
|
||||
@@ -276,7 +276,7 @@ Signed-off-by: Sander Vanheule <sander@svanheule.net>
|
||||
+
|
||||
+ pled->led.max_brightness = 1;
|
||||
+ pled->led.brightness_get = rtl8231_led_brightness_get;
|
||||
+ pled->led.brightness_set = rtl8231_led_brightness_set;
|
||||
+ pled->led.brightness_set_blocking = rtl8231_led_brightness_set;
|
||||
+ pled->led.blink_set = rtl8231_led_blink_set;
|
||||
+
|
||||
+ init_data.fwnode = fwnode;
|
||||
|
||||
+4
-4
@@ -129,15 +129,15 @@ Signed-off-by: Sander Vanheule <sander@svanheule.net>
|
||||
+ .toggle_rates = rtl8231_toggle_rates,
|
||||
+};
|
||||
+
|
||||
+static void rtl8231_led_brightness_set(struct led_classdev *led_cdev,
|
||||
+static int rtl8231_led_brightness_set(struct led_classdev *led_cdev,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtl8231_led *pled = to_rtl8231_led(led_cdev);
|
||||
+
|
||||
+ if (brightness)
|
||||
+ regmap_field_write(pled->reg_field, pled->modes->on);
|
||||
+ return regmap_field_write(pled->reg_field, pled->modes->on);
|
||||
+ else
|
||||
+ regmap_field_write(pled->reg_field, pled->modes->off);
|
||||
+ return regmap_field_write(pled->reg_field, pled->modes->off);
|
||||
+}
|
||||
+
|
||||
+static enum led_brightness rtl8231_led_brightness_get(struct led_classdev *led_cdev)
|
||||
@@ -276,7 +276,7 @@ Signed-off-by: Sander Vanheule <sander@svanheule.net>
|
||||
+
|
||||
+ pled->led.max_brightness = 1;
|
||||
+ pled->led.brightness_get = rtl8231_led_brightness_get;
|
||||
+ pled->led.brightness_set = rtl8231_led_brightness_set;
|
||||
+ pled->led.brightness_set_blocking = rtl8231_led_brightness_set;
|
||||
+ pled->led.blink_set = rtl8231_led_blink_set;
|
||||
+
|
||||
+ init_data.fwnode = fwnode;
|
||||
|
||||
Reference in New Issue
Block a user