diff options
author | Milo Kim <milo.kim@ti.com> | 2013-11-21 01:14:34 -0500 |
---|---|---|
committer | Bryan Wu <cooloney@gmail.com> | 2014-01-27 20:28:48 -0500 |
commit | 93ad8a1d59a35ef7b489a83552daee6506f47815 (patch) | |
tree | 06a2f03a7b613da719200780ff03e1c027ce5a90 | |
parent | 28c9266b38a00a07497daad0237f7fa154652ece (diff) |
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>
-rw-r--r-- | Documentation/leds/leds-lp55xx.txt | 10 | ||||
-rw-r--r-- | drivers/leds/leds-lp55xx-common.c | 2 |
2 files changed, 11 insertions, 1 deletions
diff --git a/Documentation/leds/leds-lp55xx.txt b/Documentation/leds/leds-lp55xx.txt index 82713ff92eb3..bcea12a0c584 100644 --- a/Documentation/leds/leds-lp55xx.txt +++ b/Documentation/leds/leds-lp55xx.txt | |||
@@ -73,6 +73,10 @@ select_engine : Select which engine is used for running program | |||
73 | run_engine : Start program which is loaded via the firmware interface | 73 | run_engine : Start program which is loaded via the firmware interface |
74 | firmware : Load program data | 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 | For example, run blinking pattern in engine #1 of LP5521 | 80 | For example, run blinking pattern in engine #1 of LP5521 |
77 | echo 1 > /sys/bus/i2c/devices/xxxx/select_engine | 81 | echo 1 > /sys/bus/i2c/devices/xxxx/select_engine |
78 | echo 1 > /sys/class/firmware/lp5521/loading | 82 | echo 1 > /sys/class/firmware/lp5521/loading |
@@ -81,10 +85,12 @@ echo 0 > /sys/class/firmware/lp5521/loading | |||
81 | echo 1 > /sys/bus/i2c/devices/xxxx/run_engine | 85 | echo 1 > /sys/bus/i2c/devices/xxxx/run_engine |
82 | 86 | ||
83 | For example, run blinking pattern in engine #3 of LP55231 | 87 | For example, run blinking pattern in engine #3 of LP55231 |
88 | Two LEDs are configured as pattern output channels. | ||
84 | echo 3 > /sys/bus/i2c/devices/xxxx/select_engine | 89 | echo 3 > /sys/bus/i2c/devices/xxxx/select_engine |
85 | echo 1 > /sys/class/firmware/lp55231/loading | 90 | echo 1 > /sys/class/firmware/lp55231/loading |
86 | echo "9d0740ff7e0040007e00a0010000" > /sys/class/firmware/lp55231/data | 91 | echo "9d0740ff7e0040007e00a0010000" > /sys/class/firmware/lp55231/data |
87 | echo 0 > /sys/class/firmware/lp55231/loading | 92 | echo 0 > /sys/class/firmware/lp55231/loading |
93 | echo "000001100" > /sys/bus/i2c/devices/xxxx/engine3_leds | ||
88 | echo 1 > /sys/bus/i2c/devices/xxxx/run_engine | 94 | echo 1 > /sys/bus/i2c/devices/xxxx/run_engine |
89 | 95 | ||
90 | To start blinking patterns in engine #2 and #3 simultaneously, | 96 | To start blinking patterns in engine #2 and #3 simultaneously, |
@@ -99,17 +105,19 @@ done | |||
99 | echo 1 > /sys/class/leds/red/device/run_engine | 105 | echo 1 > /sys/class/leds/red/device/run_engine |
100 | 106 | ||
101 | Here is another example for LP5523. | 107 | Here is another example for LP5523. |
108 | Full LED strings are selected by 'engine2_leds'. | ||
102 | echo 2 > /sys/bus/i2c/devices/xxxx/select_engine | 109 | echo 2 > /sys/bus/i2c/devices/xxxx/select_engine |
103 | echo 1 > /sys/class/firmware/lp5523/loading | 110 | echo 1 > /sys/class/firmware/lp5523/loading |
104 | echo "9d80400004ff05ff437f0000" > /sys/class/firmware/lp5523/data | 111 | echo "9d80400004ff05ff437f0000" > /sys/class/firmware/lp5523/data |
105 | echo 0 > /sys/class/firmware/lp5523/loading | 112 | echo 0 > /sys/class/firmware/lp5523/loading |
113 | echo "111111111" > /sys/bus/i2c/devices/xxxx/engine2_leds | ||
106 | echo 1 > /sys/bus/i2c/devices/xxxx/run_engine | 114 | echo 1 > /sys/bus/i2c/devices/xxxx/run_engine |
107 | 115 | ||
108 | As soon as 'loading' is set to 0, registered callback is called. | 116 | As soon as 'loading' is set to 0, registered callback is called. |
109 | Inside the callback, the selected engine is loaded and memory is updated. | 117 | Inside the callback, the selected engine is loaded and memory is updated. |
110 | To run programmed pattern, 'run_engine' attribute should be enabled. | 118 | To run programmed pattern, 'run_engine' attribute should be enabled. |
111 | 119 | ||
112 | The pattern sqeuence of LP8501 is same as LP5523. | 120 | The pattern sqeuence of LP8501 is similar to LP5523. |
113 | However pattern data is specific. | 121 | However pattern data is specific. |
114 | Ex 1) Engine 1 is used | 122 | Ex 1) Engine 1 is used |
115 | echo 1 > /sys/bus/i2c/devices/xxxx/select_engine | 123 | echo 1 > /sys/bus/i2c/devices/xxxx/select_engine |
diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c index 9acc6bb7deef..88317b4f7bf3 100644 --- a/drivers/leds/leds-lp55xx-common.c +++ b/drivers/leds/leds-lp55xx-common.c | |||
@@ -210,6 +210,7 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context) | |||
210 | { | 210 | { |
211 | struct lp55xx_chip *chip = context; | 211 | struct lp55xx_chip *chip = context; |
212 | struct device *dev = &chip->cl->dev; | 212 | struct device *dev = &chip->cl->dev; |
213 | enum lp55xx_engine_index idx = chip->engine_idx; | ||
213 | 214 | ||
214 | if (!fw) { | 215 | if (!fw) { |
215 | dev_err(dev, "firmware request failed\n"); | 216 | dev_err(dev, "firmware request failed\n"); |
@@ -219,6 +220,7 @@ static void lp55xx_firmware_loaded(const struct firmware *fw, void *context) | |||
219 | /* handling firmware data is chip dependent */ | 220 | /* handling firmware data is chip dependent */ |
220 | mutex_lock(&chip->lock); | 221 | mutex_lock(&chip->lock); |
221 | 222 | ||
223 | chip->engines[idx - 1].mode = LP55XX_ENGINE_LOAD; | ||
222 | chip->fw = fw; | 224 | chip->fw = fw; |
223 | if (chip->cfg->firmware_cb) | 225 | if (chip->cfg->firmware_cb) |
224 | chip->cfg->firmware_cb(chip); | 226 | chip->cfg->firmware_cb(chip); |