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