xref: /OK3568_Linux_fs/kernel/Documentation/leds/leds-lp5562.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun========================
2*4882a593SmuzhiyunKernel driver for lp5562
3*4882a593Smuzhiyun========================
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun* TI LP5562 LED Driver
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunAuthor: Milo(Woogyom) Kim <milo.kim@ti.com>
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunDescription
10*4882a593Smuzhiyun===========
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun  LP5562 can drive up to 4 channels. R/G/B and White.
13*4882a593Smuzhiyun  LEDs can be controlled directly via the led class control interface.
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun  All four channels can be also controlled using the engine micro programs.
16*4882a593Smuzhiyun  LP5562 has the internal program memory for running various LED patterns.
17*4882a593Smuzhiyun  For the details, please refer to 'firmware' section in leds-lp55xx.txt
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunDevice attribute
20*4882a593Smuzhiyun================
21*4882a593Smuzhiyun
22*4882a593Smuzhiyunengine_mux
23*4882a593Smuzhiyun  3 Engines are allocated in LP5562, but the number of channel is 4.
24*4882a593Smuzhiyun  Therefore each channel should be mapped to the engine number.
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun  Value: RGB or W
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun  This attribute is used for programming LED data with the firmware interface.
29*4882a593Smuzhiyun  Unlike the LP5521/LP5523/55231, LP5562 has unique feature for the engine mux,
30*4882a593Smuzhiyun  so additional sysfs is required
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun  LED Map
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun  ===== === ===============================
35*4882a593Smuzhiyun  Red   ... Engine 1 (fixed)
36*4882a593Smuzhiyun  Green ... Engine 2 (fixed)
37*4882a593Smuzhiyun  Blue  ... Engine 3 (fixed)
38*4882a593Smuzhiyun  White ... Engine 1 or 2 or 3 (selective)
39*4882a593Smuzhiyun  ===== === ===============================
40*4882a593Smuzhiyun
41*4882a593SmuzhiyunHow to load the program data using engine_mux
42*4882a593Smuzhiyun=============================================
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun  Before loading the LP5562 program data, engine_mux should be written between
45*4882a593Smuzhiyun  the engine selection and loading the firmware.
46*4882a593Smuzhiyun  Engine mux has two different mode, RGB and W.
47*4882a593Smuzhiyun  RGB is used for loading RGB program data, W is used for W program data.
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun  For example, run blinking green channel pattern::
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun    echo 2 > /sys/bus/i2c/devices/xxxx/select_engine     # 2 is for green channel
52*4882a593Smuzhiyun    echo "RGB" > /sys/bus/i2c/devices/xxxx/engine_mux    # engine mux for RGB
53*4882a593Smuzhiyun    echo 1 > /sys/class/firmware/lp5562/loading
54*4882a593Smuzhiyun    echo "4000600040FF6000" > /sys/class/firmware/lp5562/data
55*4882a593Smuzhiyun    echo 0 > /sys/class/firmware/lp5562/loading
56*4882a593Smuzhiyun    echo 1 > /sys/bus/i2c/devices/xxxx/run_engine
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun  To run a blinking white pattern::
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun    echo 1 or 2 or 3 > /sys/bus/i2c/devices/xxxx/select_engine
61*4882a593Smuzhiyun    echo "W" > /sys/bus/i2c/devices/xxxx/engine_mux
62*4882a593Smuzhiyun    echo 1 > /sys/class/firmware/lp5562/loading
63*4882a593Smuzhiyun    echo "4000600040FF6000" > /sys/class/firmware/lp5562/data
64*4882a593Smuzhiyun    echo 0 > /sys/class/firmware/lp5562/loading
65*4882a593Smuzhiyun    echo 1 > /sys/bus/i2c/devices/xxxx/run_engine
66*4882a593Smuzhiyun
67*4882a593SmuzhiyunHow to load the predefined patterns
68*4882a593Smuzhiyun===================================
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun  Please refer to 'leds-lp55xx.txt"
71*4882a593Smuzhiyun
72*4882a593SmuzhiyunSetting Current of Each Channel
73*4882a593Smuzhiyun===============================
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun  Like LP5521 and LP5523/55231, LP5562 provides LED current settings.
76*4882a593Smuzhiyun  The 'led_current' and 'max_current' are used.
77*4882a593Smuzhiyun
78*4882a593SmuzhiyunExample of Platform data
79*4882a593Smuzhiyun========================
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun::
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun	static struct lp55xx_led_config lp5562_led_config[] = {
84*4882a593Smuzhiyun		{
85*4882a593Smuzhiyun			.name 		= "R",
86*4882a593Smuzhiyun			.chan_nr	= 0,
87*4882a593Smuzhiyun			.led_current	= 20,
88*4882a593Smuzhiyun			.max_current	= 40,
89*4882a593Smuzhiyun		},
90*4882a593Smuzhiyun		{
91*4882a593Smuzhiyun			.name 		= "G",
92*4882a593Smuzhiyun			.chan_nr	= 1,
93*4882a593Smuzhiyun			.led_current	= 20,
94*4882a593Smuzhiyun			.max_current	= 40,
95*4882a593Smuzhiyun		},
96*4882a593Smuzhiyun		{
97*4882a593Smuzhiyun			.name 		= "B",
98*4882a593Smuzhiyun			.chan_nr	= 2,
99*4882a593Smuzhiyun			.led_current	= 20,
100*4882a593Smuzhiyun			.max_current	= 40,
101*4882a593Smuzhiyun		},
102*4882a593Smuzhiyun		{
103*4882a593Smuzhiyun			.name 		= "W",
104*4882a593Smuzhiyun			.chan_nr	= 3,
105*4882a593Smuzhiyun			.led_current	= 20,
106*4882a593Smuzhiyun			.max_current	= 40,
107*4882a593Smuzhiyun		},
108*4882a593Smuzhiyun	};
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun	static int lp5562_setup(void)
111*4882a593Smuzhiyun	{
112*4882a593Smuzhiyun		/* setup HW resources */
113*4882a593Smuzhiyun	}
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun	static void lp5562_release(void)
116*4882a593Smuzhiyun	{
117*4882a593Smuzhiyun		/* Release HW resources */
118*4882a593Smuzhiyun	}
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun	static void lp5562_enable(bool state)
121*4882a593Smuzhiyun	{
122*4882a593Smuzhiyun		/* Control of chip enable signal */
123*4882a593Smuzhiyun	}
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun	static struct lp55xx_platform_data lp5562_platform_data = {
126*4882a593Smuzhiyun		.led_config     = lp5562_led_config,
127*4882a593Smuzhiyun		.num_channels   = ARRAY_SIZE(lp5562_led_config),
128*4882a593Smuzhiyun		.setup_resources   = lp5562_setup,
129*4882a593Smuzhiyun		.release_resources = lp5562_release,
130*4882a593Smuzhiyun		.enable            = lp5562_enable,
131*4882a593Smuzhiyun	};
132*4882a593Smuzhiyun
133*4882a593SmuzhiyunTo configure the platform specific data, lp55xx_platform_data structure is used
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun
136*4882a593SmuzhiyunIf the current is set to 0 in the platform data, that channel is
137*4882a593Smuzhiyundisabled and it is not visible in the sysfs.
138