All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC v2 0/3] leds: add support for apa102c leds
@ 2020-02-26 14:33 Nicolas Belin
  2020-02-26 14:33 ` [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix Nicolas Belin
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Nicolas Belin @ 2020-02-26 14:33 UTC (permalink / raw)
  To: linux-kernel, linux-leds, jacek.anaszewski, pavel, dmurphy, devicetree
  Cc: baylibre-upstreaming, Nicolas Belin

This patch series adds the driver and its related documentation 
for the APA102C RGB Leds. It is based on the Multicolor Framework and
must be applied on top of the Multicolor framework patches located at
https://lore.kernel.org/patchwork/project/lkml/list/?series=427513 .

Patch 1 adds the APA102C led manufacturer to the vendor-prefixes list.

Patch 2 Documents the APA102C led driver.

Patch 3 contains the actual driver code and modifications in the Kconfig 
and the Makefile.

Updates since v1:
- Moved the apa102c line in the Makefile to the LED SPI Drivers part
- The driver is now based on the Multicolor Framework.

Nicolas Belin (3):
  dt-bindings: Document shiji vendor-prefix
  dt-bindings: leds: Shiji Lighting APA102C LED driver
  drivers: leds: add support for apa102c leds

 .../devicetree/bindings/leds/leds-apa102c.yaml     | 154 +++++++++++
 .../devicetree/bindings/vendor-prefixes.yaml       |   2 +
 drivers/leds/Kconfig                               |   7 +
 drivers/leds/Makefile                              |   1 +
 drivers/leds/leds-apa102c.c                        | 291 +++++++++++++++++++++
 5 files changed, 455 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-apa102c.yaml
 create mode 100644 drivers/leds/leds-apa102c.c

-- 
2.7.4


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix
  2020-02-26 14:33 [PATCH RFC v2 0/3] leds: add support for apa102c leds Nicolas Belin
@ 2020-02-26 14:33 ` Nicolas Belin
  2020-03-03 14:29   ` Rob Herring
  2020-02-26 14:33 ` [PATCH RFC v2 2/3] dt-bindings: leds: Shiji Lighting APA102C LED driver Nicolas Belin
  2020-02-26 14:33 ` [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds Nicolas Belin
  2 siblings, 1 reply; 9+ messages in thread
From: Nicolas Belin @ 2020-02-26 14:33 UTC (permalink / raw)
  To: linux-kernel, linux-leds, jacek.anaszewski, pavel, dmurphy, devicetree
  Cc: baylibre-upstreaming, Nicolas Belin

Shenzhen Shiji Lighting Co.,Ltd is a LED manufacturer.

Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
---
 Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index 9e67944bec9c..a463286c3960 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -863,6 +863,8 @@ patternProperties:
     description: SGX Sensortech
   "^sharp,.*":
     description: Sharp Corporation
+  "^shiji,.*":
+    description: Shenzhen Shiji Lighting Co.,Ltd
   "^shimafuji,.*":
     description: Shimafuji Electric, Inc.
   "^si-en,.*":
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH RFC v2 2/3] dt-bindings: leds: Shiji Lighting APA102C LED driver
  2020-02-26 14:33 [PATCH RFC v2 0/3] leds: add support for apa102c leds Nicolas Belin
  2020-02-26 14:33 ` [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix Nicolas Belin
@ 2020-02-26 14:33 ` Nicolas Belin
  2020-02-26 21:56   ` Rob Herring
  2020-02-26 14:33 ` [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds Nicolas Belin
  2 siblings, 1 reply; 9+ messages in thread
From: Nicolas Belin @ 2020-02-26 14:33 UTC (permalink / raw)
  To: linux-kernel, linux-leds, jacek.anaszewski, pavel, dmurphy, devicetree
  Cc: baylibre-upstreaming, Nicolas Belin

Document Shiji Lighting APA102C LED driver device tree bindings.

Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
---
 .../devicetree/bindings/leds/leds-apa102c.yaml     | 154 +++++++++++++++++++++
 1 file changed, 154 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/leds/leds-apa102c.yaml

diff --git a/Documentation/devicetree/bindings/leds/leds-apa102c.yaml b/Documentation/devicetree/bindings/leds/leds-apa102c.yaml
new file mode 100644
index 000000000000..90c827ab5a5a
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-apa102c.yaml
@@ -0,0 +1,154 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/leds-apa102c.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: LED driver for Shiji Lighting - APA102C
+
+maintainers:
+  - Nicolas Belin <nbelin@baylibre.com>
+
+description:
+  Each RGB LED is represented as a multi-led sub-node of the leds-apa102c
+  device.  Each LED
+  is a three color rgb LED with 32 levels brightness adjustment that can be
+  cascaded so that multiple LEDs can be set with a single command.
+
+properties:
+  compatible:
+    const: shiji,apa102c
+
+  reg:
+    maxItems: 1
+
+  spi-max-frequency:
+    maximum: 1000000
+
+  "#address-cells":
+    const: 1
+
+  "#size-cells":
+    const: 0
+
+patternProperties:
+  "^multi-led@[0-9]+$":
+    type: object
+    description: |
+      Properties for an array of connected LEDs.
+
+    properties:
+      reg:
+        description: |
+          This property corresponds to the led index. It has to be between 0
+          and the number of managed leds minus 1
+        maxItems: 1
+
+      label:
+        description: |
+          This property corresponds to the name of the led. If not set,
+          the led index will be used to create the led name instead
+        maxItems: 1
+
+      color:
+        const: 8
+
+      linux,default-trigger: true
+
+      "#address-cells":
+        const: 1
+
+      "#size-cells":
+        const: 0
+
+    patternProperties:
+      "^led@[0-9]+$":
+        type: object
+        description: |
+          Properties for the LED color components.
+
+        properties:
+          reg:
+            maxItems: 1
+
+          color:
+            oneOf:
+              - enum: [ 1, 2, 3 ]
+
+        required:
+          - reg
+          - color
+
+    required:
+      - reg
+      - color
+      - '#address-cells'
+      - '#size-cells'
+
+required:
+  - compatible
+  - reg
+  - spi-max-frequency
+  - '#address-cells'
+  - '#size-cells'
+
+examples:
+  - |
+
+    #include <dt-bindings/leds/common.h>
+
+    spi {
+        #address-cells = <1>;
+        #size-cells = <0>;
+        led-controller@0 {
+            compatible = "shiji,apa102c";
+            reg = <0>;
+            spi-max-frequency = <1000000>;
+            #address-cells = <1>;
+            #size-cells = <0>;
+            multi-led@0 {
+                #address-cells = <1>;
+                #size-cells = <0>;
+                reg = <0>;
+                color = <LED_COLOR_ID_MULTI>;
+                label = "rgb_led1";
+
+                led@0 {
+                reg = <0>;
+                color = <LED_COLOR_ID_RED>;
+                };
+
+                led@1 {
+                reg = <1>;
+                color = <LED_COLOR_ID_GREEN>;
+                };
+
+                led@2 {
+                reg = <2>;
+                color = <LED_COLOR_ID_BLUE>;
+                };
+            };
+            multi-led@1 {
+                #address-cells = <1>;
+                #size-cells = <0>;
+                reg = <1>;
+                color = <LED_COLOR_ID_MULTI>;
+                label = "rgb_led2";
+
+                led@3 {
+                reg = <3>;
+                color = <LED_COLOR_ID_RED>;
+                };
+
+                led@4 {
+                reg = <4>;
+                color = <LED_COLOR_ID_GREEN>;
+                };
+
+                led@5 {
+                reg = <5>;
+                color = <LED_COLOR_ID_BLUE>;
+                };
+            };
+        };
+    };
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds
  2020-02-26 14:33 [PATCH RFC v2 0/3] leds: add support for apa102c leds Nicolas Belin
  2020-02-26 14:33 ` [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix Nicolas Belin
  2020-02-26 14:33 ` [PATCH RFC v2 2/3] dt-bindings: leds: Shiji Lighting APA102C LED driver Nicolas Belin
@ 2020-02-26 14:33 ` Nicolas Belin
  2020-02-26 20:13   ` Jacek Anaszewski
  2 siblings, 1 reply; 9+ messages in thread
From: Nicolas Belin @ 2020-02-26 14:33 UTC (permalink / raw)
  To: linux-kernel, linux-leds, jacek.anaszewski, pavel, dmurphy, devicetree
  Cc: baylibre-upstreaming, Nicolas Belin

Initilial commit in order to support the apa102c RGB leds. This
is based on the Multicolor Framework.

Reviewed-by: Corentin Labbe <clabbe@baylibre.com>
Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
---
 drivers/leds/Kconfig        |   7 ++
 drivers/leds/Makefile       |   1 +
 drivers/leds/leds-apa102c.c | 291 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 299 insertions(+)
 create mode 100644 drivers/leds/leds-apa102c.c

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 5dc6535a88ef..71e29727c6ec 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -79,6 +79,13 @@ config LEDS_AN30259A
 	  To compile this driver as a module, choose M here: the module
 	  will be called leds-an30259a.
 
+config LEDS_APA102C
+	tristate "LED Support for Shiji APA102C"
+	depends on SPI
+	depends on LEDS_CLASS_MULTI_COLOR
+	help
+	  This option enables support for APA102C LEDs.
+
 config LEDS_APU
 	tristate "Front panel LED support for PC Engines APU/APU2/APU3 boards"
 	depends on LEDS_CLASS
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index b5305b7d43fb..8334cb6dc7e8 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -90,6 +90,7 @@ obj-$(CONFIG_LEDS_LM36274)		+= leds-lm36274.o
 obj-$(CONFIG_LEDS_TPS6105X)		+= leds-tps6105x.o
 
 # LED SPI Drivers
+obj-$(CONFIG_LEDS_APA102C)		+= leds-apa102c.o
 obj-$(CONFIG_LEDS_CR0014114)		+= leds-cr0014114.o
 obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o
 obj-$(CONFIG_LEDS_EL15203000)		+= leds-el15203000.o
diff --git a/drivers/leds/leds-apa102c.c b/drivers/leds/leds-apa102c.c
new file mode 100644
index 000000000000..b46db0db7501
--- /dev/null
+++ b/drivers/leds/leds-apa102c.c
@@ -0,0 +1,291 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/spi/spi.h>
+#include <linux/led-class-multicolor.h>
+
+/*
+ * Copyright (C) 2020 BayLibre, SAS
+ * Author: Nicolas Belin <nbelin@baylibre.com>
+ */
+
+/*
+ *  APA102C SPI protocol description:
+ *  +------+----------------------------------------+------+
+ *  |START |               DATA FIELD:              | END  |
+ *  |FRAME |               N LED FRAMES             |FRAME |
+ *  +------+------+------+------+------+-----+------+------+
+ *  | 0*32 | LED1 | LED2 | LED3 | LED4 | --- | LEDN | 1*32 |
+ *  +------+------+------+------+------+-----+------+------+
+ *
+ *  +-----------------------------------+
+ *  |START FRAME 32bits                 |
+ *  +--------+--------+--------+--------+
+ *  |00000000|00000000|00000000|00000000|
+ *  +--------+--------+--------+--------+
+ *
+ *  +------------------------------------+
+ *  |LED  FRAME 32bits                   |
+ *  +---+-----+--------+--------+--------+
+ *  |111|LUMA |  BLUE  | GREEN  |  RED   |
+ *  +---+-----+--------+--------+--------+
+ *  |3b |5bits| 8bits  | 8bits  | 8bits  |
+ *  +---+-----+--------+--------+--------+
+ *  |MSB   LSB|MSB  LSB|MSB  LSB|MSB  LSB|
+ *  +---+-----+--------+--------+--------+
+ *
+ *  +-----------------------------------+
+ *  |END FRAME 32bits                   |
+ *  +--------+--------+--------+--------+
+ *  |11111111|11111111|11111111|11111111|
+ *  +--------+--------+--------+--------+
+ */
+
+/* apa102c default settings */
+#define MAX_BRIGHTNESS		GENMASK(4, 0)
+#define CH_NUM			4
+#define START_BYTE		0
+#define END_BYTE		GENMASK(7, 0)
+#define LED_FRAME_HEADER	GENMASK(7, 5)
+
+#define IS_RGB	(1<<LED_COLOR_ID_RED \
+		| 1<<LED_COLOR_ID_GREEN \
+		| 1<<LED_COLOR_ID_BLUE)
+
+#define APA_DEV_NAME		"apa102c"
+
+struct apa102c_led {
+	struct apa102c		*priv;
+	struct led_classdev	ldev;
+	struct led_classdev_mc	mc_cdev;
+};
+
+struct apa102c {
+	size_t			led_count;
+	struct device		*dev;
+	struct mutex		lock;
+	struct spi_device	*spi;
+	u8			*buf;
+	struct apa102c_led	leds[];
+};
+
+static void apa102c_set_rgb_bytes(u8 *bgr_buf, struct list_head *color_list)
+{
+	struct led_mc_color_entry *color_data;
+
+	/* Looking for the RGB values and putting them in the buffer in
+	 * BGR order
+	 */
+	list_for_each_entry(color_data, color_list, list) {
+		switch (color_data->led_color_id) {
+		case LED_COLOR_ID_RED:
+			bgr_buf[2] = color_data->intensity;
+			break;
+		case LED_COLOR_ID_GREEN:
+			bgr_buf[1] = color_data->intensity;
+			break;
+		case LED_COLOR_ID_BLUE:
+			bgr_buf[0] = color_data->intensity;
+			break;
+		}
+	}
+}
+
+static int apa102c_sync(struct apa102c *priv)
+{
+	int	ret;
+	size_t	i;
+	struct apa102c_led *leds = priv->leds;
+	u8	*buf = priv->buf;
+
+	/* creating the data that will be sent to all the leds at once */
+	for (i = 0; i < 4; i++)
+		*buf++ = START_BYTE;
+
+	/* looping on each multicolor led getting the luma and the RGB values */
+	for (i = 0; i < priv->led_count; i++) {
+		*buf++ = LED_FRAME_HEADER | leds[i].ldev.brightness;
+		apa102c_set_rgb_bytes(buf, &leds[i].mc_cdev.color_list);
+		buf += 3;
+	}
+
+	for (i = 0; i < 4; i++)
+		*buf++ = END_BYTE;
+
+	ret = spi_write(priv->spi, priv->buf, priv->led_count*4 + 8);
+
+	return ret;
+}
+
+static int apa102c_brightness_set(struct led_classdev *ldev,
+			   enum led_brightness brightness)
+{
+	int			ret;
+	struct apa102c_led	*led = container_of(ldev,
+						    struct apa102c_led,
+						    ldev);
+
+	mutex_lock(&led->priv->lock);
+	/* updating the brightness then synching all the leds */
+	ldev->brightness = brightness;
+	ret = apa102c_sync(led->priv);
+	mutex_unlock(&led->priv->lock);
+
+	return ret;
+}
+
+static int apa102c_probe_dt(struct apa102c *priv)
+{
+	int			ret = 0;
+	int			num_colors;
+	u32			color_id, i;
+	struct apa102c_led	*led;
+	struct fwnode_handle	*child, *grandchild;
+	struct led_init_data	init_data;
+
+	device_for_each_child_node(priv->dev, child) {
+
+		ret = fwnode_property_read_u32(child, "reg", &i);
+		if (ret) {
+			dev_err(priv->dev, "coudld not read reg %d\n", ret);
+			goto child_out;
+		}
+
+		if (i >= priv->led_count) {
+			ret = -EINVAL;
+			dev_err(priv->dev, "reg value too big\n");
+			goto child_out;
+		}
+
+		led = &priv->leds[i];
+		/* checking if this led config is already used */
+		if (led->mc_cdev.led_cdev) {
+			ret = -EINVAL;
+			dev_err(priv->dev, "using the same reg value twice\n");
+			goto child_out;
+		}
+
+		led->priv			= priv;
+		led->ldev.max_brightness	= MAX_BRIGHTNESS;
+		fwnode_property_read_string(child, "linux,default-trigger",
+					    &led->ldev.default_trigger);
+
+		init_data.fwnode = child;
+		init_data.devicename = APA_DEV_NAME;
+		init_data.default_label = ":";
+
+		num_colors = 0;
+		fwnode_for_each_child_node(child, grandchild) {
+			ret = fwnode_property_read_u32(grandchild, "color",
+						       &color_id);
+			if (ret) {
+				dev_err(priv->dev, "Cannot read color\n");
+				goto child_out;
+			}
+
+			set_bit(color_id, &led->mc_cdev.available_colors);
+			num_colors++;
+		}
+
+		if (num_colors != 3) {
+			ret = -EINVAL;
+			dev_err(priv->dev, "There should be 3 colors\n");
+			goto child_out;
+		}
+
+		if (led->mc_cdev.available_colors != IS_RGB) {
+			ret = -EINVAL;
+			dev_err(priv->dev, "The led is expected to be RGB\n");
+			goto child_out;
+		}
+
+		led->mc_cdev.num_leds = num_colors;
+		led->mc_cdev.led_cdev = &led->ldev;
+		led->ldev.brightness_set_blocking = apa102c_brightness_set;
+		ret = devm_led_classdev_multicolor_register_ext(priv->dev,
+								&led->mc_cdev,
+								&init_data);
+		if (ret) {
+			dev_err(priv->dev, "led register err: %d\n", ret);
+			fwnode_handle_put(child);
+			goto child_out;
+		}
+	}
+
+child_out:
+	return ret;
+}
+
+static int apa102c_probe(struct spi_device *spi)
+{
+	struct apa102c	*priv;
+	size_t		led_count;
+	int		ret;
+
+	led_count = device_get_child_node_count(&spi->dev);
+	if (!led_count) {
+		dev_err(&spi->dev, "No LEDs defined in device tree!");
+		return -ENODEV;
+	}
+
+	priv = devm_kzalloc(&spi->dev,
+			    struct_size(priv, leds, led_count),
+			    GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	priv->buf = devm_kzalloc(&spi->dev, (led_count + 2) * 4, GFP_KERNEL);
+	if (!priv->buf)
+		return -ENOMEM;
+
+	mutex_init(&priv->lock);
+	priv->led_count	= led_count;
+	priv->dev	= &spi->dev;
+	priv->spi	= spi;
+
+	ret = apa102c_probe_dt(priv);
+	if (ret)
+		return ret;
+
+	/* Set the LEDs with default values at start */
+	apa102c_sync(priv);
+	if (ret)
+		return ret;
+
+	spi_set_drvdata(spi, priv);
+
+	return 0;
+}
+
+static int apa102c_remove(struct spi_device *spi)
+{
+	struct apa102c *priv = spi_get_drvdata(spi);
+
+	mutex_destroy(&priv->lock);
+
+	return 0;
+}
+
+static const struct of_device_id apa102c_dt_ids[] = {
+	{ .compatible = "shiji,apa102c", },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, apa102c_dt_ids);
+
+static struct spi_driver apa102c_driver = {
+	.probe		= apa102c_probe,
+	.remove		= apa102c_remove,
+	.driver = {
+		.name		= KBUILD_MODNAME,
+		.of_match_table	= apa102c_dt_ids,
+	},
+};
+
+module_spi_driver(apa102c_driver);
+
+MODULE_AUTHOR("Nicolas Belin <nbelin@baylibre.com>");
+MODULE_DESCRIPTION("apa102c LED driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("spi:apa102c");
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds
  2020-02-26 14:33 ` [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds Nicolas Belin
@ 2020-02-26 20:13   ` Jacek Anaszewski
  2020-03-03 10:30     ` Nicolas Belin
  0 siblings, 1 reply; 9+ messages in thread
From: Jacek Anaszewski @ 2020-02-26 20:13 UTC (permalink / raw)
  To: Nicolas Belin, linux-kernel, linux-leds, pavel, dmurphy, devicetree
  Cc: baylibre-upstreaming

Hi Nicolas,

Regardless of the fact that LED mc framework in current shape
will probably not materialize in mainline, I have single
remark regarding LED initialization. Please take a look below.

On 2/26/20 3:33 PM, Nicolas Belin wrote:
> Initilial commit in order to support the apa102c RGB leds. This
> is based on the Multicolor Framework.
> 
> Reviewed-by: Corentin Labbe <clabbe@baylibre.com>
> Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
> ---
>  drivers/leds/Kconfig        |   7 ++
>  drivers/leds/Makefile       |   1 +
>  drivers/leds/leds-apa102c.c | 291 ++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 299 insertions(+)
>  create mode 100644 drivers/leds/leds-apa102c.c
> 
> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> index 5dc6535a88ef..71e29727c6ec 100644
> --- a/drivers/leds/Kconfig
> +++ b/drivers/leds/Kconfig
> @@ -79,6 +79,13 @@ config LEDS_AN30259A
>  	  To compile this driver as a module, choose M here: the module
>  	  will be called leds-an30259a.
>  
> +config LEDS_APA102C
> +	tristate "LED Support for Shiji APA102C"
> +	depends on SPI
> +	depends on LEDS_CLASS_MULTI_COLOR
> +	help
> +	  This option enables support for APA102C LEDs.
> +
>  config LEDS_APU
>  	tristate "Front panel LED support for PC Engines APU/APU2/APU3 boards"
>  	depends on LEDS_CLASS
> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
> index b5305b7d43fb..8334cb6dc7e8 100644
[...]
> +
> +		led->priv			= priv;
> +		led->ldev.max_brightness	= MAX_BRIGHTNESS;
> +		fwnode_property_read_string(child, "linux,default-trigger",
> +					    &led->ldev.default_trigger);
> +
> +		init_data.fwnode = child;
> +		init_data.devicename = APA_DEV_NAME;
> +		init_data.default_label = ":";

devicename property should be filled in new drivers only in case
devname_mandatory is set to true.
default_label property is for legacy drivers, for backward compatibility
with old LED naming convention.

For more information please refer to:
- Documentation/leds/leds-class.rst, "LED Device Naming" section
- struct led_init_data documention in linux/leds.h

In effect you need only fwnode here,

> +
> +		num_colors = 0;
> +		fwnode_for_each_child_node(child, grandchild) {
> +			ret = fwnode_property_read_u32(grandchild, "color",
> +						       &color_id);
> +			if (ret) {
> +				dev_err(priv->dev, "Cannot read color\n");
> +				goto child_out;
> +			}
> +
> +			set_bit(color_id, &led->mc_cdev.available_colors);
> +			num_colors++;
> +		}
> +
> +		if (num_colors != 3) {
> +			ret = -EINVAL;
> +			dev_err(priv->dev, "There should be 3 colors\n");
> +			goto child_out;
> +		}
> +
> +		if (led->mc_cdev.available_colors != IS_RGB) {
> +			ret = -EINVAL;
> +			dev_err(priv->dev, "The led is expected to be RGB\n");
> +			goto child_out;
> +		}
> +
> +		led->mc_cdev.num_leds = num_colors;
> +		led->mc_cdev.led_cdev = &led->ldev;
> +		led->ldev.brightness_set_blocking = apa102c_brightness_set;
> +		ret = devm_led_classdev_multicolor_register_ext(priv->dev,

-- 
Best regards,
Jacek Anaszewski

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC v2 2/3] dt-bindings: leds: Shiji Lighting APA102C LED driver
  2020-02-26 14:33 ` [PATCH RFC v2 2/3] dt-bindings: leds: Shiji Lighting APA102C LED driver Nicolas Belin
@ 2020-02-26 21:56   ` Rob Herring
  0 siblings, 0 replies; 9+ messages in thread
From: Rob Herring @ 2020-02-26 21:56 UTC (permalink / raw)
  To: Nicolas Belin
  Cc: linux-kernel, linux-leds, jacek.anaszewski, pavel, dmurphy,
	devicetree, baylibre-upstreaming, Nicolas Belin

On Wed, 26 Feb 2020 15:33:11 +0100, Nicolas Belin wrote:
> Document Shiji Lighting APA102C LED driver device tree bindings.
> 
> Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
> ---
>  .../devicetree/bindings/leds/leds-apa102c.yaml     | 154 +++++++++++++++++++++
>  1 file changed, 154 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/leds/leds-apa102c.yaml
> 

My bot found errors running 'make dt_binding_check' on your patch:

Documentation/devicetree/bindings/display/simple-framebuffer.example.dts:21.16-37.11: Warning (chosen_node_is_root): /example-0/chosen: chosen node must be at root node
Error: Documentation/devicetree/bindings/leds/leds-apa102c.example.dts:33.30-31 syntax error
FATAL ERROR: Unable to parse input tree
scripts/Makefile.lib:300: recipe for target 'Documentation/devicetree/bindings/leds/leds-apa102c.example.dt.yaml' failed
make[1]: *** [Documentation/devicetree/bindings/leds/leds-apa102c.example.dt.yaml] Error 1
Makefile:1263: recipe for target 'dt_binding_check' failed
make: *** [dt_binding_check] Error 2

See https://patchwork.ozlabs.org/patch/1245095
Please check and re-submit.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds
  2020-02-26 20:13   ` Jacek Anaszewski
@ 2020-03-03 10:30     ` Nicolas Belin
  2020-03-03 19:37       ` Jacek Anaszewski
  0 siblings, 1 reply; 9+ messages in thread
From: Nicolas Belin @ 2020-03-03 10:30 UTC (permalink / raw)
  To: Jacek Anaszewski
  Cc: linux-kernel, linux-leds, Pavel Machek, Dan Murphy, devicetree,
	baylibre-upstreaming

Hi Jacek,

That's a shame that it is not going to be upstreamed soon as it making
my led driver much nicer :)
So what's the plan with the multicolor framework?
I am happy to send a new version to fix your remark and then adapt my
driver to the future changes in the Framework.

Let me know what you think.

Thanks,

Regards,

Nicolas

Le mer. 26 févr. 2020 à 21:14, Jacek Anaszewski
<jacek.anaszewski@gmail.com> a écrit :
>
> Hi Nicolas,
>
> Regardless of the fact that LED mc framework in current shape
> will probably not materialize in mainline, I have single
> remark regarding LED initialization. Please take a look below.
>
> On 2/26/20 3:33 PM, Nicolas Belin wrote:
> > Initilial commit in order to support the apa102c RGB leds. This
> > is based on the Multicolor Framework.
> >
> > Reviewed-by: Corentin Labbe <clabbe@baylibre.com>
> > Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
> > ---
> >  drivers/leds/Kconfig        |   7 ++
> >  drivers/leds/Makefile       |   1 +
> >  drivers/leds/leds-apa102c.c | 291 ++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 299 insertions(+)
> >  create mode 100644 drivers/leds/leds-apa102c.c
> >
> > diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> > index 5dc6535a88ef..71e29727c6ec 100644
> > --- a/drivers/leds/Kconfig
> > +++ b/drivers/leds/Kconfig
> > @@ -79,6 +79,13 @@ config LEDS_AN30259A
> >         To compile this driver as a module, choose M here: the module
> >         will be called leds-an30259a.
> >
> > +config LEDS_APA102C
> > +     tristate "LED Support for Shiji APA102C"
> > +     depends on SPI
> > +     depends on LEDS_CLASS_MULTI_COLOR
> > +     help
> > +       This option enables support for APA102C LEDs.
> > +
> >  config LEDS_APU
> >       tristate "Front panel LED support for PC Engines APU/APU2/APU3 boards"
> >       depends on LEDS_CLASS
> > diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
> > index b5305b7d43fb..8334cb6dc7e8 100644
> [...]
> > +
> > +             led->priv                       = priv;
> > +             led->ldev.max_brightness        = MAX_BRIGHTNESS;
> > +             fwnode_property_read_string(child, "linux,default-trigger",
> > +                                         &led->ldev.default_trigger);
> > +
> > +             init_data.fwnode = child;
> > +             init_data.devicename = APA_DEV_NAME;
> > +             init_data.default_label = ":";
>
> devicename property should be filled in new drivers only in case
> devname_mandatory is set to true.
> default_label property is for legacy drivers, for backward compatibility
> with old LED naming convention.
>
> For more information please refer to:
> - Documentation/leds/leds-class.rst, "LED Device Naming" section
> - struct led_init_data documention in linux/leds.h
>
> In effect you need only fwnode here,
>
> > +
> > +             num_colors = 0;
> > +             fwnode_for_each_child_node(child, grandchild) {
> > +                     ret = fwnode_property_read_u32(grandchild, "color",
> > +                                                    &color_id);
> > +                     if (ret) {
> > +                             dev_err(priv->dev, "Cannot read color\n");
> > +                             goto child_out;
> > +                     }
> > +
> > +                     set_bit(color_id, &led->mc_cdev.available_colors);
> > +                     num_colors++;
> > +             }
> > +
> > +             if (num_colors != 3) {
> > +                     ret = -EINVAL;
> > +                     dev_err(priv->dev, "There should be 3 colors\n");
> > +                     goto child_out;
> > +             }
> > +
> > +             if (led->mc_cdev.available_colors != IS_RGB) {
> > +                     ret = -EINVAL;
> > +                     dev_err(priv->dev, "The led is expected to be RGB\n");
> > +                     goto child_out;
> > +             }
> > +
> > +             led->mc_cdev.num_leds = num_colors;
> > +             led->mc_cdev.led_cdev = &led->ldev;
> > +             led->ldev.brightness_set_blocking = apa102c_brightness_set;
> > +             ret = devm_led_classdev_multicolor_register_ext(priv->dev,
>
> --
> Best regards,
> Jacek Anaszewski



-- 
Nicolas Belin
Software design engineer
BayLibre
www.baylibre.com

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix
  2020-02-26 14:33 ` [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix Nicolas Belin
@ 2020-03-03 14:29   ` Rob Herring
  0 siblings, 0 replies; 9+ messages in thread
From: Rob Herring @ 2020-03-03 14:29 UTC (permalink / raw)
  To: Nicolas Belin
  Cc: linux-kernel, linux-leds, jacek.anaszewski, pavel, dmurphy,
	devicetree, baylibre-upstreaming, Nicolas Belin

On Wed, 26 Feb 2020 15:33:10 +0100, Nicolas Belin wrote:
> Shenzhen Shiji Lighting Co.,Ltd is a LED manufacturer.
> 
> Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
> ---
>  Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
>  1 file changed, 2 insertions(+)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds
  2020-03-03 10:30     ` Nicolas Belin
@ 2020-03-03 19:37       ` Jacek Anaszewski
  0 siblings, 0 replies; 9+ messages in thread
From: Jacek Anaszewski @ 2020-03-03 19:37 UTC (permalink / raw)
  To: Nicolas Belin
  Cc: linux-kernel, linux-leds, Pavel Machek, Dan Murphy, devicetree,
	baylibre-upstreaming

Hi Nicolas,

On 3/3/20 11:30 AM, Nicolas Belin wrote:
> Hi Jacek,
> 
> That's a shame that it is not going to be upstreamed soon as it making
> my led driver much nicer :)

Now when we clarified interface related issues I hope it will
be rather weeks than months when it is ready.

> So what's the plan with the multicolor framework?
> I am happy to send a new version to fix your remark and then adapt my
> driver to the future changes in the Framework.

Just rework the driver to create one LED class device per LED color.
After LED mc framework is upstream you will be free to add the
support for it to your driver.

Best regards,
Jacek Anaszewski

> Let me know what you think.
> 
> Thanks,
> 
> Regards,
> 
> Nicolas
> 
> Le mer. 26 févr. 2020 à 21:14, Jacek Anaszewski
> <jacek.anaszewski@gmail.com> a écrit :
>>
>> Hi Nicolas,
>>
>> Regardless of the fact that LED mc framework in current shape
>> will probably not materialize in mainline, I have single
>> remark regarding LED initialization. Please take a look below.
>>
>> On 2/26/20 3:33 PM, Nicolas Belin wrote:
>>> Initilial commit in order to support the apa102c RGB leds. This
>>> is based on the Multicolor Framework.
>>>
>>> Reviewed-by: Corentin Labbe <clabbe@baylibre.com>
>>> Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
>>> ---
>>>  drivers/leds/Kconfig        |   7 ++
>>>  drivers/leds/Makefile       |   1 +
>>>  drivers/leds/leds-apa102c.c | 291 ++++++++++++++++++++++++++++++++++++++++++++
>>>  3 files changed, 299 insertions(+)
>>>  create mode 100644 drivers/leds/leds-apa102c.c
>>>
>>> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
>>> index 5dc6535a88ef..71e29727c6ec 100644
>>> --- a/drivers/leds/Kconfig
>>> +++ b/drivers/leds/Kconfig
>>> @@ -79,6 +79,13 @@ config LEDS_AN30259A
>>>         To compile this driver as a module, choose M here: the module
>>>         will be called leds-an30259a.
>>>
>>> +config LEDS_APA102C
>>> +     tristate "LED Support for Shiji APA102C"
>>> +     depends on SPI
>>> +     depends on LEDS_CLASS_MULTI_COLOR
>>> +     help
>>> +       This option enables support for APA102C LEDs.
>>> +
>>>  config LEDS_APU
>>>       tristate "Front panel LED support for PC Engines APU/APU2/APU3 boards"
>>>       depends on LEDS_CLASS
>>> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
>>> index b5305b7d43fb..8334cb6dc7e8 100644
>> [...]
>>> +
>>> +             led->priv                       = priv;
>>> +             led->ldev.max_brightness        = MAX_BRIGHTNESS;
>>> +             fwnode_property_read_string(child, "linux,default-trigger",
>>> +                                         &led->ldev.default_trigger);
>>> +
>>> +             init_data.fwnode = child;
>>> +             init_data.devicename = APA_DEV_NAME;
>>> +             init_data.default_label = ":";
>>
>> devicename property should be filled in new drivers only in case
>> devname_mandatory is set to true.
>> default_label property is for legacy drivers, for backward compatibility
>> with old LED naming convention.
>>
>> For more information please refer to:
>> - Documentation/leds/leds-class.rst, "LED Device Naming" section
>> - struct led_init_data documention in linux/leds.h
>>
>> In effect you need only fwnode here,
>>
>>> +
>>> +             num_colors = 0;
>>> +             fwnode_for_each_child_node(child, grandchild) {
>>> +                     ret = fwnode_property_read_u32(grandchild, "color",
>>> +                                                    &color_id);
>>> +                     if (ret) {
>>> +                             dev_err(priv->dev, "Cannot read color\n");
>>> +                             goto child_out;
>>> +                     }
>>> +
>>> +                     set_bit(color_id, &led->mc_cdev.available_colors);
>>> +                     num_colors++;
>>> +             }
>>> +
>>> +             if (num_colors != 3) {
>>> +                     ret = -EINVAL;
>>> +                     dev_err(priv->dev, "There should be 3 colors\n");
>>> +                     goto child_out;
>>> +             }
>>> +
>>> +             if (led->mc_cdev.available_colors != IS_RGB) {
>>> +                     ret = -EINVAL;
>>> +                     dev_err(priv->dev, "The led is expected to be RGB\n");
>>> +                     goto child_out;
>>> +             }
>>> +
>>> +             led->mc_cdev.num_leds = num_colors;
>>> +             led->mc_cdev.led_cdev = &led->ldev;
>>> +             led->ldev.brightness_set_blocking = apa102c_brightness_set;
>>> +             ret = devm_led_classdev_multicolor_register_ext(priv->dev,
>>
>> --
>> Best regards,
>> Jacek Anaszewski
> 
> 
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-03-03 19:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-26 14:33 [PATCH RFC v2 0/3] leds: add support for apa102c leds Nicolas Belin
2020-02-26 14:33 ` [PATCH RFC v2 1/3] dt-bindings: Document shiji vendor-prefix Nicolas Belin
2020-03-03 14:29   ` Rob Herring
2020-02-26 14:33 ` [PATCH RFC v2 2/3] dt-bindings: leds: Shiji Lighting APA102C LED driver Nicolas Belin
2020-02-26 21:56   ` Rob Herring
2020-02-26 14:33 ` [PATCH RFC v2 3/3] drivers: leds: add support for apa102c leds Nicolas Belin
2020-02-26 20:13   ` Jacek Anaszewski
2020-03-03 10:30     ` Nicolas Belin
2020-03-03 19:37       ` Jacek Anaszewski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.