On Mon, 27 Jul 2020 12:52:26 +0200 Pavel Machek <pavel@xxxxxx> wrote: > Hi! > > > > Multicolor is a bit too abstract. Yes, we can have > > > Green-Magenta-Ultraviolet LED, but so far all the LEDs we support > > > are RGB, and not even RGB-White or RGB-Yellow variants emerged. > > > > > > Multicolor is not a good fit for RGB LED. It does not really know > > > about LED color. In particular, there's no way to make LED > > > "white". > > > > > > Userspace is interested in knowing "this LED can produce arbitrary > > > color", which not all multicolor LEDs can. > > > > > > Proposal: let's add "rgb" to led_colors in > > > drivers/leds/led-core.c, add corresponding device tree > > > defines, and use that, instead of multicolor for RGB LEDs. > > > > > > We really need to do that now; "white" stuff can wait. > > > > > > RGB LEDs are quite common, and it would be good to be able to > > > turn LED white and to turn it into any arbitrary color. It is > > > essential that userspace is able to set arbitrary colors, and it > > > might be good to have that ability from kernel, too... to allow > > > full-color triggers. > > > > > > Best regads, > > > Pavel > > > > > > > I am not against adding RGB if you want to somehow teach the > > subsystem to mix arbitrary color (either by teaching it color > > curves or some other way). But I think we shouldn't remove > > multicolor, and here's the reason why: > > Something like this? > > diff --git > a/Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml > b/Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml > index b55e1f1308a4..e820040a09d9 100644 --- > a/Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml > +++ > b/Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml > @@ -25,11 +25,15 @@ patternProperties: description: Represents the > LEDs that are to be grouped. properties: color: > - const: 8 # LED_COLOR_ID_MULTI > + minimum: 8 # LED_COLOR_ID_MULTI > + maximum: 9 # LED_COLOR_ID_RGB > description: | > - For multicolor LED support this property should be defined > as > + For non-RGB multicolor LEDs this property should be > defined as LED_COLOR_ID_MULTI which can be found in > include/linux/leds/common.h. > + For LEDs that can display arbitrary color (RGB, RGBW, > etc), this > + property should be defined as LED_COLOR_ID_RGB. > + > $ref: "common.yaml#" > > required: > diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c > index 846248a0693d..a6dce01dbd5e 100644 > --- a/drivers/leds/led-core.c > +++ b/drivers/leds/led-core.c > @@ -35,6 +35,7 @@ const char * const led_colors[LED_COLOR_ID_MAX] = { > [LED_COLOR_ID_YELLOW] = "yellow", > [LED_COLOR_ID_IR] = "ir", > [LED_COLOR_ID_MULTI] = "multicolor", > + [LED_COLOR_ID_RGB] = "rgb", > }; > EXPORT_SYMBOL_GPL(led_colors); > > diff --git a/drivers/leds/leds-lp55xx-common.c > b/drivers/leds/leds-lp55xx-common.c index af14e2b2d577..56210f4ad919 > 100644 --- a/drivers/leds/leds-lp55xx-common.c > +++ b/drivers/leds/leds-lp55xx-common.c > @@ -638,7 +638,7 @@ static int lp55xx_parse_logical_led(struct > device_node *np, if (ret) > return ret; > > - if (led_color == LED_COLOR_ID_MULTI) > + if (led_color == LED_COLOR_ID_RGB) > return lp55xx_parse_multi_led(np, cfg, child_number); > > ret = lp55xx_parse_common_child(np, cfg, child_number, > &chan_nr); diff --git a/drivers/leds/leds-turris-omnia.c > b/drivers/leds/leds-turris-omnia.c index bb23d8e16614..5c360632170a > 100644 --- a/drivers/leds/leds-turris-omnia.c > +++ b/drivers/leds/leds-turris-omnia.c > @@ -94,15 +94,15 @@ static int omnia_led_register(struct i2c_client > *client, struct omnia_led *led, dev_warn(dev, > "Node %pOF: must contain 'reg' property > with values between 0 and %i\n", np, OMNIA_BOARD_LEDS - 1); > - return 0; > + return 0; /* FIXME: should return 0/errrno */ > } > > ret = of_property_read_u32(np, "color", &color); > - if (ret || color != LED_COLOR_ID_MULTI) { > + if (ret || color != LED_COLOR_ID_RGB) { > dev_warn(dev, > - "Node %pOF: must contain 'color' property > with value LED_COLOR_ID_MULTI\n", > + "Node %pOF: must contain 'color' property > with value LED_COLOR_ID_RGB\n", np); > - return 0; > + return 0; /* FIXME: should return 0/errrno */ > } > > led->subled_info[0].color_index = LED_COLOR_ID_RED; > @@ -145,7 +145,7 @@ static int omnia_led_register(struct i2c_client > *client, struct omnia_led *led, return ret; > } > > - return 1; > + return 1; /* FIXME: should return 0/errrno */ > } > > /* > diff --git a/include/dt-bindings/leds/common.h > b/include/dt-bindings/leds/common.h index a463ce6a8794..52b619d44ba2 > 100644 --- a/include/dt-bindings/leds/common.h > +++ b/include/dt-bindings/leds/common.h > @@ -30,8 +30,10 @@ > #define LED_COLOR_ID_VIOLET 5 > #define LED_COLOR_ID_YELLOW 6 > #define LED_COLOR_ID_IR 7 > -#define LED_COLOR_ID_MULTI 8 > -#define LED_COLOR_ID_MAX 9 > +#define LED_COLOR_ID_MULTI 8 /* For multicolor LEDs */ > +#define LED_COLOR_ID_RGB 9 /* For multicolor LEDs that > can do arbitrary color, > + so this would include > RGBW and similar */ +#define LED_COLOR_ID_MAX 10 > > /* Standard LED functions */ > /* Keyboard LEDs, usually it would be input4::capslock etc. */ > > Yes, if you want to have RGB as a special case of multicolor so that in the future we can work on color curves or something, this could work. Marek