From 0d769903dd1326b7071d6d1a8df5228039e3b793 Mon Sep 17 00:00:00 2001 From: Sander Vanheule Date: Sun, 5 Apr 2026 20:58:54 +0200 Subject: [PATCH] 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: 6ef6014887c3 ("realtek: Add pinctrl support for RTL8231") Signed-off-by: Sander Vanheule --- ...804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch | 8 ++++---- ...804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/target/linux/realtek/patches-6.12/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch b/target/linux/realtek/patches-6.12/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch index c6527d04b14..ca2e63d9393 100644 --- a/target/linux/realtek/patches-6.12/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch +++ b/target/linux/realtek/patches-6.12/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch @@ -129,15 +129,15 @@ Signed-off-by: Sander Vanheule + .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 + + 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; diff --git a/target/linux/realtek/patches-6.18/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch b/target/linux/realtek/patches-6.18/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch index 946b64942e0..48099890e40 100644 --- a/target/linux/realtek/patches-6.18/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch +++ b/target/linux/realtek/patches-6.18/804-leds-Add-support-for-RTL8231-LED-scan-matrix.patch @@ -129,15 +129,15 @@ Signed-off-by: Sander Vanheule + .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 + + 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;