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