xref: /rk3399_rockchip-uboot/drivers/misc/gpio_led.c (revision 9dfdcdfed4726f94fc38d94f29f8214f38058576)
13e6b86b5SThomas Chou /*
23e6b86b5SThomas Chou  * Status LED driver based on GPIO access conventions of Linux
33e6b86b5SThomas Chou  *
43e6b86b5SThomas Chou  * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
5ec3b4981SThomas Chou  * Licensed under the GPL-2 or later.
63e6b86b5SThomas Chou  */
73e6b86b5SThomas Chou 
83e6b86b5SThomas Chou #include <common.h>
93e6b86b5SThomas Chou #include <status_led.h>
103e6b86b5SThomas Chou #include <asm/gpio.h>
113e6b86b5SThomas Chou 
12*9dfdcdfeSIgor Grinberg #ifndef CONFIG_GPIO_LED_INVERTED_TABLE
13*9dfdcdfeSIgor Grinberg #define CONFIG_GPIO_LED_INVERTED_TABLE {}
14*9dfdcdfeSIgor Grinberg #endif
15*9dfdcdfeSIgor Grinberg 
16*9dfdcdfeSIgor Grinberg static led_id_t gpio_led_inv[] = CONFIG_GPIO_LED_INVERTED_TABLE;
17*9dfdcdfeSIgor Grinberg 
18*9dfdcdfeSIgor Grinberg static int gpio_led_gpio_value(led_id_t mask, int state)
19*9dfdcdfeSIgor Grinberg {
20*9dfdcdfeSIgor Grinberg 	int i, gpio_value = (state == STATUS_LED_ON);
21*9dfdcdfeSIgor Grinberg 
22*9dfdcdfeSIgor Grinberg 	for (i = 0; i < ARRAY_SIZE(gpio_led_inv); i++) {
23*9dfdcdfeSIgor Grinberg 		if (gpio_led_inv[i] == mask)
24*9dfdcdfeSIgor Grinberg 			gpio_value = !gpio_value;
25*9dfdcdfeSIgor Grinberg 	}
26*9dfdcdfeSIgor Grinberg 
27*9dfdcdfeSIgor Grinberg 	return gpio_value;
28*9dfdcdfeSIgor Grinberg }
29*9dfdcdfeSIgor Grinberg 
303e6b86b5SThomas Chou void __led_init(led_id_t mask, int state)
313e6b86b5SThomas Chou {
32*9dfdcdfeSIgor Grinberg 	int gpio_value;
33*9dfdcdfeSIgor Grinberg 
346516f81bSIgor Grinberg 	if (gpio_request(mask, "gpio_led") != 0) {
356516f81bSIgor Grinberg 		printf("%s: failed requesting GPIO%lu!\n", __func__, mask);
366516f81bSIgor Grinberg 		return;
376516f81bSIgor Grinberg 	}
386516f81bSIgor Grinberg 
39*9dfdcdfeSIgor Grinberg 	gpio_value = gpio_led_gpio_value(mask, state);
40*9dfdcdfeSIgor Grinberg 	gpio_direction_output(mask, gpio_value);
413e6b86b5SThomas Chou }
423e6b86b5SThomas Chou 
433e6b86b5SThomas Chou void __led_set(led_id_t mask, int state)
443e6b86b5SThomas Chou {
45*9dfdcdfeSIgor Grinberg 	int gpio_value = gpio_led_gpio_value(mask, state);
46*9dfdcdfeSIgor Grinberg 
47*9dfdcdfeSIgor Grinberg 	gpio_set_value(mask, gpio_value);
483e6b86b5SThomas Chou }
493e6b86b5SThomas Chou 
503e6b86b5SThomas Chou void __led_toggle(led_id_t mask)
513e6b86b5SThomas Chou {
523e6b86b5SThomas Chou 	gpio_set_value(mask, !gpio_get_value(mask));
533e6b86b5SThomas Chou }
54