* [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 @ 2024-03-10 13:52 Patrick Gansterer 2024-03-10 13:52 ` [PATCH v4 2/2] backlight: Add new lm3509 backlight driver Patrick Gansterer 2024-03-25 11:06 ` [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 Daniel Thompson 0 siblings, 2 replies; 4+ messages in thread From: Patrick Gansterer @ 2024-03-10 13:52 UTC (permalink / raw) To: dri-devel, devicetree Cc: Lee Jones, Daniel Thompson, Jingoo Han, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Patrick Gansterer, Krzysztof Kozlowski Add Device Tree bindings for Texas Instruments LM3509 - a High Efficiency Boost for White LED's and/or OLED Displays Signed-off-by: Patrick Gansterer <paroga@paroga.com> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> --- Changes in v4: Use backlight_*() to access backlight_device Do not set backlight_properties.power v3: https://lore.kernel.org/all/20240309132521.1290173-1-paroga@paroga.com/ Changes in v3: Improved device tree bindings documentation v2: https://lore.kernel.org/all/20240308215617.1729664-1-paroga@paroga.com/ Changes in v2: Add device tree nodes for each output Addressed multiple smaller review comments v1: https://lore.kernel.org/all/20240302212757.1871164-1-paroga@paroga.com/ .../bindings/leds/backlight/ti,lm3509.yaml | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 Documentation/devicetree/bindings/leds/backlight/ti,lm3509.yaml diff --git a/Documentation/devicetree/bindings/leds/backlight/ti,lm3509.yaml b/Documentation/devicetree/bindings/leds/backlight/ti,lm3509.yaml new file mode 100644 index 000000000000..b67f67648852 --- /dev/null +++ b/Documentation/devicetree/bindings/leds/backlight/ti,lm3509.yaml @@ -0,0 +1,139 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/leds/backlight/ti,lm3509.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: TI LM3509 High Efficiency Boost for White LED's and/or OLED Displays + +maintainers: + - Patrick Gansterer <paroga@paroga.com> + +description: + The LM3509 current mode boost converter offers two separate outputs. + https://www.ti.com/product/LM3509 + +properties: + compatible: + const: ti,lm3509 + + reg: + maxItems: 1 + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + reset-gpios: + maxItems: 1 + + ti,brightness-rate-of-change-us: + description: Brightness Rate of Change in microseconds. + enum: [51, 13000, 26000, 52000] + + ti,oled-mode: + description: Enable OLED mode. + type: boolean + +patternProperties: + "^led@[01]$": + type: object + description: Properties for a string of connected LEDs. + + allOf: + - $ref: common.yaml# + + properties: + reg: + description: + The control register that is used to program the two current sinks. + The LM3509 has two registers (BMAIN and BSUB) and are represented + as 0 or 1 in this property. The two current sinks can be controlled + independently with both registers, or register BMAIN can be + configured to control both sinks with the led-sources property. + minimum: 0 + maximum: 1 + + label: true + + led-sources: + allOf: + - minItems: 1 + maxItems: 2 + items: + minimum: 0 + maximum: 1 + + default-brightness: + minimum: 0 + maximum: 31 + default: 18 + + max-brightness: + minimum: 0 + maximum: 31 + default: 31 + + required: + - reg + + additionalProperties: false + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + i2c { + #address-cells = <1>; + #size-cells = <0>; + + backlight@36 { + compatible = "ti,lm3509"; + reg = <0x36>; + reset-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; + + ti,oled-mode; + ti,brightness-rate-of-change-us = <52000>; + + #address-cells = <1>; + #size-cells = <0>; + + led@0 { + reg = <0>; + led-sources = <0 1>; + label = "lcd-backlight"; + default-brightness = <12>; + max-brightness = <31>; + }; + }; + }; + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + + backlight@36 { + compatible = "ti,lm3509"; + reg = <0x36>; + + #address-cells = <1>; + #size-cells = <0>; + + led@0 { + reg = <0>; + default-brightness = <12>; + }; + + led@1 { + reg = <1>; + default-brightness = <15>; + }; + }; + }; -- 2.44.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 2/2] backlight: Add new lm3509 backlight driver 2024-03-10 13:52 [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 Patrick Gansterer @ 2024-03-10 13:52 ` Patrick Gansterer 2024-03-25 11:28 ` Daniel Thompson 2024-03-25 11:06 ` [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 Daniel Thompson 1 sibling, 1 reply; 4+ messages in thread From: Patrick Gansterer @ 2024-03-10 13:52 UTC (permalink / raw) To: dri-devel, devicetree Cc: Lee Jones, Daniel Thompson, Jingoo Han, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Patrick Gansterer This is a general driver for LM3509 backlight chip of TI. LM3509 is High Efficiency Boost for White LEDs and/or OLED Displays with Dual Current Sinks. This driver supports OLED/White LED select, brightness control and sub/main control. The datasheet can be found at http://www.ti.com/product/lm3509. Signed-off-by: Patrick Gansterer <paroga@paroga.com> --- drivers/video/backlight/Kconfig | 7 + drivers/video/backlight/Makefile | 1 + drivers/video/backlight/lm3509_bl.c | 338 ++++++++++++++++++++++++++++ 3 files changed, 346 insertions(+) create mode 100644 drivers/video/backlight/lm3509_bl.c diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index ea2d0d69bd8c..96ad5dc584b6 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -366,6 +366,13 @@ config BACKLIGHT_AAT2870 If you have a AnalogicTech AAT2870 say Y to enable the backlight driver. +config BACKLIGHT_LM3509 + tristate "Backlight Driver for LM3509" + depends on I2C + select REGMAP_I2C + help + This supports TI LM3509 Backlight Driver + config BACKLIGHT_LM3630A tristate "Backlight Driver for LM3630A" depends on I2C && PWM diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 06966cb20459..51a4ac5d0530 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -35,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o obj-$(CONFIG_BACKLIGHT_KTD253) += ktd253-backlight.o obj-$(CONFIG_BACKLIGHT_KTZ8866) += ktz8866.o +obj-$(CONFIG_BACKLIGHT_LM3509) += lm3509_bl.o obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o diff --git a/drivers/video/backlight/lm3509_bl.c b/drivers/video/backlight/lm3509_bl.c new file mode 100644 index 000000000000..696ec8aab6aa --- /dev/null +++ b/drivers/video/backlight/lm3509_bl.c @@ -0,0 +1,338 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include <linux/backlight.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/regmap.h> + +#define LM3509_NAME "lm3509_bl" + +#define LM3509_SINK_MAIN 0 +#define LM3509_SINK_SUB 1 +#define LM3509_NUM_SINKS 2 + +#define LM3509_DEF_BRIGHTNESS 0x12 +#define LM3509_MAX_BRIGHTNESS 0x1F + +#define REG_GP 0x10 +#define REG_BMAIN 0xA0 +#define REG_BSUB 0xB0 +#define REG_MAX 0xFF + +enum { + REG_GP_ENM_BIT = 0, + REG_GP_ENS_BIT, + REG_GP_UNI_BIT, + REG_GP_RMP0_BIT, + REG_GP_RMP1_BIT, + REG_GP_OLED_BIT, +}; + +struct lm3509_bl { + struct regmap *regmap; + struct backlight_device *bl_main; + struct backlight_device *bl_sub; + struct gpio_desc *reset_gpio; +}; + +struct lm3509_bl_led_pdata { + const char *label; + int led_sources; + u32 brightness; + u32 max_brightness; +}; + +static void lm3509_reset(struct lm3509_bl *data) +{ + if (data->reset_gpio) { + gpiod_set_value(data->reset_gpio, 1); + udelay(1); + gpiod_set_value(data->reset_gpio, 0); + udelay(10); + } +} + +static int lm3509_update_status(struct backlight_device *bl, + unsigned int en_mask, unsigned int br_reg) +{ + struct lm3509_bl *data = bl_get_data(bl); + int ret; + bool en; + + ret = regmap_write(data->regmap, br_reg, backlight_get_brightness(bl)); + if (ret < 0) + return ret; + + en = !backlight_is_blank(bl); + return regmap_update_bits(data->regmap, REG_GP, en_mask, + en ? en_mask : 0); +} + +static int lm3509_main_update_status(struct backlight_device *bl) +{ + return lm3509_update_status(bl, BIT(REG_GP_ENM_BIT), REG_BMAIN); +} + +static const struct backlight_ops lm3509_main_ops = { + .options = BL_CORE_SUSPENDRESUME, + .update_status = lm3509_main_update_status, +}; + +static int lm3509_sub_update_status(struct backlight_device *bl) +{ + return lm3509_update_status(bl, BIT(REG_GP_ENS_BIT), REG_BSUB); +} + +static const struct backlight_ops lm3509_sub_ops = { + .options = BL_CORE_SUSPENDRESUME, + .update_status = lm3509_sub_update_status, +}; + +static struct backlight_device * +lm3509_backlight_register(struct device *dev, const char *name_suffix, + struct lm3509_bl *data, + const struct backlight_ops *ops, + const struct lm3509_bl_led_pdata *pdata) + +{ + struct backlight_device *bd; + struct backlight_properties props; + const char *label = pdata->label; + char name[64]; + + memset(&props, 0, sizeof(props)); + props.type = BACKLIGHT_RAW; + props.brightness = pdata->brightness; + props.max_brightness = pdata->max_brightness; + + if (!label) { + snprintf(name, sizeof(name), "lm3509-%s-%s", dev_name(dev), + name_suffix); + label = name; + } + + bd = devm_backlight_device_register(dev, label, dev, data, ops, &props); + if (bd) + backlight_update_status(bd); + + return bd; +} + +static const struct regmap_config lm3509_regmap = { + .reg_bits = 8, + .val_bits = 8, + .max_register = REG_MAX, +}; + +static int lm3509_parse_led_sources(struct device_node *node, + int default_led_sources) +{ + u32 sources[LM3509_NUM_SINKS]; + int ret, num_sources, i; + + num_sources = of_property_count_u32_elems(node, "led-sources"); + if (num_sources < 0) + return default_led_sources; + else if (num_sources > ARRAY_SIZE(sources)) + return -EINVAL; + + ret = of_property_read_u32_array(node, "led-sources", sources, + num_sources); + if (ret) + return ret; + + for (i = 0; i < num_sources; i++) { + if (sources[i] >= LM3509_NUM_SINKS) + return -EINVAL; + + ret |= BIT(sources[i]); + } + + return ret; +} + +static int lm3509_parse_dt_node(struct device *dev, + struct lm3509_bl_led_pdata *pdata) +{ + struct device_node *child; + int seen_led_sources = 0; + + for_each_child_of_node(dev->of_node, child) { + struct lm3509_bl_led_pdata *pd; + int ret; + u32 reg; + int valid_led_sources; + + ret = of_property_read_u32(child, "reg", ®); + if (ret < 0) + return ret; + if (reg >= LM3509_NUM_SINKS) + return -EINVAL; + pd = &pdata[reg]; + + pd->led_sources = lm3509_parse_led_sources(child, BIT(reg)); + if (pd->led_sources < 0) + return pd->led_sources; + + if (reg == 0) + valid_led_sources = BIT(LM3509_SINK_MAIN) | + BIT(LM3509_SINK_SUB); + else + valid_led_sources = BIT(LM3509_SINK_SUB); + + if (pd->led_sources != (pd->led_sources & valid_led_sources)) + return -EINVAL; + + if (seen_led_sources & pd->led_sources) + return -EINVAL; + + seen_led_sources |= pd->led_sources; + + pd->label = NULL; + of_property_read_string(child, "label", &pd->label); + + pd->max_brightness = LM3509_MAX_BRIGHTNESS; + of_property_read_u32(child, "max-brightness", + &pd->max_brightness); + pd->max_brightness = + min_t(u32, pd->max_brightness, LM3509_MAX_BRIGHTNESS); + + pd->brightness = LM3509_DEF_BRIGHTNESS; + of_property_read_u32(child, "default-brightness", + &pd->brightness); + pd->brightness = min_t(u32, pd->brightness, pd->max_brightness); + } + + return 0; +} + +static int lm3509_probe(struct i2c_client *client) +{ + struct lm3509_bl *data; + struct device *dev = &client->dev; + int ret; + bool oled_mode = false; + unsigned int reg_gp_val = 0; + struct lm3509_bl_led_pdata pdata[LM3509_NUM_SINKS]; + u32 rate_of_change = 0; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(dev, "i2c functionality check failed\n"); + return -EOPNOTSUPP; + } + + data = devm_kzalloc(dev, sizeof(struct lm3509_bl), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->regmap = devm_regmap_init_i2c(client, &lm3509_regmap); + if (IS_ERR(data->regmap)) + return PTR_ERR(data->regmap); + i2c_set_clientdata(client, data); + + data->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(data->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(data->reset_gpio), + "Failed to get 'reset' gpio\n"); + + lm3509_reset(data); + + memset(pdata, 0, sizeof(pdata)); + ret = lm3509_parse_dt_node(dev, pdata); + if (ret) + return ret; + + oled_mode = of_property_read_bool(dev->of_node, "ti,oled-mode"); + + if (!of_property_read_u32(dev->of_node, + "ti,brightness-rate-of-change-us", + &rate_of_change)) { + switch (rate_of_change) { + case 51: + reg_gp_val = 0; + break; + case 13000: + reg_gp_val = BIT(REG_GP_RMP1_BIT); + break; + case 26000: + reg_gp_val = BIT(REG_GP_RMP0_BIT); + break; + case 52000: + reg_gp_val = BIT(REG_GP_RMP0_BIT) | + BIT(REG_GP_RMP1_BIT); + break; + default: + dev_warn(dev, "invalid rate of change %u\n", + rate_of_change); + break; + } + } + + if (pdata[0].led_sources == + (BIT(LM3509_SINK_MAIN) | BIT(LM3509_SINK_SUB))) + reg_gp_val |= BIT(REG_GP_UNI_BIT); + if (oled_mode) + reg_gp_val |= BIT(REG_GP_OLED_BIT); + + ret = regmap_write(data->regmap, REG_GP, reg_gp_val); + if (ret < 0) + return ret; + + if (pdata[0].led_sources) { + data->bl_main = lm3509_backlight_register( + dev, "main", data, &lm3509_main_ops, &pdata[0]); + if (IS_ERR(data->bl_main)) { + dev_err(dev, "failed to register main backlight\n"); + return PTR_ERR(data->bl_main); + } + } + + if (pdata[1].led_sources) { + data->bl_sub = lm3509_backlight_register( + dev, "sub", data, &lm3509_sub_ops, &pdata[1]); + if (IS_ERR(data->bl_sub)) { + dev_err(dev, + "failed to register secondary backlight\n"); + return PTR_ERR(data->bl_sub); + } + } + + return 0; +} + +static void lm3509_remove(struct i2c_client *client) +{ + struct lm3509_bl *data = i2c_get_clientdata(client); + + regmap_write(data->regmap, REG_GP, 0x00); +} + +static const struct i2c_device_id lm3509_id[] = { { LM3509_NAME, 0 }, {} }; + +MODULE_DEVICE_TABLE(i2c, lm3509_id); + +static const struct of_device_id lm3509_match_table[] = { + { + .compatible = "ti,lm3509", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, lm3509_match_table); + +static struct i2c_driver lm3509_i2c_driver = { + .driver = { + .name = LM3509_NAME, + .of_match_table = lm3509_match_table, + }, + .probe = lm3509_probe, + .remove = lm3509_remove, + .id_table = lm3509_id, +}; + +module_i2c_driver(lm3509_i2c_driver); + +MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3509"); +MODULE_AUTHOR("Patrick Gansterer <paroga@paroga.com>"); +MODULE_LICENSE("GPL"); -- 2.44.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 2/2] backlight: Add new lm3509 backlight driver 2024-03-10 13:52 ` [PATCH v4 2/2] backlight: Add new lm3509 backlight driver Patrick Gansterer @ 2024-03-25 11:28 ` Daniel Thompson 0 siblings, 0 replies; 4+ messages in thread From: Daniel Thompson @ 2024-03-25 11:28 UTC (permalink / raw) To: Patrick Gansterer Cc: dri-devel, devicetree, Lee Jones, Jingoo Han, Rob Herring, Krzysztof Kozlowski, Conor Dooley ^^^ Also not copied to LKML... On Sun, Mar 10, 2024 at 02:52:57PM +0100, Patrick Gansterer wrote: > This is a general driver for LM3509 backlight chip of TI. > LM3509 is High Efficiency Boost for White LEDs and/or OLED Displays with > Dual Current Sinks. This driver supports OLED/White LED select, brightness > control and sub/main control. > The datasheet can be found at http://www.ti.com/product/lm3509. > > Signed-off-by: Patrick Gansterer <paroga@paroga.com> Overall looks good but there are some review comments inline below. > diff --git a/drivers/video/backlight/lm3509_bl.c b/drivers/video/backlight/lm3509_bl.c > new file mode 100644 > index 000000000000..696ec8aab6aa > --- /dev/null > +++ b/drivers/video/backlight/lm3509_bl.c > @@ -0,0 +1,338 @@ > <snip> > +struct lm3509_bl { > + struct regmap *regmap; > + struct backlight_device *bl_main; > + struct backlight_device *bl_sub; > + struct gpio_desc *reset_gpio; > +}; > + > +struct lm3509_bl_led_pdata { What does the p stand for here? (only asking because pdata was the idiomatic form for platform data and this driver only uses DT-only so I'm finding pdata values everywhere really confusing) > + const char *label; > + int led_sources; > + u32 brightness; > + u32 max_brightness; > +}; > + > +static void lm3509_reset(struct lm3509_bl *data) > +{ > + if (data->reset_gpio) { > + gpiod_set_value(data->reset_gpio, 1); > + udelay(1); > + gpiod_set_value(data->reset_gpio, 0); > + udelay(10); > + } > +} > + > <snip> > + > +static struct backlight_device * > +lm3509_backlight_register(struct device *dev, const char *name_suffix, > + struct lm3509_bl *data, > + const struct backlight_ops *ops, > + const struct lm3509_bl_led_pdata *pdata) > + > +{ > + struct backlight_device *bd; > + struct backlight_properties props; > + const char *label = pdata->label; > + char name[64]; > + > + memset(&props, 0, sizeof(props)); > + props.type = BACKLIGHT_RAW; > + props.brightness = pdata->brightness; > + props.max_brightness = pdata->max_brightness; Please set props.scale appropriately for this device (given it only has 32 brightness levels I assume it is non-linear?). > + > + if (!label) { > + snprintf(name, sizeof(name), "lm3509-%s-%s", dev_name(dev), > + name_suffix); > + label = name; > + } > + > + bd = devm_backlight_device_register(dev, label, dev, data, ops, &props); > + if (bd) > + backlight_update_status(bd); > + > + return bd; > +} > + > <snip> > + > +static int lm3509_probe(struct i2c_client *client) > +{ > + struct lm3509_bl *data; > + struct device *dev = &client->dev; > + int ret; > + bool oled_mode = false; > + unsigned int reg_gp_val = 0; > + struct lm3509_bl_led_pdata pdata[LM3509_NUM_SINKS]; > + u32 rate_of_change = 0; > + > + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { > + dev_err(dev, "i2c functionality check failed\n"); > + return -EOPNOTSUPP; > + } > + > + data = devm_kzalloc(dev, sizeof(struct lm3509_bl), GFP_KERNEL); > + if (!data) > + return -ENOMEM; > + > + data->regmap = devm_regmap_init_i2c(client, &lm3509_regmap); > + if (IS_ERR(data->regmap)) > + return PTR_ERR(data->regmap); > + i2c_set_clientdata(client, data); > + > + data->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); > + if (IS_ERR(data->reset_gpio)) > + return dev_err_probe(dev, PTR_ERR(data->reset_gpio), > + "Failed to get 'reset' gpio\n"); > + > + lm3509_reset(data); > + > + memset(pdata, 0, sizeof(pdata)); > + ret = lm3509_parse_dt_node(dev, pdata); > + if (ret) > + return ret; > + > + oled_mode = of_property_read_bool(dev->of_node, "ti,oled-mode"); > + > + if (!of_property_read_u32(dev->of_node, > + "ti,brightness-rate-of-change-us", > + &rate_of_change)) { > + switch (rate_of_change) { > + case 51: > + reg_gp_val = 0; > + break; > + case 13000: > + reg_gp_val = BIT(REG_GP_RMP1_BIT); > + break; > + case 26000: > + reg_gp_val = BIT(REG_GP_RMP0_BIT); > + break; > + case 52000: > + reg_gp_val = BIT(REG_GP_RMP0_BIT) | > + BIT(REG_GP_RMP1_BIT); > + break; > + default: > + dev_warn(dev, "invalid rate of change %u\n", > + rate_of_change); > + break; > + } > + } > + > + if (pdata[0].led_sources == > + (BIT(LM3509_SINK_MAIN) | BIT(LM3509_SINK_SUB))) > + reg_gp_val |= BIT(REG_GP_UNI_BIT); > + if (oled_mode) > + reg_gp_val |= BIT(REG_GP_OLED_BIT); > + > + ret = regmap_write(data->regmap, REG_GP, reg_gp_val); > + if (ret < 0) > + return ret; Is this the first time we write to the peripheral? If so the error path is probably worth a dev_err_probe() (I don't think regmap_write() logs anything on failure to write). > + if (pdata[0].led_sources) { > + data->bl_main = lm3509_backlight_register( > + dev, "main", data, &lm3509_main_ops, &pdata[0]); > + if (IS_ERR(data->bl_main)) { > + dev_err(dev, "failed to register main backlight\n"); > + return PTR_ERR(data->bl_main); This should use dev_err_probe(). > + } > + } > + > + if (pdata[1].led_sources) { > + data->bl_sub = lm3509_backlight_register( > + dev, "sub", data, &lm3509_sub_ops, &pdata[1]); > + if (IS_ERR(data->bl_sub)) { > + dev_err(dev, > + "failed to register secondary backlight\n"); > + return PTR_ERR(data->bl_sub); Another good place for dev_err_probe(). Daniel. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 2024-03-10 13:52 [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 Patrick Gansterer 2024-03-10 13:52 ` [PATCH v4 2/2] backlight: Add new lm3509 backlight driver Patrick Gansterer @ 2024-03-25 11:06 ` Daniel Thompson 1 sibling, 0 replies; 4+ messages in thread From: Daniel Thompson @ 2024-03-25 11:06 UTC (permalink / raw) To: Patrick Gansterer Cc: dri-devel, devicetree, Lee Jones, Jingoo Han, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Krzysztof Kozlowski ^^^ Is there any reason this patch wasn't Cc:ed to LKML (it should have come up as part of scripts/get_maintainer.pl)? On Sun, Mar 10, 2024 at 02:52:56PM +0100, Patrick Gansterer wrote: > Add Device Tree bindings for Texas Instruments LM3509 - a > High Efficiency Boost for White LED's and/or OLED Displays > > Signed-off-by: Patrick Gansterer <paroga@paroga.com> > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > --- > Changes in v4: > Use backlight_*() to access backlight_device > Do not set backlight_properties.power This looks like a changelog for the patch set rather than for patch 1. Normally that would be posted in the covering letter rather than here. Nevertheless: Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> Daniel. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-03-25 11:28 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-03-10 13:52 [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 Patrick Gansterer 2024-03-10 13:52 ` [PATCH v4 2/2] backlight: Add new lm3509 backlight driver Patrick Gansterer 2024-03-25 11:28 ` Daniel Thompson 2024-03-25 11:06 ` [PATCH v4 1/2] dt-bindings: backlight: Add Texas Instruments LM3509 Daniel Thompson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).