[PATCH 16/21] leds: lm3532: Clamp full-scale current to minimum bound

From: Lee Jones

Date: Wed Oct 21 2026 - 08:48:00 EST


lm3532_parse_node() bounds led->full_scale_current to LM3532_FS_CURR_MAX
using min(), but does not enforce the lower bound LM3532_FS_CURR_MIN.
If a firmware node specifies led-max-microamp between 1 and
LM3532_FS_CURR_MIN - 1, subtracting LM3532_FS_CURR_MIN in
lm3532_init_registers() underflows and writes a corrupted full-scale
current register value.

Use clamp() when led-max-microamp is present so led->full_scale_current
is bounded to [LM3532_FS_CURR_MIN, LM3532_FS_CURR_MAX].

Fixes: 517ea49a7b23 ("leds: lm3532: Add full scale current configuration")
Closes: https://sashiko.dev/#/bug/linux-114b6c69-6d76-4f4d-bb87-0980b1e15bbd
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Lee Jones <lee@xxxxxxxxxx>
---
drivers/leds/leds-lm3532.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/leds/leds-lm3532.c b/drivers/leds/leds-lm3532.c
index 6fe752889487..327460de2ff8 100644
--- a/drivers/leds/leds-lm3532.c
+++ b/drivers/leds/leds-lm3532.c
@@ -615,14 +615,16 @@ static int lm3532_parse_node(struct lm3532_data *priv)
return ret;
}

- if (fwnode_property_present(child, "led-max-microamp") &&
- fwnode_property_read_u32(child, "led-max-microamp",
- &led->full_scale_current))
- dev_err(&priv->client->dev,
- "Failed getting led-max-microamp\n");
- else
- led->full_scale_current = min(led->full_scale_current,
- LM3532_FS_CURR_MAX);
+ if (fwnode_property_present(child, "led-max-microamp")) {
+ if (fwnode_property_read_u32(child, "led-max-microamp",
+ &led->full_scale_current))
+ dev_err(&priv->client->dev,
+ "Failed getting led-max-microamp\n");
+ else
+ led->full_scale_current = clamp(led->full_scale_current,
+ LM3532_FS_CURR_MIN,
+ LM3532_FS_CURR_MAX);
+ }

if (led->mode == LM3532_BL_MODE_ALS) {
led->mode = LM3532_ALS_CTRL;
--
2.56.0.218.g1ec904b173-goog