Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: lp5523: Support LED MUX configuration on running a pattern

There are two ways to run a pattern in LP5523.
One is using legacy sysfs files such as 'enginex_mode','enginex_load' and
'enginex_leds'. ('x' is from 1 to 3).
Among them, 'enginex_leds' are used for selecting specific LED channel MUX.
(MUX means which LEDs are used for running a pattern from LED 1 to 9.)

The other way is using the firmware interface.
In this mode, the default LED MUX strings are used.
In other words, LED MUX is not configurable on the fly.

This patch enables dynamic LED MUX configuration when the firmware is loaded.
By accessing the sysfs file 'enginex_leds', the LED channels can be configured.
To synchronize the operation mode, each engine mode should be set to 'LOAD'.

The documentation is updated as well.

Cc: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Milo Kim <milo.kim@ti.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>

authored by

Milo Kim and committed by
Bryan Wu
93ad8a1d 28c9266b

+11 -1
+9 -1
Documentation/leds/leds-lp55xx.txt
··· 73 73 run_engine : Start program which is loaded via the firmware interface 74 74 firmware : Load program data 75 75 76 + In case of LP5523, one more command is required, 'enginex_leds'. 77 + It is used for selecting LED output(s) at each engine number. 78 + In more details, please refer to 'leds-lp5523.txt'. 79 + 76 80 For example, run blinking pattern in engine #1 of LP5521 77 81 echo 1 > /sys/bus/i2c/devices/xxxx/select_engine 78 82 echo 1 > /sys/class/firmware/lp5521/loading ··· 85 81 echo 1 > /sys/bus/i2c/devices/xxxx/run_engine 86 82 87 83 For example, run blinking pattern in engine #3 of LP55231 84 + Two LEDs are configured as pattern output channels. 88 85 echo 3 > /sys/bus/i2c/devices/xxxx/select_engine 89 86 echo 1 > /sys/class/firmware/lp55231/loading 90 87 echo "9d0740ff7e0040007e00a0010000" > /sys/class/firmware/lp55231/data 91 88 echo 0 > /sys/class/firmware/lp55231/loading 89 + echo "000001100" > /sys/bus/i2c/devices/xxxx/engine3_leds 92 90 echo 1 > /sys/bus/i2c/devices/xxxx/run_engine 93 91 94 92 To start blinking patterns in engine #2 and #3 simultaneously, ··· 105 99 echo 1 > /sys/class/leds/red/device/run_engine 106 100 107 101 Here is another example for LP5523. 102 + Full LED strings are selected by 'engine2_leds'. 108 103 echo 2 > /sys/bus/i2c/devices/xxxx/select_engine 109 104 echo 1 > /sys/class/firmware/lp5523/loading 110 105 echo "9d80400004ff05ff437f0000" > /sys/class/firmware/lp5523/data 111 106 echo 0 > /sys/class/firmware/lp5523/loading 107 + echo "111111111" > /sys/bus/i2c/devices/xxxx/engine2_leds 112 108 echo 1 > /sys/bus/i2c/devices/xxxx/run_engine 113 109 114 110 As soon as 'loading' is set to 0, registered callback is called. 115 111 Inside the callback, the selected engine is loaded and memory is updated. 116 112 To run programmed pattern, 'run_engine' attribute should be enabled. 117 113 118 - The pattern sqeuence of LP8501 is same as LP5523. 114 + The pattern sqeuence of LP8501 is similar to LP5523. 119 115 However pattern data is specific. 120 116 Ex 1) Engine 1 is used 121 117 echo 1 > /sys/bus/i2c/devices/xxxx/select_engine
+2
drivers/leds/leds-lp55xx-common.c
··· 210 210 { 211 211 struct lp55xx_chip *chip = context; 212 212 struct device *dev = &chip->cl->dev; 213 + enum lp55xx_engine_index idx = chip->engine_idx; 213 214 214 215 if (!fw) { 215 216 dev_err(dev, "firmware request failed\n"); ··· 220 219 /* handling firmware data is chip dependent */ 221 220 mutex_lock(&chip->lock); 222 221 222 + chip->engines[idx - 1].mode = LP55XX_ENGINE_LOAD; 223 223 chip->fw = fw; 224 224 if (chip->cfg->firmware_cb) 225 225 chip->cfg->firmware_cb(chip);