From: sashiko-bot@kernel.org
To: "Svyatoslav Ryhel" <clamor95@gmail.com>
Cc: robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH v1 6/6] video: leds: backlight: lm3533: Support getting LED sources from DT
Date: Sun, 17 May 2026 09:45:07 +0000 [thread overview]
Message-ID: <20260517094507.BFFC0C2BCB0@smtp.kernel.org> (raw)
In-Reply-To: <20260517074306.30937-7-clamor95@gmail.com>
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] An off-by-one bounds check skips parsing `led-sources` when exactly the maximum number of items is provided.
- [High] `lm3533_update()` uses static global masks, clobbering the configuration of LEDs belonging to other control banks.
- [High] LVLED4 and LVLED5 configuration is written to the wrong register (`LM3533_REG_OUTPUT_CONF1`), corrupting backlight settings.
- [Medium] Assigning the negative error code of `device_property_count_u32` to an unsigned integer circumvents error checks.
- [Medium] Unvalidated device tree array values are used as bit shift amounts, risking Undefined Behavior.
--
commit a94501f0a6935a4f57e9e0fb89310c12e86759a9
Author: Svyatoslav Ryhel <clamor95@gmail.com>
video: leds: backlight: lm3533: Support getting LED sources from DT
Add Control Bank to HVLED/LVLED muxing support based on the led-sources
defined in the device tree.
> diff --git a/drivers/leds/leds-lm3533.c b/drivers/leds/leds-lm3533.c
> --- a/drivers/leds/leds-lm3533.c
> +++ b/drivers/leds/leds-lm3533.c
[ ... ]
> @@ -639,7 +649,30 @@ static const struct attribute_group *lm3533_led_attribute_groups[] = {
>
> static int lm3533_led_setup(struct lm3533_led *led)
> {
> - int ret;
> + u32 output_cfg_shift = 0;
> + u32 output_cfg_val = 0;
> + int ret, i;
> +
> + if (led->num_leds) {
> + for (i = 0; i < led->num_leds; i++) {
> + output_cfg_shift = led->leds[i] * 2;
Are the values in led->leds[i] validated against hardware bounds before
being used to calculate the bit shift?
If the device tree provides excessively large values, the shift amount could
exceed the integer bit width.
> + output_cfg_val |= led->id << output_cfg_shift;
> + }
> +
> + /* LVLED1, LVLED2 and LVLED3 */
> + ret = lm3533_update(led->lm3533, LM3533_REG_OUTPUT_CONF1,
> + output_cfg_val << OUTPUT_CONF1_SHIFT,
> + OUTPUT_CONF1_MASK);
Since OUTPUT_CONF1_MASK spans all LVLED1-3 bits and control banks are
probed sequentially, will this update clear the routing configurations of
previously probed banks?
> + if (ret)
> + return ret;
> +
> + /* LVLED4 and LVLED5 */
> + ret = lm3533_update(led->lm3533, LM3533_REG_OUTPUT_CONF1,
Is LM3533_REG_OUTPUT_CONF1 the correct register for LVLED4 and LVLED5?
Writing to LM3533_REG_OUTPUT_CONF1 with OUTPUT_CONF2_MASK clears its lower
bits, which might overwrite the hardware mapping for the high-voltage
backlight and LVLED1 settings instead of configuring LVLED4 and LVLED5.
> + output_cfg_val >> OUTPUT_CONF2_SHIFT,
> + OUTPUT_CONF2_MASK);
> + if (ret)
> + return ret;
> + }
[ ... ]
> @@ -713,6 +746,24 @@ static int lm3533_led_probe(struct platform_device *pdev)
> led->pwm = 0;
> device_property_read_u32(&pdev->dev, "ti,pwm-config-mask", &led->pwm);
>
> + led->num_leds = device_property_count_u32(&pdev->dev, "led-sources");
> +
> + /*
> + * If led-sources property is not set then either this Control Bank uses
> + * its default LVLED or is not linked to any LVLED at all.
> + */
> + if (led->num_leds <= 0 || led->num_leds > LM3533_MAX_LEDS)
Does assigning the result of device_property_count_u32() directly to the
unsigned led->num_leds cause negative error codes like -EINVAL to wrap into
large positive values?
This causes the led->num_leds <= 0 check to fail. Should a signed integer
be used for the return value check before assigning it?
> + led->num_leds = 0;
> +
> + if (led->num_leds > 0 && led->num_leds < LM3533_MAX_LEDS) {
Does the strict inequality led->num_leds < LM3533_MAX_LEDS prevent the
driver from reading the led-sources array when exactly the maximum allowed
number of items is specified?
> + ret = device_property_read_u32_array(&pdev->dev, "led-sources",
> + led->leds, led->num_leds);
> + if (ret) {
> + dev_err(&pdev->dev, "failed to get led-sources\n");
> + goto err_deregister;
> + }
> + }
> +
[ ... ]
> diff --git a/drivers/video/backlight/lm3533_bl.c b/drivers/video/backlight/lm3533_bl.c
> --- a/drivers/video/backlight/lm3533_bl.c
> +++ b/drivers/video/backlight/lm3533_bl.c
[ ... ]
> @@ -248,7 +255,8 @@ static struct attribute_group lm3533_bl_attribute_group = {
> static int lm3533_bl_setup(struct lm3533_bl *bl)
> {
> int id = lm3533_bl_get_ctrlbank_id(bl);
> - int ret;
> + u32 output_cfg_val = 0;
> + int ret, i;
>
> ret = lm3533_update(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF,
> bl->linear ? CTRLBANK_AB_BCONF_MODE(id) : 0,
> @@ -256,6 +264,16 @@ static int lm3533_bl_setup(struct lm3533_bl *bl)
> if (ret)
> return ret;
>
> + if (bl->num_leds) {
> + for (i = 0; i < bl->num_leds; i++)
> + output_cfg_val |= id << bl->led_strings[i];
> +
> + ret = lm3533_update(bl->lm3533, LM3533_REG_OUTPUT_CONF1,
> + output_cfg_val, OUTPUT_CONF1_MASK);
Similar to the LED setup, will applying OUTPUT_CONF1_MASK without preserving
existing bit states overwrite the routing of other control banks?
> + if (ret)
> + return ret;
> + }
> +
[ ... ]
> @@ -337,6 +355,25 @@ static int lm3533_bl_probe(struct platform_device *pdev)
> bl->linear = device_property_read_bool(&pdev->dev,
> "ti,linear-mapping-mode");
>
> + bl->num_leds = device_property_count_u32(&pdev->dev, "led-sources");
> +
> + /*
> + * If led-sources property is not set then either this Control Bank uses
> + * its default HVLED or is not linked to any HVLED at all.
> + */
> + if (bl->num_leds <= 0 || bl->num_leds > LM3533_MAX_LED_STRINGS)
As with the LED probe function above, does this unsigned variable wrapper
prevent catching negative error codes from device_property_count_u32()?
> + bl->num_leds = 0;
> +
> + if (bl->num_leds > 0 && bl->num_leds < LM3533_MAX_LED_STRINGS) {
Does this also skip array parsing if exactly LM3533_MAX_LED_STRINGS items
are provided?
> + ret = device_property_read_u32_array(&pdev->dev, "led-sources",
> + bl->led_strings,
> + bl->num_leds);
> + if (ret) {
> + dev_err(&pdev->dev, "failed to get led-sources\n");
> + goto err_sysfs_remove;
> + }
> + }
> +
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260517074306.30937-1-clamor95@gmail.com?part=6
next prev parent reply other threads:[~2026-05-17 9:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-17 7:43 [PATCH v1 0/6] mfd: lm3533: convert to OF bindings, improve support Svyatoslav Ryhel
2026-05-17 7:43 ` [PATCH v1 1/6] dt-bindings: leds: Document TI LM3533 LED controller Svyatoslav Ryhel
2026-05-17 7:58 ` sashiko-bot
2026-05-17 13:44 ` Jonathan Cameron
2026-05-17 14:26 ` Svyatoslav Ryhel
2026-05-17 7:43 ` [PATCH v1 2/6] mfd: lm3533: Convert to use OF bindings Svyatoslav Ryhel
2026-05-17 7:55 ` Andy Shevchenko
2026-05-17 10:11 ` Svyatoslav Ryhel
2026-05-17 8:32 ` sashiko-bot
2026-05-17 11:10 ` Svyatoslav Ryhel
2026-05-17 7:43 ` [PATCH v1 3/6] mfd: lm3533: Add support for VIN power supply Svyatoslav Ryhel
2026-05-17 8:47 ` sashiko-bot
2026-05-17 7:43 ` [PATCH v1 4/6] mfd: lm3533: set DMA mask Svyatoslav Ryhel
2026-05-17 9:09 ` sashiko-bot
2026-05-17 7:43 ` [PATCH v1 5/6] video: backlight: lm3533_bl: Set initial mapping mode from DT Svyatoslav Ryhel
2026-05-17 9:28 ` sashiko-bot
2026-05-17 7:43 ` [PATCH v1 6/6] video: leds: backlight: lm3533: Support getting LED sources " Svyatoslav Ryhel
2026-05-17 9:45 ` sashiko-bot [this message]
2026-05-17 7:59 ` [PATCH v1 0/6] mfd: lm3533: convert to OF bindings, improve support Andy Shevchenko
2026-05-17 10:13 ` Svyatoslav Ryhel
2026-05-17 10:20 ` Andy Shevchenko
2026-05-17 10:34 ` Svyatoslav Ryhel
2026-05-17 10:40 ` Andy Shevchenko
2026-05-17 10:44 ` Svyatoslav Ryhel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260517094507.BFFC0C2BCB0@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=clamor95@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox