Dan, On 9/26/19 2:02 PM, Dan Murphy wrote: > Jacek > > On 9/25/19 5:00 PM, Jacek Anaszewski wrote: >> Dan, >> >> On 9/25/19 7:46 PM, Dan Murphy wrote: >>> Update the lp5523 to allow the use of the multi color framework. >>> >>> Signed-off-by: Dan Murphy <dmurphy@xxxxxx> >>> --- >>> drivers/leds/Kconfig | 1 + >>> drivers/leds/leds-lp5523.c | 13 ++ >>> drivers/leds/leds-lp55xx-common.c | 150 ++++++++++++++++++---- >>> drivers/leds/leds-lp55xx-common.h | 11 ++ >>> include/linux/platform_data/leds-lp55xx.h | 6 + >>> 5 files changed, 157 insertions(+), 24 deletions(-) >>> >>> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig >>> index 84f60e35c5ee..dc3d9f2194cd 100644 >>> --- a/drivers/leds/Kconfig >>> +++ b/drivers/leds/Kconfig >>> @@ -377,6 +377,7 @@ config LEDS_LP50XX >>> config LEDS_LP55XX_COMMON >>> tristate "Common Driver for TI/National >>> LP5521/5523/55231/5562/8501" >>> depends on LEDS_LP5521 || LEDS_LP5523 || LEDS_LP5562 || >>> LEDS_LP8501 >>> + depends on LEDS_CLASS_MULTI_COLOR && OF >>> select FW_LOADER >>> select FW_LOADER_USER_HELPER >>> help >>> diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c >>> index d0b931a136b9..8b2cdb98fed6 100644 >>> --- a/drivers/leds/leds-lp5523.c >>> +++ b/drivers/leds/leds-lp5523.c >>> @@ -791,6 +791,18 @@ static ssize_t store_master_fader_leds(struct >>> device *dev, >>> return ret; >>> } >>> +static int lp5523_led_intensity(struct lp55xx_led *led, int chan_num) >> Why do we need this function? brightness op will not suffice? > > I looked at this before sending it in. This API adds the chan_num to > write to. > > The brightness_fn does not it takes it from the led structure. > >> >>> +{ >>> + struct lp55xx_chip *chip = led->chip; >>> + int ret; >>> + >>> + mutex_lock(&chip->lock); >>> + ret = lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + chan_num, >>> + led->brightness); >>> + mutex_unlock(&chip->lock); >>> + return ret; >>> +} >>> + >>> static int lp5523_led_brightness(struct lp55xx_led *led) >>> { >>> struct lp55xx_chip *chip = led->chip; >>> @@ -857,6 +869,7 @@ static struct lp55xx_device_config lp5523_cfg = { >>> .max_channel = LP5523_MAX_LEDS, >>> .post_init_device = lp5523_post_init_device, >>> .brightness_fn = lp5523_led_brightness, >>> + .color_intensity_fn = lp5523_led_intensity, >>> .set_led_current = lp5523_set_led_current, >>> .firmware_cb = lp5523_firmware_loaded, >>> .run_engine = lp5523_run_engine, >>> diff --git a/drivers/leds/leds-lp55xx-common.c >>> b/drivers/leds/leds-lp55xx-common.c >>> index 44ced02b49f9..0e4b3a9d3047 100644 >>> --- a/drivers/leds/leds-lp55xx-common.c >>> +++ b/drivers/leds/leds-lp55xx-common.c >>> @@ -136,9 +136,26 @@ static int lp55xx_set_brightness(struct >>> led_classdev *cdev, >>> { >>> struct lp55xx_led *led = cdev_to_lp55xx_led(cdev); >>> struct lp55xx_device_config *cfg = led->chip->cfg; >>> + int brightness_val[LP55XX_MAX_GROUPED_CHAN]; >>> + int ret; >>> + int i; >>> + >>> + if (led->mc_cdev.num_leds > 1) { >>> + led_mc_calc_brightness(&led->mc_cdev, >>> + brightness, brightness_val); >>> + for (i = 0; i < led->mc_cdev.num_leds; i++) { >>> + led->brightness = brightness_val[i]; >>> + ret = cfg->color_intensity_fn(led, >>> + led->grouped_channels[i]); >> Now we will have three separate calls for each color component >> (and possibly sleeping on mutex on contention). >> >> Probably LED mc class use case will need a bit different design. >> >> Also, instead of grouped_channels we could possibly have >> >> led_mc_get_color_id(&led->mc_dev, i) > color_id and grouped_channels are not a 1:1 mapping OK, they're channel numbers. >> which would map entry position index to color_id. >> >> I will stop reviewing here and will continue after taking >> deeper look at this lp55xx design. I've analyzed that design in greater detail and have started to wonder why you can't pass two arrays to the new op: channel numbers and corresponding calculated channel intensities? -- Best regards, Jacek Anaszewski