* [PATCH v4 0/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support
@ 2026-05-21 8:07 Neil Armstrong
2026-05-21 8:08 ` [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver Neil Armstrong
2026-05-21 8:08 ` [PATCH v4 2/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong
0 siblings, 2 replies; 6+ messages in thread
From: Neil Armstrong @ 2026-05-21 8:07 UTC (permalink / raw)
To: Lee Jones, Daniel Thompson, Jingoo Han, Pavel Machek, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Helge Deller
Cc: dri-devel, linux-leds, devicetree, linux-kernel, linux-fbdev,
KancyJoe, Neil Armstrong, Krzysztof Kozlowski
Implement support for the Silergy SY7758 6-channel High Efficiency LED Driver
used for backlight brightness control in the Ayaneo Pocket S2 dual-DSI panel.
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
Changes in v4:
- Fixed Kconfig typo
- Remove again unused macros
- Added delay.h include
- Link to v3: https://patch.msgid.link/20260519-topic-sm8650-ayaneo-pocket-s2-sy7758-v3-0-ec8194bbc885@linaro.org
Changes in v3:
- Dropped unused macros
- Added second autho entry to match header and commit message
- Move my signof at the end
- Switched to flseep()
- Link to v2: https://patch.msgid.link/20260430-topic-sm8650-ayaneo-pocket-s2-sy7758-v2-0-308140640de9@linaro.org
Changes in v2:
- Fixed bindings subject and removed "|"
- Added review tag
- Added higher delay before reading ID from HW (100us was too short)
- Removed probe defer if i2c read fails
- Link to v1: https://patch.msgid.link/20260428-topic-sm8650-ayaneo-pocket-s2-sy7758-v1-0-0caade5fdb32@linaro.org
---
KancyJoe (1):
backlight: Add SY7758 6-channel High Efficiency LED Driver support
Neil Armstrong (1):
dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver
.../bindings/leds/backlight/silergy,sy7758.yaml | 53 +++++
drivers/video/backlight/Kconfig | 8 +
drivers/video/backlight/Makefile | 1 +
drivers/video/backlight/sy7758.c | 259 +++++++++++++++++++++
4 files changed, 321 insertions(+)
---
base-commit: 39704f00f747aba3144289870b5fd8ac230a9aaf
change-id: 20260428-topic-sm8650-ayaneo-pocket-s2-sy7758-3081ee7f1e25
Best regards,
--
Neil Armstrong <neil.armstrong@linaro.org>
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver 2026-05-21 8:07 [PATCH v4 0/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong @ 2026-05-21 8:08 ` Neil Armstrong 2026-05-21 8:19 ` sashiko-bot 2026-05-21 8:08 ` [PATCH v4 2/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong 1 sibling, 1 reply; 6+ messages in thread From: Neil Armstrong @ 2026-05-21 8:08 UTC (permalink / raw) To: Lee Jones, Daniel Thompson, Jingoo Han, Pavel Machek, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Helge Deller Cc: dri-devel, linux-leds, devicetree, linux-kernel, linux-fbdev, KancyJoe, Neil Armstrong, Krzysztof Kozlowski Document the Silergy SY7758 6-channel High Efficiency LED Driver used for backlight brightness control. Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- .../bindings/leds/backlight/silergy,sy7758.yaml | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml b/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml new file mode 100644 index 000000000000..80e978d691c2 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/backlight/silergy,sy7758.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Silergy SY7758 6-channel High Efficiency LED Driver + +maintainers: + - Neil Armstrong <neil.armstrong@linaro.org> + +description: + Silergy SY7758 is a high efficiency 6-channels LED backlight + driver with I2C brightness control. + +allOf: + - $ref: common.yaml# + +properties: + compatible: + const: silergy,sy7758 + + reg: + maxItems: 1 + + vddio-supply: true + + enable-gpios: + maxItems: 1 + +required: + - compatible + - reg + - vddio-supply + - enable-gpios + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + backlight@11 { + compatible = "silergy,sy7758"; + reg = <0x11>; + vddio-supply = <&bl_vddio>; + enable-gpios = <&gpio 16 GPIO_ACTIVE_HIGH>; + }; + }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver 2026-05-21 8:08 ` [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver Neil Armstrong @ 2026-05-21 8:19 ` sashiko-bot 2026-05-21 8:33 ` Neil Armstrong 0 siblings, 1 reply; 6+ messages in thread From: sashiko-bot @ 2026-05-21 8:19 UTC (permalink / raw) To: Neil Armstrong; +Cc: devicetree, conor+dt, robh Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Low] Missing main power supply property (e.g., `vin-supply` or `vsys-supply`) for the LED boost converter. -- commit f0b2513f96c13c59660da8495c808919bb4b44ab Author: Neil Armstrong <neil.armstrong@linaro.org> dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver Document the Silergy SY7758 6-channel High Efficiency LED Driver used for backlight brightness control. > diff --git a/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml b/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml > new file mode 100644 > index 0000000000000..80e978d691c29 > --- /dev/null > +++ b/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml [ ... ] > +properties: > + compatible: > + const: silergy,sy7758 > + > + reg: > + maxItems: 1 > + > + vddio-supply: true [Severity: Low] Should there be a vin-supply or vsys-supply property included here for the main power input? Looking at the driver implementation, it references VBST (V-Boost) registers, confirming it operates as a boost converter to drive multiple LED channels. A logic I/O supply like vddio-supply typically cannot provide the high current required to drive a boost coil for a backlight. Omitting the primary power supply could prevent the kernel from actively managing the main power rail on boards where it is switchable. > + > + enable-gpios: > + maxItems: 1 > + > +required: [ ... ] -- Sashiko AI review · https://sashiko.dev/#/patchset/20260521-topic-sm8650-ayaneo-pocket-s2-sy7758-v4-0-73c732615e4a@linaro.org?part=1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver 2026-05-21 8:19 ` sashiko-bot @ 2026-05-21 8:33 ` Neil Armstrong 0 siblings, 0 replies; 6+ messages in thread From: Neil Armstrong @ 2026-05-21 8:33 UTC (permalink / raw) To: sashiko-reviews; +Cc: devicetree, conor+dt, robh On 5/21/26 10:19, sashiko-bot@kernel.org wrote: > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: > - [Low] Missing main power supply property (e.g., `vin-supply` or `vsys-supply`) for the LED boost converter. > -- > > commit f0b2513f96c13c59660da8495c808919bb4b44ab > Author: Neil Armstrong <neil.armstrong@linaro.org> > > dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver > > Document the Silergy SY7758 6-channel High Efficiency LED Driver > used for backlight brightness control. > >> diff --git a/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml b/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml >> new file mode 100644 >> index 0000000000000..80e978d691c29 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/leds/backlight/silergy,sy7758.yaml > > [ ... ] > >> +properties: >> + compatible: >> + const: silergy,sy7758 >> + >> + reg: >> + maxItems: 1 >> + >> + vddio-supply: true > > [Severity: Low] > Should there be a vin-supply or vsys-supply property included here for the > main power input? No, the vin is provided by the panel, it's not under Linux control > > Looking at the driver implementation, it references VBST (V-Boost) registers, > confirming it operates as a boost converter to drive multiple LED channels. > A logic I/O supply like vddio-supply typically cannot provide the high > current required to drive a boost coil for a backlight. > > Omitting the primary power supply could prevent the kernel from actively > managing the main power rail on boards where it is switchable. > >> + >> + enable-gpios: >> + maxItems: 1 >> + >> +required: > > [ ... ] > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 2/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support 2026-05-21 8:07 [PATCH v4 0/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong 2026-05-21 8:08 ` [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver Neil Armstrong @ 2026-05-21 8:08 ` Neil Armstrong 2026-05-21 8:45 ` sashiko-bot 1 sibling, 1 reply; 6+ messages in thread From: Neil Armstrong @ 2026-05-21 8:08 UTC (permalink / raw) To: Lee Jones, Daniel Thompson, Jingoo Han, Pavel Machek, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Helge Deller Cc: dri-devel, linux-leds, devicetree, linux-kernel, linux-fbdev, KancyJoe, Neil Armstrong From: KancyJoe <kancy2333@outlook.com> Implement support for the Silergy SY7758 6-channel High Efficiency LED Driver used for backlight brightness control in the Ayaneo Pocket S2 dual-DSI panel. Signed-off-by: KancyJoe <kancy2333@outlook.com> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- drivers/video/backlight/Kconfig | 8 ++ drivers/video/backlight/Makefile | 1 + drivers/video/backlight/sy7758.c | 259 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 268 insertions(+) diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index a7a3fbaf7c29..a1f70a2bae99 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -207,6 +207,14 @@ config BACKLIGHT_KTZ8866 Say Y to enable the backlight driver for the Kinetic KTZ8866 found in Xiaomi Mi Pad 5 series. +config BACKLIGHT_SY7758 + tristate "Backlight Driver for Silergy SY7758" + depends on I2C + select REGMAP_I2C + help + Say Y to enable the backlight driver for the Silergy SY7758 + backlight controller found in Ayaneo Pocket S2. + config BACKLIGHT_LM3533 tristate "Backlight Driver for LM3533" depends on MFD_LM3533 diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 794820a98ed4..39ef588b1cf2 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -56,6 +56,7 @@ obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o obj-$(CONFIG_BACKLIGHT_QCOM_WLED) += qcom-wled.o obj-$(CONFIG_BACKLIGHT_RT4831) += rt4831-backlight.o obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o +obj-$(CONFIG_BACKLIGHT_SY7758) += sy7758.o obj-$(CONFIG_BACKLIGHT_SKY81452) += sky81452-backlight.o obj-$(CONFIG_BACKLIGHT_TPS65217) += tps65217_bl.o obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o diff --git a/drivers/video/backlight/sy7758.c b/drivers/video/backlight/sy7758.c new file mode 100644 index 000000000000..198d55939438 --- /dev/null +++ b/drivers/video/backlight/sy7758.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Silergy SY7758 6-channel High Efficiency LED Driver + * + * Copyright (C) 2025 Kancy Joe <kancy2333@outlook.com> + * Copyright (C) 2026 Linaro Limited + * Author: Neil Armstrong <neil.armstrong@linaro.org> + */ +#include <linux/backlight.h> +#include <linux/module.h> +#include <linux/i2c.h> +#include <linux/of.h> +#include <linux/err.h> +#include <linux/bits.h> +#include <linux/delay.h> +#include <linux/regmap.h> +#include <linux/bitfield.h> +#include <linux/gpio/consumer.h> +#include <linux/regulator/consumer.h> + +#define DEFAULT_BRIGHTNESS 1024 +#define MAX_BRIGHTNESS 4080 +#define REG_MAX 0xAE + +/* Registers */ +#define REG_DEV_CTL 0x01 +#define REG_DEV_ID 0x03 +#define REG_BRT_12BIT_L 0x10 +#define REG_BRT_12BIT_H 0x11 + +/* OTP memory */ +#define REG_OTP_CFG0 0xA0 +#define REG_OTP_CFG1 0xA1 +#define REG_OTP_CFG2 0xA2 +#define REG_OTP_CFG5 0xA5 +#define REG_OTP_CFG9 0xA9 + +/* Fields */ +#define BIT_DEV_CTL_FAST BIT(7) +#define MSK_DEV_CTL_BRT_MODE GENMASK(2, 1) +#define BIT_DEV_CTL_BL_CTLB BIT(0) + +#define MSK_BRT_12BIT_L GENMASK(7, 0) +#define MSK_BRT_12BIT_H GENMASK(3, 0) + +#define MSK_CFG0_CURRENT_LOW GENMASK(7, 0) + +#define BIT_CFG1_PDET_STDBY BIT(7) +#define MSK_CFG1_CURRENT_MAX GENMASK(6, 4) +#define MSK_CFG1_CURRENT_HIGH GENMASK(3, 0) + +#define BIT_CFG2_UVLO_EN BIT(5) +#define BIT_CFG2_UVLO_TH BIT(4) +#define BIT_CFG2_BL_ON BIT(3) +#define BIT_CFG2_ISET_EN BIT(2) +#define BIT_CFG2_BST_ESET_EN BIT(1) + +#define BIT_CFG5_PWM_DIRECT BIT(7) +#define MSK_CFG5_PS_MODE GENMASK(6, 4) +#define MSK_CFG5_PWM_FREQ GENMASK(3, 0) + +#define MSK_CFG9_VBST_MAX GENMASK(7, 5) +#define BIT_CFG9_JUMP_EN BIT(4) +#define MSK_CFG9_JUMP_TH GENMASK(3, 2) +#define MSK_CFG9_JUMP_VOLTAGE GENMASK(1, 0) + +struct sy7758 { + struct i2c_client *client; + struct regmap *regmap; + struct gpio_desc *gpio; + struct backlight_device *bl; +}; + +static const struct regmap_config sy7758_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = REG_MAX, +}; + +static int sy7758_backlight_update_status(struct backlight_device *backlight_dev) +{ + struct sy7758 *sydev = bl_get_data(backlight_dev); + unsigned int brightness = backlight_get_brightness(backlight_dev); + int ret; + + ret = regmap_write(sydev->regmap, REG_BRT_12BIT_L, + FIELD_PREP(MSK_BRT_12BIT_L, + brightness & 0xff)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_BRT_12BIT_H, + FIELD_PREP(MSK_BRT_12BIT_H, + (brightness >> 8) & 0xf)); + if (ret) + return ret; + + return 0; +} + +static const struct backlight_ops sy7758_backlight_ops = { + .options = BL_CORE_SUSPENDRESUME, + .update_status = sy7758_backlight_update_status, +}; + +static int sy7758_init(struct sy7758 *sydev) +{ + int ret = 0; + + ret = regmap_write(sydev->regmap, REG_DEV_CTL, + BIT_DEV_CTL_FAST | BIT_DEV_CTL_BL_CTLB | + FIELD_PREP(MSK_DEV_CTL_BRT_MODE, 2)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_BRT_12BIT_L, + FIELD_PREP(MSK_BRT_12BIT_L, + DEFAULT_BRIGHTNESS & 0xff)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_BRT_12BIT_H, + FIELD_PREP(MSK_BRT_12BIT_H, + (DEFAULT_BRIGHTNESS >> 8))); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_OTP_CFG5, + FIELD_PREP(MSK_CFG5_PS_MODE, 6) | + FIELD_PREP(MSK_CFG5_PWM_FREQ, 4)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_OTP_CFG0, + FIELD_PREP(MSK_CFG0_CURRENT_LOW, 85)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_OTP_CFG1, + BIT_CFG1_PDET_STDBY | + FIELD_PREP(MSK_CFG1_CURRENT_MAX, 1) | + FIELD_PREP(MSK_CFG1_CURRENT_HIGH, 10)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_OTP_CFG9, + FIELD_PREP(MSK_CFG9_VBST_MAX, 4)); + if (ret) + return ret; + + ret = regmap_write(sydev->regmap, REG_OTP_CFG2, + BIT_CFG2_BL_ON | BIT_CFG2_UVLO_EN); + if (ret) + return ret; + + return 0; +} + +static int sy7758_probe(struct i2c_client *client) +{ + struct backlight_properties props = { }; + struct device *dev = &client->dev; + struct sy7758 *sydev; + unsigned int dev_id; + int ret; + + sydev = devm_kzalloc(dev, sizeof(*sydev), GFP_KERNEL); + if (!sydev) + return -ENOMEM; + + i2c_set_clientdata(client, sydev); + + /* Initialize regmap */ + sydev->client = client; + sydev->regmap = devm_regmap_init_i2c(client, &sy7758_regmap_config); + if (IS_ERR(sydev->regmap)) + return dev_err_probe(dev, PTR_ERR(sydev->regmap), + "failed to init regmap\n"); + + /* Get and enable regulators */ + ret = devm_regulator_get_enable(dev, "vddio"); + if (ret) + return dev_err_probe(dev, ret, "failed to get regulator\n"); + + fsleep(100); + + /* Get enable GPIO and set to high */ + sydev->gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); + if (IS_ERR(sydev->gpio)) + return dev_err_probe(dev, PTR_ERR(sydev->gpio), + "failed to get enable GPIO\n"); + + /* Let some time for HW to settle */ + fsleep(10000); + + /* try read and check device id */ + ret = regmap_read(sydev->regmap, REG_DEV_ID, &dev_id); + if (ret < 0) + return dev_err_probe(dev, ret, "failed to read device id\n"); + if (dev_id != 0x63) { + dev_err(dev, "unexpected device id: 0x%02x\n", dev_id); + return -ENODEV; + } + + /* Initialize and set default brightness */ + ret = sy7758_init(sydev); + if (ret) + return ret; + + props.type = BACKLIGHT_RAW; + props.max_brightness = MAX_BRIGHTNESS; + props.brightness = DEFAULT_BRIGHTNESS; + props.scale = BACKLIGHT_SCALE_LINEAR; + + sydev->bl = devm_backlight_device_register(dev, "sy7758-backlight", + dev, sydev, &sy7758_backlight_ops, + &props); + if (IS_ERR(sydev->bl)) + return dev_err_probe(dev, PTR_ERR(sydev->bl), + "failed to register backlight device\n"); + + return backlight_update_status(sydev->bl); +} + +static void sy7758_remove(struct i2c_client *client) +{ + struct sy7758 *sydev = i2c_get_clientdata(client); + + backlight_disable(sydev->bl); +} + +static const struct i2c_device_id sy7758_ids[] = { + { "sy7758" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, sy7758_ids); + +static const struct of_device_id sy7758_match_table[] = { + { .compatible = "silergy,sy7758", }, + { }, +}; +MODULE_DEVICE_TABLE(of, sy7758_match_table); + +static struct i2c_driver sy7758_driver = { + .driver = { + .name = "sy7758", + .of_match_table = sy7758_match_table, + }, + .probe = sy7758_probe, + .remove = sy7758_remove, + .id_table = sy7758_ids, +}; + +module_i2c_driver(sy7758_driver); + +MODULE_DESCRIPTION("Silergy SY7758 Backlight Driver"); +MODULE_AUTHOR("Kancy Joe <kancy2333@outlook.com>"); +MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>"); +MODULE_LICENSE("GPL"); -- 2.34.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support 2026-05-21 8:08 ` [PATCH v4 2/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong @ 2026-05-21 8:45 ` sashiko-bot 0 siblings, 0 replies; 6+ messages in thread From: sashiko-bot @ 2026-05-21 8:45 UTC (permalink / raw) To: Neil Armstrong; +Cc: robh, conor+dt, devicetree Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider: - [High] The driver incorrectly uses regmap_write() to update specific fields in configuration registers, wiping out unreferenced bitfields. - [High] The 'enable' GPIO is driven HIGH during probe but never explicitly set LOW during removal or on probe failure, causing hardware resource leaks and potential electrical back-powering. - [Medium] Critical hardware configuration is lost across system suspend/resume cycles. - [Medium] Non-atomic updates to the 12-bit brightness registers may cause visible backlight flicker. -- commit 98100c9f3380a75d76d0213c9564c18833a54b8e Author: KancyJoe <kancy2333@outlook.com> backlight: Add SY7758 6-channel High Efficiency LED Driver support This commit implements support for the Silergy SY7758 6-channel High Efficiency LED Driver used for backlight brightness control in the Ayaneo Pocket S2 dual-DSI panel. > diff --git a/drivers/video/backlight/sy7758.c b/drivers/video/backlight/sy7758.c > new file mode 100644 > index 0000000000000..198d559394389 > --- /dev/null > +++ b/drivers/video/backlight/sy7758.c [ ... ] > +static int sy7758_backlight_update_status(struct backlight_device *backlight_dev) > +{ > + struct sy7758 *sydev = bl_get_data(backlight_dev); > + unsigned int brightness = backlight_get_brightness(backlight_dev); > + int ret; > + > + ret = regmap_write(sydev->regmap, REG_BRT_12BIT_L, > + FIELD_PREP(MSK_BRT_12BIT_L, > + brightness & 0xff)); > + if (ret) > + return ret; > + > + ret = regmap_write(sydev->regmap, REG_BRT_12BIT_H, > + FIELD_PREP(MSK_BRT_12BIT_H, > + (brightness >> 8) & 0xf)); [Severity: Medium] Will writing the LSB and MSB in separate I2C transactions cause visible flicker during smooth dimming? If the brightness transitions across a byte boundary (e.g., from 0x0FF to 0x100), writing the LSB first will momentarily set the hardware to 0x000 before the MSB write corrects it to 0x100. Unless the hardware specifically latches the value only when the MSB is written, could this use regmap_bulk_write() to update both contiguous registers atomically? > + if (ret) > + return ret; > + > + return 0; > +} > + > +static const struct backlight_ops sy7758_backlight_ops = { > + .options = BL_CORE_SUSPENDRESUME, [Severity: Medium] Since BL_CORE_SUSPENDRESUME is set, does the driver also need PM suspend/resume callbacks to restore the configuration registers? If the system cuts power to the controller during suspend, the initialization performed in sy7758_init() might be permanently lost upon resume, causing the device to operate with uninitialized or default settings. Could a regmap cache with regcache_sync() in a resume handler be used, or perhaps re-invoking sy7758_init() on resume? > + .update_status = sy7758_backlight_update_status, > +}; > + > +static int sy7758_init(struct sy7758 *sydev) > +{ > + int ret = 0; > + > + ret = regmap_write(sydev->regmap, REG_DEV_CTL, > + BIT_DEV_CTL_FAST | BIT_DEV_CTL_BL_CTLB | > + FIELD_PREP(MSK_DEV_CTL_BRT_MODE, 2)); [Severity: High] Does using regmap_write() here wipe out unreferenced bitfields in these configuration registers? Because regmap_write() replaces the entire register contents, it implicitly clears all unreferenced bitfields to 0. For example, in REG_OTP_CFG9 below, writing FIELD_PREP(MSK_CFG9_VBST_MAX, 4) forces JUMP_EN, JUMP_TH, and JUMP_VOLTAGE to 0, which might destroy their default or OTP-loaded values. Could this use regmap_update_bits() when modifying specific fields to preserve the state of other bits? > + if (ret) > + return ret; [ ... ] > +static int sy7758_probe(struct i2c_client *client) > +{ > + struct backlight_properties props = { }; > + struct device *dev = &client->dev; > + struct sy7758 *sydev; > + unsigned int dev_id; > + int ret; [ ... ] > + /* Get and enable regulators */ > + ret = devm_regulator_get_enable(dev, "vddio"); > + if (ret) > + return dev_err_probe(dev, ret, "failed to get regulator\n"); > + > + fsleep(100); > + > + /* Get enable GPIO and set to high */ > + sydev->gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); [Severity: High] Is the enable GPIO ever explicitly driven LOW during removal or on probe failure? During driver removal or probe failure, devres automatically calls gpiod_put(), which simply releases the software descriptor without actively driving the pin LOW. Immediately afterward, devres disables the vddio regulator. This sequence leaves the host driving a logic HIGH into the enable pin of an unpowered SY7758 controller, which violates electrical sequencing and might cause back-powering or hardware damage. Could the driver register a custom devm action (e.g., using devm_add_action_or_reset()) to explicitly set the GPIO to 0 before the regulator is disabled? > + if (IS_ERR(sydev->gpio)) > + return dev_err_probe(dev, PTR_ERR(sydev->gpio), > + "failed to get enable GPIO\n"); -- Sashiko AI review · https://sashiko.dev/#/patchset/20260521-topic-sm8650-ayaneo-pocket-s2-sy7758-v4-0-73c732615e4a@linaro.org?part=2 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-21 8:45 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-21 8:07 [PATCH v4 0/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong 2026-05-21 8:08 ` [PATCH v4 1/2] dt-bindings: leds: backlight: document the SY7758 6-channel High Efficiency LED Driver Neil Armstrong 2026-05-21 8:19 ` sashiko-bot 2026-05-21 8:33 ` Neil Armstrong 2026-05-21 8:08 ` [PATCH v4 2/2] backlight: Add SY7758 6-channel High Efficiency LED Driver support Neil Armstrong 2026-05-21 8:45 ` sashiko-bot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox