[PATCH 08/10] leds: rgb: ktd202x: Limit the LED current to led-max-microamp

From: Joseph Telaak via B4 Relay

Date: Sun Nov 01 2026 - 21:17:50 EST


From: Joseph Telaak <joseph@xxxxxxxxxx>

The full brightness of 192 is 24 mA, which is more than many indicator
LEDs are made for, and a channel may drive several LEDs in parallel. The
GL.iNet GL-SFT1200 firmware, for example, runs each of its two channels,
three LEDs each, at 1.375 mA.

Honor the common led-max-microamp property for single color LEDs by
lowering max_brightness, since each brightness step adds 0.125 mA. Set
max_brightness before the LED is registered, and blink at max_brightness
rather than at the chip maximum.

Multicolor LEDs are left as they are: the LED core already bounds each
color intensity, and the hardware this was tested on has none.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Joseph Telaak <joseph@xxxxxxxxxx>
---
drivers/leds/rgb/leds-ktd202x.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/leds/rgb/leds-ktd202x.c b/drivers/leds/rgb/leds-ktd202x.c
index ed0e8e74c..48521f1e5 100644
--- a/drivers/leds/rgb/leds-ktd202x.c
+++ b/drivers/leds/rgb/leds-ktd202x.c
@@ -78,6 +78,7 @@
#define KTD202X_PATTERN_MAX_MS 16384

#define KTD202X_MAX_BRIGHTNESS 192
+#define KTD202X_LED_CURRENT_STEP_uA 125

static const struct reg_default ktd202x_reg_defaults[] = {
{ KTD202X_REG_RESET_CONTROL, KTD202X_TIMER_SLOT_CONTROL_TSLOT1 |
@@ -398,7 +399,7 @@ static int ktd202x_blink_single_set(struct led_classdev *cdev,
int ret;

if (!cdev->brightness) {
- ret = ktd202x_brightness_single_set(cdev, KTD202X_MAX_BRIGHTNESS);
+ ret = ktd202x_brightness_single_set(cdev, cdev->max_brightness);
if (ret)
return ret;
}
@@ -588,6 +589,18 @@ static int ktd202x_pattern_mc_clear(struct led_classdev *cdev)
return ktd202x_brightness_mc_set(cdev, LED_OFF);
}

+/* The current limit of a LED in brightness steps, each of which adds 0.125 mA */
+static unsigned int ktd202x_max_brightness(struct fwnode_handle *fwnode)
+{
+ u32 max_microamp;
+
+ if (fwnode_property_read_u32(fwnode, "led-max-microamp", &max_microamp))
+ return KTD202X_MAX_BRIGHTNESS;
+
+ return clamp_t(u32, max_microamp / KTD202X_LED_CURRENT_STEP_uA, 1,
+ KTD202X_MAX_BRIGHTNESS);
+}
+
static int ktd202x_setup_led_rgb(struct ktd202x *chip, struct fwnode_handle *fwnode,
struct ktd202x_led *led, struct led_init_data *init_data)
{
@@ -637,6 +650,7 @@ static int ktd202x_setup_led_rgb(struct ktd202x *chip, struct fwnode_handle *fwn
led->mcdev.num_colors = num_channels;

cdev = &led->mcdev.led_cdev;
+ cdev->max_brightness = KTD202X_MAX_BRIGHTNESS;
cdev->brightness_set_blocking = ktd202x_brightness_mc_set;
cdev->blink_set = ktd202x_blink_mc_set;
cdev->pattern_set = ktd202x_pattern_mc_set;
@@ -660,6 +674,8 @@ static int ktd202x_setup_led_single(struct ktd202x *chip, struct fwnode_handle *
led->index = reg;

cdev = &led->cdev;
+ cdev->max_brightness = ktd202x_max_brightness(fwnode);
+
cdev->brightness_set_blocking = ktd202x_brightness_single_set;
cdev->blink_set = ktd202x_blink_single_set;
cdev->pattern_set = ktd202x_pattern_single_set;
@@ -699,8 +715,6 @@ static int ktd202x_add_led(struct ktd202x *chip, struct fwnode_handle *fwnode, u
return ret;
}

- cdev->max_brightness = KTD202X_MAX_BRIGHTNESS;
-
return 0;
}


--
Git-155)