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