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:
Sander Vanheule
2026-04-05 20:58:54 +02:00
parent 3166710fc9
commit 0d769903dd
2 changed files with 8 additions and 8 deletions
@@ -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;
@@ -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;