18dab9197SMauro Carvalho Chehab========================
28dab9197SMauro Carvalho ChehabKernel driver for lp5562
38dab9197SMauro Carvalho Chehab========================
48dab9197SMauro Carvalho Chehab
58dab9197SMauro Carvalho Chehab* TI LP5562 LED Driver
68dab9197SMauro Carvalho Chehab
78dab9197SMauro Carvalho ChehabAuthor: Milo(Woogyom) Kim <milo.kim@ti.com>
88dab9197SMauro Carvalho Chehab
98dab9197SMauro Carvalho ChehabDescription
108dab9197SMauro Carvalho Chehab===========
118dab9197SMauro Carvalho Chehab
128dab9197SMauro Carvalho Chehab  LP5562 can drive up to 4 channels. R/G/B and White.
138dab9197SMauro Carvalho Chehab  LEDs can be controlled directly via the led class control interface.
148dab9197SMauro Carvalho Chehab
158dab9197SMauro Carvalho Chehab  All four channels can be also controlled using the engine micro programs.
168dab9197SMauro Carvalho Chehab  LP5562 has the internal program memory for running various LED patterns.
178dab9197SMauro Carvalho Chehab  For the details, please refer to 'firmware' section in leds-lp55xx.txt
188dab9197SMauro Carvalho Chehab
198dab9197SMauro Carvalho ChehabDevice attribute
208dab9197SMauro Carvalho Chehab================
218dab9197SMauro Carvalho Chehab
228dab9197SMauro Carvalho Chehabengine_mux
238dab9197SMauro Carvalho Chehab  3 Engines are allocated in LP5562, but the number of channel is 4.
248dab9197SMauro Carvalho Chehab  Therefore each channel should be mapped to the engine number.
258dab9197SMauro Carvalho Chehab
268dab9197SMauro Carvalho Chehab  Value: RGB or W
278dab9197SMauro Carvalho Chehab
288dab9197SMauro Carvalho Chehab  This attribute is used for programming LED data with the firmware interface.
298dab9197SMauro Carvalho Chehab  Unlike the LP5521/LP5523/55231, LP5562 has unique feature for the engine mux,
308dab9197SMauro Carvalho Chehab  so additional sysfs is required
318dab9197SMauro Carvalho Chehab
328dab9197SMauro Carvalho Chehab  LED Map
338dab9197SMauro Carvalho Chehab
348dab9197SMauro Carvalho Chehab  ===== === ===============================
358dab9197SMauro Carvalho Chehab  Red   ... Engine 1 (fixed)
368dab9197SMauro Carvalho Chehab  Green ... Engine 2 (fixed)
378dab9197SMauro Carvalho Chehab  Blue  ... Engine 3 (fixed)
388dab9197SMauro Carvalho Chehab  White ... Engine 1 or 2 or 3 (selective)
398dab9197SMauro Carvalho Chehab  ===== === ===============================
408dab9197SMauro Carvalho Chehab
418dab9197SMauro Carvalho ChehabHow to load the program data using engine_mux
428dab9197SMauro Carvalho Chehab=============================================
438dab9197SMauro Carvalho Chehab
448dab9197SMauro Carvalho Chehab  Before loading the LP5562 program data, engine_mux should be written between
458dab9197SMauro Carvalho Chehab  the engine selection and loading the firmware.
468dab9197SMauro Carvalho Chehab  Engine mux has two different mode, RGB and W.
478dab9197SMauro Carvalho Chehab  RGB is used for loading RGB program data, W is used for W program data.
488dab9197SMauro Carvalho Chehab
498dab9197SMauro Carvalho Chehab  For example, run blinking green channel pattern::
508dab9197SMauro Carvalho Chehab
518dab9197SMauro Carvalho Chehab    echo 2 > /sys/bus/i2c/devices/xxxx/select_engine     # 2 is for green channel
528dab9197SMauro Carvalho Chehab    echo "RGB" > /sys/bus/i2c/devices/xxxx/engine_mux    # engine mux for RGB
538dab9197SMauro Carvalho Chehab    echo 1 > /sys/class/firmware/lp5562/loading
548dab9197SMauro Carvalho Chehab    echo "4000600040FF6000" > /sys/class/firmware/lp5562/data
558dab9197SMauro Carvalho Chehab    echo 0 > /sys/class/firmware/lp5562/loading
568dab9197SMauro Carvalho Chehab    echo 1 > /sys/bus/i2c/devices/xxxx/run_engine
578dab9197SMauro Carvalho Chehab
588dab9197SMauro Carvalho Chehab  To run a blinking white pattern::
598dab9197SMauro Carvalho Chehab
608dab9197SMauro Carvalho Chehab    echo 1 or 2 or 3 > /sys/bus/i2c/devices/xxxx/select_engine
618dab9197SMauro Carvalho Chehab    echo "W" > /sys/bus/i2c/devices/xxxx/engine_mux
628dab9197SMauro Carvalho Chehab    echo 1 > /sys/class/firmware/lp5562/loading
638dab9197SMauro Carvalho Chehab    echo "4000600040FF6000" > /sys/class/firmware/lp5562/data
648dab9197SMauro Carvalho Chehab    echo 0 > /sys/class/firmware/lp5562/loading
658dab9197SMauro Carvalho Chehab    echo 1 > /sys/bus/i2c/devices/xxxx/run_engine
668dab9197SMauro Carvalho Chehab
678dab9197SMauro Carvalho ChehabHow to load the predefined patterns
688dab9197SMauro Carvalho Chehab===================================
698dab9197SMauro Carvalho Chehab
708dab9197SMauro Carvalho Chehab  Please refer to 'leds-lp55xx.txt"
718dab9197SMauro Carvalho Chehab
728dab9197SMauro Carvalho ChehabSetting Current of Each Channel
738dab9197SMauro Carvalho Chehab===============================
748dab9197SMauro Carvalho Chehab
758dab9197SMauro Carvalho Chehab  Like LP5521 and LP5523/55231, LP5562 provides LED current settings.
768dab9197SMauro Carvalho Chehab  The 'led_current' and 'max_current' are used.
778dab9197SMauro Carvalho Chehab
788dab9197SMauro Carvalho ChehabExample of Platform data
798dab9197SMauro Carvalho Chehab========================
808dab9197SMauro Carvalho Chehab
818dab9197SMauro Carvalho Chehab::
828dab9197SMauro Carvalho Chehab
838dab9197SMauro Carvalho Chehab	static struct lp55xx_led_config lp5562_led_config[] = {
848dab9197SMauro Carvalho Chehab		{
858dab9197SMauro Carvalho Chehab			.name 		= "R",
868dab9197SMauro Carvalho Chehab			.chan_nr	= 0,
878dab9197SMauro Carvalho Chehab			.led_current	= 20,
888dab9197SMauro Carvalho Chehab			.max_current	= 40,
898dab9197SMauro Carvalho Chehab		},
908dab9197SMauro Carvalho Chehab		{
918dab9197SMauro Carvalho Chehab			.name 		= "G",
928dab9197SMauro Carvalho Chehab			.chan_nr	= 1,
938dab9197SMauro Carvalho Chehab			.led_current	= 20,
948dab9197SMauro Carvalho Chehab			.max_current	= 40,
958dab9197SMauro Carvalho Chehab		},
968dab9197SMauro Carvalho Chehab		{
978dab9197SMauro Carvalho Chehab			.name 		= "B",
988dab9197SMauro Carvalho Chehab			.chan_nr	= 2,
998dab9197SMauro Carvalho Chehab			.led_current	= 20,
1008dab9197SMauro Carvalho Chehab			.max_current	= 40,
1018dab9197SMauro Carvalho Chehab		},
1028dab9197SMauro Carvalho Chehab		{
1038dab9197SMauro Carvalho Chehab			.name 		= "W",
1048dab9197SMauro Carvalho Chehab			.chan_nr	= 3,
1058dab9197SMauro Carvalho Chehab			.led_current	= 20,
1068dab9197SMauro Carvalho Chehab			.max_current	= 40,
1078dab9197SMauro Carvalho Chehab		},
1088dab9197SMauro Carvalho Chehab	};
1098dab9197SMauro Carvalho Chehab
1108dab9197SMauro Carvalho Chehab	static int lp5562_setup(void)
1118dab9197SMauro Carvalho Chehab	{
1128dab9197SMauro Carvalho Chehab		/* setup HW resources */
1138dab9197SMauro Carvalho Chehab	}
1148dab9197SMauro Carvalho Chehab
1158dab9197SMauro Carvalho Chehab	static void lp5562_release(void)
1168dab9197SMauro Carvalho Chehab	{
1178dab9197SMauro Carvalho Chehab		/* Release HW resources */
1188dab9197SMauro Carvalho Chehab	}
1198dab9197SMauro Carvalho Chehab
1208dab9197SMauro Carvalho Chehab	static void lp5562_enable(bool state)
1218dab9197SMauro Carvalho Chehab	{
1228dab9197SMauro Carvalho Chehab		/* Control of chip enable signal */
1238dab9197SMauro Carvalho Chehab	}
1248dab9197SMauro Carvalho Chehab
1258dab9197SMauro Carvalho Chehab	static struct lp55xx_platform_data lp5562_platform_data = {
1268dab9197SMauro Carvalho Chehab		.led_config     = lp5562_led_config,
1278dab9197SMauro Carvalho Chehab		.num_channels   = ARRAY_SIZE(lp5562_led_config),
1288dab9197SMauro Carvalho Chehab		.setup_resources   = lp5562_setup,
1298dab9197SMauro Carvalho Chehab		.release_resources = lp5562_release,
1308dab9197SMauro Carvalho Chehab		.enable            = lp5562_enable,
1318dab9197SMauro Carvalho Chehab	};
1328dab9197SMauro Carvalho Chehab
1338dab9197SMauro Carvalho ChehabTo configure the platform specific data, lp55xx_platform_data structure is used
1348dab9197SMauro Carvalho Chehab
1358dab9197SMauro Carvalho Chehab
1368dab9197SMauro Carvalho ChehabIf the current is set to 0 in the platform data, that channel is
1378dab9197SMauro Carvalho Chehabdisabled and it is not visible in the sysfs.
138