* [PATCH v5 0/2] Multicolor PWM LED support
@ 2022-02-07 10:03 sven
2022-02-07 10:03 ` [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings sven
2022-02-07 10:03 ` [PATCH v5 2/2] leds: Add PWM multicolor driver sven
0 siblings, 2 replies; 6+ messages in thread
From: sven @ 2022-02-07 10:03 UTC (permalink / raw)
To: linux-leds, devicetree, linux-pwm
Cc: Sven Schwermer, pavel, robh+dt, thierry.reding, u.kleine-koenig,
lee.jones, post, andy.shevchenko
From: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
Hi,
This patch series is getting mature. I have removed the RFC tag for this
version. The initial discussion happened here [1].
I would appreciate if anyone would test this code. It runs on my
i.MX6ULL-based hardware.
Best regards,
Sven
[1]:https://lore.kernel.org/linux-leds/37540afd-f2f1-52dd-f4f1-6e7b436e9595@svenschwermer.de/
Sven Schwermer (2):
dt-bindings: leds: Add multicolor PWM LED bindings
leds: Add PWM multicolor driver
.../bindings/leds/leds-pwm-multicolor.yaml | 75 +++++++
drivers/leds/Kconfig | 11 ++
drivers/leds/Makefile | 1 +
drivers/leds/leds-pwm-multicolor.c | 186 ++++++++++++++++++
4 files changed, 273 insertions(+)
create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
create mode 100644 drivers/leds/leds-pwm-multicolor.c
Interdiff against v4:
diff --git a/drivers/leds/leds-pwm-multicolor.c b/drivers/leds/leds-pwm-multicolor.c
index 96712b8ca98e..45e38708ecb1 100644
--- a/drivers/leds/leds-pwm-multicolor.c
+++ b/drivers/leds/leds-pwm-multicolor.c
@@ -58,6 +58,43 @@ static int led_pwm_mc_set(struct led_classdev *cdev,
return ret;
}
+static int iterate_subleds(struct device *dev, struct pwm_mc_led *priv,
+ struct fwnode_handle *mcnode)
+{
+ struct mc_subled *subled = priv->mc_cdev.subled_info;
+ struct fwnode_handle *fwnode;
+ struct pwm_led *pwmled;
+ u32 color;
+ int ret;
+
+ /* iterate over the nodes inside the multi-led node */
+ fwnode_for_each_child_node(mcnode, fwnode) {
+ pwmled = &priv->leds[priv->mc_cdev.num_colors];
+ pwmled->pwm = devm_fwnode_pwm_get(dev, fwnode, NULL);
+ if (IS_ERR(pwmled->pwm)) {
+ ret = PTR_ERR(pwmled->pwm);
+ dev_err(dev, "unable to request PWM: %d\n", ret);
+ goto release_fwnode;
+ }
+ pwm_init_state(pwmled->pwm, &pwmled->state);
+
+ ret = fwnode_property_read_u32(fwnode, "color", &color);
+ if (ret) {
+ dev_err(dev, "cannot read color: %d\n", ret);
+ goto release_fwnode;
+ }
+
+ subled[priv->mc_cdev.num_colors].color_index = color;
+ priv->mc_cdev.num_colors++;
+ }
+
+ return 0;
+
+release_fwnode:
+ fwnode_handle_put(fwnode);
+ return ret;
+}
+
static int led_pwm_mc_probe(struct platform_device *pdev)
{
struct fwnode_handle *mcnode, *fwnode;
@@ -65,10 +102,8 @@ static int led_pwm_mc_probe(struct platform_device *pdev)
struct led_classdev *cdev;
struct mc_subled *subled;
struct pwm_mc_led *priv;
- struct pwm_led *pwmled;
int count = 0;
int ret = 0;
- u32 color;
mcnode = device_get_named_child_node(&pdev->dev, "multi-led");
if (!mcnode)
@@ -101,28 +136,9 @@ static int led_pwm_mc_probe(struct platform_device *pdev)
cdev->flags = LED_CORE_SUSPENDRESUME;
cdev->brightness_set_blocking = led_pwm_mc_set;
- /* iterate over the nodes inside the multi-led node */
- fwnode_for_each_child_node(mcnode, fwnode) {
- pwmled = &priv->leds[priv->mc_cdev.num_colors];
- pwmled->pwm = devm_fwnode_pwm_get(&pdev->dev, fwnode, NULL);
- if (IS_ERR(pwmled->pwm)) {
- ret = PTR_ERR(pwmled->pwm);
- dev_err(&pdev->dev, "unable to request PWM: %d\n", ret);
- fwnode_handle_put(fwnode);
- goto release_mcnode;
- }
- pwm_init_state(pwmled->pwm, &pwmled->state);
-
- ret = fwnode_property_read_u32(fwnode, "color", &color);
- if (ret) {
- dev_err(&pdev->dev, "cannot read color: %d\n", ret);
- fwnode_handle_put(fwnode);
- goto release_mcnode;
- }
-
- subled[priv->mc_cdev.num_colors].color_index = color;
- priv->mc_cdev.num_colors++;
- }
+ ret = iterate_subleds(&pdev->dev, priv, mcnode);
+ if (ret)
+ goto release_mcnode;
init_data.fwnode = mcnode;
ret = devm_led_classdev_multicolor_register_ext(&pdev->dev,
--
2.35.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings
2022-02-07 10:03 [PATCH v5 0/2] Multicolor PWM LED support sven
@ 2022-02-07 10:03 ` sven
2022-02-07 20:21 ` Rob Herring
2022-02-07 10:03 ` [PATCH v5 2/2] leds: Add PWM multicolor driver sven
1 sibling, 1 reply; 6+ messages in thread
From: sven @ 2022-02-07 10:03 UTC (permalink / raw)
To: linux-leds, devicetree, linux-pwm
Cc: Sven Schwermer, pavel, robh+dt, thierry.reding, u.kleine-koenig,
lee.jones, post, andy.shevchenko
From: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
This allows to group multiple PWM-connected monochrome LEDs into
multicolor LEDs, e.g. RGB LEDs.
Signed-off-by: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
---
Notes:
Changes in v5:
* (no changes)
Changes in v4:
* (no changes)
Changes in v3:
* Remove multi-led unit name
.../bindings/leds/leds-pwm-multicolor.yaml | 75 +++++++++++++++++++
1 file changed, 75 insertions(+)
create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
diff --git a/Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml b/Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
new file mode 100644
index 000000000000..5a7ed5e1bb9f
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/leds/leds-pwm-multicolor.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Multi-color LEDs connected to PWM
+
+maintainers:
+ - Sven Schwermer <sven.schwermer@disruptive-technologies.com>
+
+description: |
+ This driver combines several monochrome PWM LEDs into one multi-color
+ LED using the multicolor LED class.
+
+properties:
+ compatible:
+ const: pwm-leds-multicolor
+
+ multi-led:
+ type: object
+ allOf:
+ - $ref: leds-class-multicolor.yaml#
+
+ patternProperties:
+ "^led-[0-9a-z]+$":
+ type: object
+ properties:
+ pwms:
+ maxItems: 1
+
+ pwm-names: true
+
+ color:
+ $ref: common.yaml#/properties/color
+
+ required:
+ - pwms
+ - color
+
+required:
+ - compatible
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/leds/common.h>
+
+ rgb-led {
+ compatible = "pwm-leds-multicolor";
+
+ multi-led {
+ color = <LED_COLOR_ID_RGB>;
+ function = LED_FUNCTION_INDICATOR;
+ max-brightness = <65535>;
+
+ led-red {
+ pwms = <&pwm1 0 1000000>;
+ color = <LED_COLOR_ID_RED>;
+ };
+
+ led-green {
+ pwms = <&pwm2 0 1000000>;
+ color = <LED_COLOR_ID_GREEN>;
+ };
+
+ led-blue {
+ pwms = <&pwm3 0 1000000>;
+ color = <LED_COLOR_ID_BLUE>;
+ };
+ };
+ };
+
+...
--
2.35.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v5 2/2] leds: Add PWM multicolor driver
2022-02-07 10:03 [PATCH v5 0/2] Multicolor PWM LED support sven
2022-02-07 10:03 ` [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings sven
@ 2022-02-07 10:03 ` sven
1 sibling, 0 replies; 6+ messages in thread
From: sven @ 2022-02-07 10:03 UTC (permalink / raw)
To: linux-leds, devicetree, linux-pwm
Cc: Sven Schwermer, pavel, robh+dt, thierry.reding, u.kleine-koenig,
lee.jones, post, andy.shevchenko
From: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
By allowing to group multiple monochrome PWM LEDs into multicolor LEDs,
all involved LEDs can be controlled in-sync. This enables using effects
using triggers, etc.
Signed-off-by: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
Notes:
Changes in v5:
* Factor iteration over subleds out into function
Changes in v4:
* Remove mutex destruction and remove function
* Include missing headers
* Use post-increment instead of pre-increment
* Variable declarations in reverse xmas tree order
* Use dev_err_probe where possible
* Return immediately where possible
* Cosmetic changes
* Document LKM name
Changes in v3:
* Release fwnode handles
* Sort header includes
* Remove deprecated device tree properties
* Remove deprecated LED_OFF
* Remove subled channel assignment
* s/pwmstate/state/
drivers/leds/Kconfig | 11 ++
drivers/leds/Makefile | 1 +
drivers/leds/leds-pwm-multicolor.c | 186 +++++++++++++++++++++++++++++
3 files changed, 198 insertions(+)
create mode 100644 drivers/leds/leds-pwm-multicolor.c
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 6090e647daee..e70a46704076 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -552,6 +552,17 @@ config LEDS_PWM
help
This option enables support for pwm driven LEDs
+config LEDS_PWM_MULTICOLOR
+ tristate "PWM driven multi-color LED Support"
+ depends on LEDS_CLASS_MULTICOLOR
+ depends on PWM
+ help
+ This option enables support for PWM driven monochrome LEDs that are
+ grouped into multicolor LEDs.
+
+ To compile this driver as a module, choose M here: the module
+ will be called leds-pwm-multicolor.
+
config LEDS_REGULATOR
tristate "REGULATOR driven LED support"
depends on LEDS_CLASS
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index e58ecb36360f..ba2c2c1edf12 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -73,6 +73,7 @@ obj-$(CONFIG_LEDS_PCA963X) += leds-pca963x.o
obj-$(CONFIG_LEDS_PM8058) += leds-pm8058.o
obj-$(CONFIG_LEDS_POWERNV) += leds-powernv.o
obj-$(CONFIG_LEDS_PWM) += leds-pwm.o
+obj-$(CONFIG_LEDS_PWM_MULTICOLOR) += leds-pwm-multicolor.o
obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
obj-$(CONFIG_LEDS_SC27XX_BLTC) += leds-sc27xx-bltc.o
diff --git a/drivers/leds/leds-pwm-multicolor.c b/drivers/leds/leds-pwm-multicolor.c
new file mode 100644
index 000000000000..45e38708ecb1
--- /dev/null
+++ b/drivers/leds/leds-pwm-multicolor.c
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * PWM-based multi-color LED control
+ *
+ * Copyright 2022 Sven Schwermer <sven.schwermer@disruptive-technologies.com>
+ */
+
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/led-class-multicolor.h>
+#include <linux/leds.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/pwm.h>
+
+struct pwm_led {
+ struct pwm_device *pwm;
+ struct pwm_state state;
+};
+
+struct pwm_mc_led {
+ struct led_classdev_mc mc_cdev;
+ struct mutex lock;
+ struct pwm_led leds[];
+};
+
+static int led_pwm_mc_set(struct led_classdev *cdev,
+ enum led_brightness brightness)
+{
+ struct led_classdev_mc *mc_cdev = lcdev_to_mccdev(cdev);
+ struct pwm_mc_led *priv = container_of(mc_cdev, struct pwm_mc_led, mc_cdev);
+ unsigned long long duty;
+ int ret = 0;
+ int i;
+
+ led_mc_calc_color_components(mc_cdev, brightness);
+
+ mutex_lock(&priv->lock);
+
+ for (i = 0; i < mc_cdev->num_colors; i++) {
+ duty = priv->leds[i].state.period;
+ duty *= mc_cdev->subled_info[i].brightness;
+ do_div(duty, cdev->max_brightness);
+
+ priv->leds[i].state.duty_cycle = duty;
+ priv->leds[i].state.enabled = duty > 0;
+ ret = pwm_apply_state(priv->leds[i].pwm,
+ &priv->leds[i].state);
+ if (ret)
+ break;
+ }
+
+ mutex_unlock(&priv->lock);
+
+ return ret;
+}
+
+static int iterate_subleds(struct device *dev, struct pwm_mc_led *priv,
+ struct fwnode_handle *mcnode)
+{
+ struct mc_subled *subled = priv->mc_cdev.subled_info;
+ struct fwnode_handle *fwnode;
+ struct pwm_led *pwmled;
+ u32 color;
+ int ret;
+
+ /* iterate over the nodes inside the multi-led node */
+ fwnode_for_each_child_node(mcnode, fwnode) {
+ pwmled = &priv->leds[priv->mc_cdev.num_colors];
+ pwmled->pwm = devm_fwnode_pwm_get(dev, fwnode, NULL);
+ if (IS_ERR(pwmled->pwm)) {
+ ret = PTR_ERR(pwmled->pwm);
+ dev_err(dev, "unable to request PWM: %d\n", ret);
+ goto release_fwnode;
+ }
+ pwm_init_state(pwmled->pwm, &pwmled->state);
+
+ ret = fwnode_property_read_u32(fwnode, "color", &color);
+ if (ret) {
+ dev_err(dev, "cannot read color: %d\n", ret);
+ goto release_fwnode;
+ }
+
+ subled[priv->mc_cdev.num_colors].color_index = color;
+ priv->mc_cdev.num_colors++;
+ }
+
+ return 0;
+
+release_fwnode:
+ fwnode_handle_put(fwnode);
+ return ret;
+}
+
+static int led_pwm_mc_probe(struct platform_device *pdev)
+{
+ struct fwnode_handle *mcnode, *fwnode;
+ struct led_init_data init_data = {};
+ struct led_classdev *cdev;
+ struct mc_subled *subled;
+ struct pwm_mc_led *priv;
+ int count = 0;
+ int ret = 0;
+
+ mcnode = device_get_named_child_node(&pdev->dev, "multi-led");
+ if (!mcnode)
+ return dev_err_probe(&pdev->dev, -ENODEV,
+ "expected multi-led node\n");
+
+ /* count the nodes inside the multi-led node */
+ fwnode_for_each_child_node(mcnode, fwnode)
+ count++;
+
+ priv = devm_kzalloc(&pdev->dev, struct_size(priv, leds, count),
+ GFP_KERNEL);
+ if (!priv) {
+ ret = -ENOMEM;
+ goto release_mcnode;
+ }
+ mutex_init(&priv->lock);
+
+ subled = devm_kcalloc(&pdev->dev, count, sizeof(*subled), GFP_KERNEL);
+ if (!subled) {
+ ret = -ENOMEM;
+ goto release_mcnode;
+ }
+ priv->mc_cdev.subled_info = subled;
+
+ /* init the multicolor's LED class device */
+ cdev = &priv->mc_cdev.led_cdev;
+ fwnode_property_read_u32(mcnode, "max-brightness",
+ &cdev->max_brightness);
+ cdev->flags = LED_CORE_SUSPENDRESUME;
+ cdev->brightness_set_blocking = led_pwm_mc_set;
+
+ ret = iterate_subleds(&pdev->dev, priv, mcnode);
+ if (ret)
+ goto release_mcnode;
+
+ init_data.fwnode = mcnode;
+ ret = devm_led_classdev_multicolor_register_ext(&pdev->dev,
+ &priv->mc_cdev,
+ &init_data);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "failed to register multicolor PWM led for %s: %d\n",
+ cdev->name, ret);
+ goto release_mcnode;
+ }
+
+ ret = led_pwm_mc_set(cdev, cdev->brightness);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "failed to set led PWM value for %s: %d",
+ cdev->name, ret);
+
+ platform_set_drvdata(pdev, priv);
+ return 0;
+
+release_mcnode:
+ fwnode_handle_put(mcnode);
+ return ret;
+}
+
+static const struct of_device_id of_pwm_leds_mc_match[] = {
+ { .compatible = "pwm-leds-multicolor", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, of_pwm_leds_mc_match);
+
+static struct platform_driver led_pwm_mc_driver = {
+ .probe = led_pwm_mc_probe,
+ .driver = {
+ .name = "leds_pwm_multicolor",
+ .of_match_table = of_pwm_leds_mc_match,
+ },
+};
+module_platform_driver(led_pwm_mc_driver);
+
+MODULE_AUTHOR("Sven Schwermer <sven.schwermer@disruptive-technologies.com>");
+MODULE_DESCRIPTION("multi-color PWM LED driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:leds-pwm-multicolor");
--
2.35.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings
2022-02-07 10:03 ` [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings sven
@ 2022-02-07 20:21 ` Rob Herring
2022-02-07 20:44 ` Sven Schwermer
0 siblings, 1 reply; 6+ messages in thread
From: Rob Herring @ 2022-02-07 20:21 UTC (permalink / raw)
To: sven
Cc: linux-leds, devicetree, linux-pwm, Sven Schwermer, pavel,
thierry.reding, u.kleine-koenig, lee.jones, post, andy.shevchenko
On Mon, Feb 07, 2022 at 11:03:25AM +0100, sven@svenschwermer.de wrote:
> From: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
>
> This allows to group multiple PWM-connected monochrome LEDs into
> multicolor LEDs, e.g. RGB LEDs.
>
> Signed-off-by: Sven Schwermer <sven.schwermer@disruptive-technologies.com>
> ---
>
> Notes:
> Changes in v5:
> * (no changes)
>
> Changes in v4:
> * (no changes)
>
> Changes in v3:
> * Remove multi-led unit name
>
> .../bindings/leds/leds-pwm-multicolor.yaml | 75 +++++++++++++++++++
> 1 file changed, 75 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
>
> diff --git a/Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml b/Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
> new file mode 100644
> index 000000000000..5a7ed5e1bb9f
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/leds/leds-pwm-multicolor.yaml
> @@ -0,0 +1,75 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/leds/leds-pwm-multicolor.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Multi-color LEDs connected to PWM
> +
> +maintainers:
> + - Sven Schwermer <sven.schwermer@disruptive-technologies.com>
> +
> +description: |
> + This driver combines several monochrome PWM LEDs into one multi-color
> + LED using the multicolor LED class.
> +
> +properties:
> + compatible:
> + const: pwm-leds-multicolor
> +
> + multi-led:
> + type: object
> + allOf:
> + - $ref: leds-class-multicolor.yaml#
This schema says 'multi-led' here should have a child called
"^multi-led@([0-9a-f])$". You are off a level.
> +
> + patternProperties:
> + "^led-[0-9a-z]+$":
> + type: object
$ref: common.yaml#
additionalProperties: false
> + properties:
> + pwms:
> + maxItems: 1
> +
> + pwm-names: true
> +
> + color:
> + $ref: common.yaml#/properties/color
And then drop this ref.
> +
> + required:
> + - pwms
> + - color
> +
> +required:
> + - compatible
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/leds/common.h>
> +
> + rgb-led {
> + compatible = "pwm-leds-multicolor";
> +
> + multi-led {
Can't this be collapsed into 1 level? I don't see "pwm-leds-multicolor"
having other child nodes.
> + color = <LED_COLOR_ID_RGB>;
> + function = LED_FUNCTION_INDICATOR;
> + max-brightness = <65535>;
> +
> + led-red {
> + pwms = <&pwm1 0 1000000>;
> + color = <LED_COLOR_ID_RED>;
> + };
> +
> + led-green {
> + pwms = <&pwm2 0 1000000>;
> + color = <LED_COLOR_ID_GREEN>;
> + };
> +
> + led-blue {
> + pwms = <&pwm3 0 1000000>;
> + color = <LED_COLOR_ID_BLUE>;
> + };
> + };
> + };
> +
> +...
> --
> 2.35.1
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings
2022-02-07 20:21 ` Rob Herring
@ 2022-02-07 20:44 ` Sven Schwermer
2022-02-07 21:43 ` Rob Herring
0 siblings, 1 reply; 6+ messages in thread
From: Sven Schwermer @ 2022-02-07 20:44 UTC (permalink / raw)
To: Rob Herring
Cc: linux-leds, devicetree, linux-pwm, pavel, thierry.reding,
u.kleine-koenig, lee.jones, post, andy.shevchenko
Hi Rob,
Thanks for your comments.
On 2/7/22 21:21, Rob Herring wrote:
>> +properties:
>> + compatible:
>> + const: pwm-leds-multicolor
>> +
>> + multi-led:
>> + type: object
>> + allOf:
>> + - $ref: leds-class-multicolor.yaml#
>
> This schema says 'multi-led' here should have a child called
> "^multi-led@([0-9a-f])$". You are off a level.
So it should have been?
properties:
compatible:
const: pwm-leds-multicolor
allOf:
- $ref: leds-class-multicolor.yaml#
This would imply that the multi-led node requires a unit address (reg
property). That doesn't make sense in this case. How should we resolve this?
>> +
>> + patternProperties:
>> + "^led-[0-9a-z]+$":
>> + type: object
>
> $ref: common.yaml#
> additionalProperties: false
Sounds good.
>> + properties:
>> + pwms:
>> + maxItems: 1
>> +
>> + pwm-names: true
>> +
>> + color:
>> + $ref: common.yaml#/properties/color
>
> And then drop this ref.
Curiosity question: why? Should I refer to an unsigned integer type instead?
>> + rgb-led {
>> + compatible = "pwm-leds-multicolor";
>> +
>> + multi-led {
>
> Can't this be collapsed into 1 level? I don't see "pwm-leds-multicolor"
> having other child nodes.
It could. The reason I added the multi-led level is because the
leds-class-multicolor.yaml schema calls for it. Perhaps I missed the
intention of that schema but isn't it there to create a uniform binding
schema structure across drivers?
Best regards,
Sven
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings
2022-02-07 20:44 ` Sven Schwermer
@ 2022-02-07 21:43 ` Rob Herring
0 siblings, 0 replies; 6+ messages in thread
From: Rob Herring @ 2022-02-07 21:43 UTC (permalink / raw)
To: Sven Schwermer
Cc: Linux LED Subsystem, devicetree, Linux PWM List, Pavel Machek,
Thierry Reding, Uwe Kleine-König, Lee Jones, Alexander Dahl,
Andy Shevchenko
On Mon, Feb 7, 2022 at 2:44 PM Sven Schwermer <sven@svenschwermer.de> wrote:
>
> Hi Rob,
>
> Thanks for your comments.
>
> On 2/7/22 21:21, Rob Herring wrote:
> >> +properties:
> >> + compatible:
> >> + const: pwm-leds-multicolor
> >> +
> >> + multi-led:
> >> + type: object
> >> + allOf:
> >> + - $ref: leds-class-multicolor.yaml#
> >
> > This schema says 'multi-led' here should have a child called
> > "^multi-led@([0-9a-f])$". You are off a level.
>
> So it should have been?
>
> properties:
> compatible:
> const: pwm-leds-multicolor
> allOf:
> - $ref: leds-class-multicolor.yaml#
Not quite. DT property names and json-schema vocab names should never
be at the same level. So allOf should be at the root level.
> This would imply that the multi-led node requires a unit address (reg
> property). That doesn't make sense in this case. How should we resolve this?
I meant to mention that. Update the regex pattern to allow just
'multi-led': "^multi-led(@[0-9a-f])?$"
> >> + patternProperties:
> >> + "^led-[0-9a-z]+$":
> >> + type: object
> >
> > $ref: common.yaml#
> > additionalProperties: false
>
> Sounds good.
>
> >> + properties:
> >> + pwms:
> >> + maxItems: 1
> >> +
> >> + pwm-names: true
> >> +
> >> + color:
> >> + $ref: common.yaml#/properties/color
> >
> > And then drop this ref.
>
> Curiosity question: why? Should I refer to an unsigned integer type instead?
Generally we want schemas to apply to nodes rather than individual
properties. Think of each node as a class and nodes can be 1 or more
subclasses. It's more important when using 'unevaluatedProperties' in
combination with refs.
'color: true' is all you need here. So it's less duplication. Not so
much here since it is just 1 property, but in general.
>
> >> + rgb-led {
> >> + compatible = "pwm-leds-multicolor";
> >> +
> >> + multi-led {
> >
> > Can't this be collapsed into 1 level? I don't see "pwm-leds-multicolor"
> > having other child nodes.
>
> It could. The reason I added the multi-led level is because the
> leds-class-multicolor.yaml schema calls for it. Perhaps I missed the
> intention of that schema but isn't it there to create a uniform binding
> schema structure across drivers?
Yeah, I guess that's a good enough reason.
Rob
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-02-07 21:43 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-07 10:03 [PATCH v5 0/2] Multicolor PWM LED support sven
2022-02-07 10:03 ` [PATCH v5 1/2] dt-bindings: leds: Add multicolor PWM LED bindings sven
2022-02-07 20:21 ` Rob Herring
2022-02-07 20:44 ` Sven Schwermer
2022-02-07 21:43 ` Rob Herring
2022-02-07 10:03 ` [PATCH v5 2/2] leds: Add PWM multicolor driver sven
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).