* [PATCH v2 0/2] Support for Osram as3668 LED driver
@ 2025-05-31 12:07 Lukas Timmermann
2025-05-31 12:07 ` [PATCH v2 1/2] leds: as3668: Driver for the ams Osram 4-channel i2c Lukas Timmermann
2025-05-31 12:07 ` [PATCH v2 2/2] dt-bindings: leds: Add new as3668 support Lukas Timmermann
0 siblings, 2 replies; 4+ messages in thread
From: Lukas Timmermann @ 2025-05-31 12:07 UTC (permalink / raw)
To: lee, pavel; +Cc: linux-leds, linux-kernel, Lukas Timmermann
This is v2 of the patch series adding support for the as3668 LED driver. I am sending v2 because I discovered major issues in v1 that required correction before review.
This patch adds basic support for the as3668 driver IC via I2C interface. The IC is capable of driving four individual LEDs up to 25.5mA per channel. Hardware blinking would be theoretically possible, but this chip only supports a few set on/off-delays which makes using that feature unfeasable, therefore my driver doesn't offer that capability. It's intended applications is in mobile devices such as phones, tablets and cameras. This driver was tested and is working on a samsung-manta which is running postmarketOS with a near mainline kernel.
Please note: This is my first suggested patch to the kernel. checkpatch.pl runs without warnings or errors. I've read the docs in regards to the led subsystem, coding style and submission of patches, but I'm still a bit unsure about the general workflow. I will try my best.
Changes in v2:
- Fixed reading led subnodes in dt incorrectly, which caused wrong numbering and a segfault when removing the driver module
- Fixed calling of_property_read_u8 with an int, causing a compiler error
- Added more error checking during writes to the i2c bus
- Link to v1: https://lore.kernel.org/linux-leds/20250530184219.78085-3-linux@timmermann.space/
Lukas Timmermann (2):
leds: as3668: Driver for the ams Osram 4-channel i2c LED driver
dt-bindings: leds: Add new as3668 support
.../devicetree/bindings/leds/leds-as3668.yaml | 76 +++++++
drivers/leds/Kconfig | 10 +
drivers/leds/Makefile | 1 +
drivers/leds/leds-as3668.c | 192 ++++++++++++++++++
4 files changed, 279 insertions(+)
create mode 100644 Documentation/devicetree/bindings/leds/leds-as3668.yaml
create mode 100644 drivers/leds/leds-as3668.c
--
2.49.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/2] leds: as3668: Driver for the ams Osram 4-channel i2c
2025-05-31 12:07 [PATCH v2 0/2] Support for Osram as3668 LED driver Lukas Timmermann
@ 2025-05-31 12:07 ` Lukas Timmermann
2025-05-31 12:07 ` [PATCH v2 2/2] dt-bindings: leds: Add new as3668 support Lukas Timmermann
1 sibling, 0 replies; 4+ messages in thread
From: Lukas Timmermann @ 2025-05-31 12:07 UTC (permalink / raw)
To: lee, pavel; +Cc: linux-leds, linux-kernel, Lukas Timmermann
From: Lukas Timmermann <lukas@timmermann.space>
This is the actual driver for the as3668.
There were no related drivers in the kernel until now, so I created a new file. I've checked around for relatives of the as3668 but all of them are quite different, which is why wrote the driver just for the as3668.
---
drivers/leds/Kconfig | 10 ++
drivers/leds/Makefile | 1 +
drivers/leds/leds-as3668.c | 192 +++++++++++++++++++++++++++++++++++++
3 files changed, 203 insertions(+)
create mode 100644 drivers/leds/leds-as3668.c
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index a104cbb0a001..56477c170f0a 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -100,6 +100,16 @@ config LEDS_ARIEL
Say Y to if your machine is a Dell Wyse 3020 thin client.
+config LEDS_AS3668
+ tristate "LED support for AMS AS3668"
+ depends on LEDS_CLASS
+ depends on I2C
+ help
+ This option enables support for the AMS AS3668 LED controller.
+
+ To compile this driver as a module, choose M here: the module
+ will be called leds-as3668.
+
config LEDS_AW200XX
tristate "LED support for Awinic AW20036/AW20054/AW20072/AW20108"
depends on LEDS_CLASS
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 2f170d69dcbf..983811384fec 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o
obj-$(CONFIG_LEDS_AN30259A) += leds-an30259a.o
obj-$(CONFIG_LEDS_APU) += leds-apu.o
obj-$(CONFIG_LEDS_ARIEL) += leds-ariel.o
+obj-$(CONFIG_LEDS_AS3668) += leds-as3668.o
obj-$(CONFIG_LEDS_AW200XX) += leds-aw200xx.o
obj-$(CONFIG_LEDS_AW2013) += leds-aw2013.o
obj-$(CONFIG_LEDS_BCM6328) += leds-bcm6328.o
diff --git a/drivers/leds/leds-as3668.c b/drivers/leds/leds-as3668.c
new file mode 100644
index 000000000000..0168e1d89e9e
--- /dev/null
+++ b/drivers/leds/leds-as3668.c
@@ -0,0 +1,192 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Osram AMS AS3668 LED Driver IC
+ *
+ * Copyright (C) 2025 Lukas Timmermann <linux@timmermann.space>
+ */
+
+#include <linux/i2c.h>
+#include <linux/leds.h>
+#include <linux/module.h>
+#include <linux/uleds.h>
+
+#define AS3668_MAX_LEDS 4
+
+/* Chip Registers */
+#define AS3668_CHIP_ID1 0x3e
+#define AS3668_CHIP_ID2 0x3f
+
+#define AS3668_CHIP_ID2_SERIAL_MASK GENMASK(7, 4)
+#define AS3668_CHIP_ID2_REV_MASK GENMASK(3, 0)
+
+#define AS3668_CURRX_CONTROL 0x01
+#define AS3668_CURR1 0x02
+#define AS3668_CURR2 0x03
+#define AS3668_CURR3 0x04
+#define AS3668_CURR4 0x05
+
+/* Constants */
+#define AS3668_CHIP_IDENT 0xa5
+#define AS3668_CHIP_REV1 0x01
+
+struct as3668_led {
+ struct led_classdev cdev;
+ struct as3668 *chip;
+ struct fwnode_handle *fwnode;
+
+ int num;
+};
+
+struct as3668 {
+ struct i2c_client *client;
+ struct as3668_led leds[AS3668_MAX_LEDS];
+};
+
+static int as3668_read_value(struct i2c_client *client, u8 reg)
+{
+ return i2c_smbus_read_byte_data(client, reg);
+}
+
+static int as3668_write_value(struct i2c_client *client, u8 reg, u8 value)
+{
+ int err = i2c_smbus_write_byte_data(client, reg, value);
+
+ if (err)
+ dev_err(&client->dev, "error writing to reg 0x%tx, returned %d", reg, err);
+
+ return err;
+}
+
+static enum led_brightness as3668_brightness_get(struct led_classdev *cdev)
+{
+ struct as3668_led *led = container_of(cdev, struct as3668_led, cdev);
+
+ return as3668_read_value(led->chip->client, AS3668_CURR1 + led->num);
+}
+
+static void as3668_brightness_set(struct led_classdev *cdev, enum led_brightness brightness)
+{
+ struct as3668_led *led = container_of(cdev, struct as3668_led, cdev);
+
+ as3668_write_value(led->chip->client, AS3668_CURR1 + led->num, brightness);
+}
+
+static int as3668_dt_init(struct as3668 *as3668)
+{
+ struct device *dev = &as3668->client->dev;
+ struct as3668_led *led;
+ struct led_init_data init_data = {};
+ int err;
+ u32 reg;
+ int i = 0;
+
+ for_each_available_child_of_node_scoped(dev_of_node(dev), child) {
+ err = of_property_read_u32(child, "reg", ®);
+ if (err)
+ dev_err(dev, "unable to read device tree led reg, err %d", err);
+
+ i = reg;
+
+ if (i < 0 || i > AS3668_MAX_LEDS) {
+ dev_err(dev, "unsupported led reg %d\n", i);
+ return -EOPNOTSUPP;
+ }
+
+ led = &as3668->leds[i];
+ led->fwnode = of_fwnode_handle(child);
+
+ led->num = i;
+ led->chip = as3668;
+
+ led->cdev.max_brightness = U8_MAX;
+ led->cdev.brightness_get = as3668_brightness_get;
+ led->cdev.brightness_set = as3668_brightness_set;
+
+ init_data.fwnode = led->fwnode;
+ init_data.default_label = ":";
+
+ err = devm_led_classdev_register_ext(dev, &led->cdev, &init_data);
+ if (err) {
+ dev_err(dev, "failed to register %d LED\n", i);
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+static int as3668_probe(struct i2c_client *client)
+{
+ u8 chip_id1, chip_id2, chip_serial, chip_rev;
+ struct as3668 *as3668;
+
+ /* Check for sensible i2c address */
+ if (client->addr != 0x42)
+ return dev_err_probe(&client->dev, -EFAULT, "unexpected address for as3668 device\n");
+
+ /* Read identifier from chip */
+ chip_id1 = as3668_read_value(client, AS3668_CHIP_ID1);
+
+ if (chip_id1 != AS3668_CHIP_IDENT)
+ return dev_err_probe(&client->dev, -ENODEV, "chip reported wrong id: 0x%tx\n", chip_id1);
+
+ /* Check the revision*/
+ chip_id2 = as3668_read_value(client, AS3668_CHIP_ID2);
+ chip_serial = FIELD_GET(AS3668_CHIP_ID2_SERIAL_MASK, chip_id2);
+ chip_rev = FIELD_GET(AS3668_CHIP_ID2_REV_MASK, chip_id2);
+
+ if (chip_rev != AS3668_CHIP_REV1)
+ dev_warn(&client->dev, "unexpected chip revision\n");
+
+ /* Print out information about the chip */
+ dev_dbg(&client->dev, "chip_id: 0x%tx | chip_id2: 0x%tx | chip_serial: 0x%tx | chip_rev: 0x%tx\n", chip_id1, chip_id2, chip_serial, chip_rev);
+
+ as3668 = devm_kzalloc(&client->dev, struct_size(as3668, leds, AS3668_MAX_LEDS), GFP_KERNEL);
+ as3668->client = client;
+
+ as3668_dt_init(as3668);
+
+ /* Initialize the chip */
+ as3668_write_value(client, AS3668_CURRX_CONTROL, 0x55);
+ as3668_write_value(client, AS3668_CURR1, 0x00);
+ as3668_write_value(client, AS3668_CURR2, 0x00);
+ as3668_write_value(client, AS3668_CURR3, 0x00);
+ as3668_write_value(client, AS3668_CURR4, 0x00);
+
+ return 0;
+}
+
+static void as3668_remove(struct i2c_client *client)
+{
+ as3668_write_value(client, AS3668_CURRX_CONTROL, 0x0);
+}
+
+static const struct i2c_device_id as3668_idtable[] = {
+ {"as3668"},
+ {}
+};
+
+MODULE_DEVICE_TABLE(i2c, as3668_idtable);
+
+static const struct of_device_id as3668_match_table[] = {
+ {.compatible = "ams,as3668"},
+ {}
+};
+
+MODULE_DEVICE_TABLE(of, as3668_match_table);
+
+static struct i2c_driver as3668_driver = {
+ .driver = {
+ .name = "leds_as3668",
+ .of_match_table = as3668_match_table,
+ },
+ .probe = as3668_probe,
+ .remove = as3668_remove,
+ .id_table = as3668_idtable,
+};
+
+module_i2c_driver(as3668_driver);
+
+MODULE_AUTHOR("Lukas Timmermann <linux@timmermann.space>");
+MODULE_DESCRIPTION("AS3668 LED driver");
+MODULE_LICENSE("GPL");
--
2.49.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] dt-bindings: leds: Add new as3668 support
2025-05-31 12:07 [PATCH v2 0/2] Support for Osram as3668 LED driver Lukas Timmermann
2025-05-31 12:07 ` [PATCH v2 1/2] leds: as3668: Driver for the ams Osram 4-channel i2c Lukas Timmermann
@ 2025-05-31 12:07 ` Lukas Timmermann
2025-05-31 12:47 ` Krzysztof Kozlowski
1 sibling, 1 reply; 4+ messages in thread
From: Lukas Timmermann @ 2025-05-31 12:07 UTC (permalink / raw)
To: lee, pavel; +Cc: linux-leds, linux-kernel, Lukas Timmermann
From: Lukas Timmermann <lukas@timmermann.space>
Document Osram as3668 LED driver devicetree bindings.
---
.../devicetree/bindings/leds/leds-as3668.yaml | 76 +++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 Documentation/devicetree/bindings/leds/leds-as3668.yaml
diff --git a/Documentation/devicetree/bindings/leds/leds-as3668.yaml b/Documentation/devicetree/bindings/leds/leds-as3668.yaml
new file mode 100644
index 000000000000..aae6248f5712
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-as3668.yaml
@@ -0,0 +1,76 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/leds-as3668.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Osram 4-channel i2c LED driver.
+
+maintainers:
+ - Lukas Timmermann <linux@timmermann.space>
+
+description: |
+ This IC can drive up to four separate LEDs.
+ Having four channels suggests it could be used with a single RGBW LED.
+
+properties:
+ compatible:
+ const: ams,as3668
+
+ reg:
+ maxItems: 1
+ description:
+ I2C slave address
+
+ "#address-cells":
+ const: 1
+
+ "#size-cells":
+ const: 0
+
+patternProperties:
+ "^led@[0-3]$":
+ type: object
+ $ref: common.yaml#
+ unevaluatedProperties: false
+
+ properties:
+ reg:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+ - "#address-cells"
+ - "#size-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/leds/common.h>
+
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ led-controller@42 {
+ compatible = "ams,as3668";
+ reg = <0x42>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ led@0 {
+ reg = <0x0>;
+ function = LED_FUNCTION_STATUS;
+ color = <LED_COLOR_ID_RED>;
+ };
+
+ led@1 {
+ reg = <0x1>;
+ function = LED_FUNCTION_STATUS;
+ color = <LED_COLOR_ID_GREEN>;
+ };
+ };
+ };
+
--
2.49.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/2] dt-bindings: leds: Add new as3668 support
2025-05-31 12:07 ` [PATCH v2 2/2] dt-bindings: leds: Add new as3668 support Lukas Timmermann
@ 2025-05-31 12:47 ` Krzysztof Kozlowski
0 siblings, 0 replies; 4+ messages in thread
From: Krzysztof Kozlowski @ 2025-05-31 12:47 UTC (permalink / raw)
To: Lukas Timmermann, lee, pavel; +Cc: linux-leds, linux-kernel, Lukas Timmermann
On 31/05/2025 14:07, Lukas Timmermann wrote:
> From: Lukas Timmermann <lukas@timmermann.space>
>
> Document Osram as3668 LED driver devicetree bindings.
Please run scripts/checkpatch.pl on the patches and fix reported
warnings. After that, run also 'scripts/checkpatch.pl --strict' on the
patches and (probably) fix more warnings. Some warnings can be ignored,
especially from --strict run, but the code here looks like it needs a
fix. Feel free to get in touch if the warning is not clear.
<form letter>
Please use scripts/get_maintainers.pl to get a list of necessary people
and lists to CC. It might happen, that command when run on an older
kernel, gives you outdated entries. Therefore please be sure you base
your patches on recent Linux kernel.
Tools like b4 or scripts/get_maintainer.pl provide you proper list of
people, so fix your workflow. Tools might also fail if you work on some
ancient tree (don't, instead use mainline) or work on fork of kernel
(don't, instead use mainline). Just use b4 and everything should be
fine, although remember about `b4 prep --auto-to-cc` if you added new
patches to the patchset.
You missed at least devicetree list (maybe more), so this won't be
tested by automated tooling. Performing review on untested code might be
a waste of time.
Please kindly resend and include all necessary To/Cc entries.
</form letter>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-05-31 12:47 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-31 12:07 [PATCH v2 0/2] Support for Osram as3668 LED driver Lukas Timmermann
2025-05-31 12:07 ` [PATCH v2 1/2] leds: as3668: Driver for the ams Osram 4-channel i2c Lukas Timmermann
2025-05-31 12:07 ` [PATCH v2 2/2] dt-bindings: leds: Add new as3668 support Lukas Timmermann
2025-05-31 12:47 ` Krzysztof Kozlowski
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).