aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel <pavel@ucw.cz>2018-10-28 13:16:47 +0100
committerPavel <pavel@ucw.cz>2019-01-07 11:22:07 +0100
commit8780c5158b1ebd4b952943041f25cba6a419c00a (patch)
tree9cfe28ddd15158de2bcf86113b915c4df6bf3356
parent347e0cd3da949ba484e93eb65cfafe3d1dcce4e6 (diff)
downloadlinux-k-8780c5158b1ebd4b952943041f25cba6a419c00a.tar.gz
leds: rgb: lp5523 support
-rw-r--r--drivers/leds/leds-lp5523.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c
index a2e74feee2b2fa..7b14c2f843cb1a 100644
--- a/drivers/leds/leds-lp5523.c
+++ b/drivers/leds/leds-lp5523.c
@@ -185,7 +185,7 @@ static void lp5523_load_engine(struct lp55xx_chip *chip)
lp5523_wait_opmode_done();
}
-static void lp5523_load_engine_and_select_page(struct lp55xx_chip *chip)
+void lp5523_load_engine_and_select_page(struct lp55xx_chip *chip)
{
enum lp55xx_engine_index idx = chip->engine_idx;
static const u8 page_sel[] = {
@@ -380,6 +380,7 @@ static void lp5523_firmware_loaded(struct lp55xx_chip *chip)
{
const struct firmware *fw = chip->fw;
+ /* FIXME: is this correct? fw->size is for ascii-encoded firmware... */
if (fw->size > LP5523_PROGRAM_LENGTH) {
dev_err(&chip->cl->dev, "firmware data size overflow: %zu\n",
fw->size);
@@ -802,6 +803,26 @@ leave:
return ret;
}
+int lp5523_rgb_brightness(struct lp55xx_led *led, struct led_rgb r)
+{
+ struct lp55xx_chip *chip = led->chip;
+ int ret;
+
+ mutex_lock(&chip->lock);
+ r.red >>= 24;
+ r.green >>= 24;
+ r.blue >>= 24;
+ //printk("RGB brightness %d %d %d\n", r.red, r.green, r.blue);
+ ret = lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + led->chan_nr, r.red);
+ if (!ret)
+ lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + led->chan_nr - 1, r.green);
+ if (!ret)
+ lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + led->chan_nr - 2, r.blue);
+ mutex_unlock(&chip->lock);
+ return ret;
+
+}
+
static int lp5523_led_brightness(struct lp55xx_led *led)
{
struct lp55xx_chip *chip = led->chip;