1 /*
2  * Status LED driver based on GPIO access conventions of Linux
3  *
4  * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
5  * Licensed under the GPL-2 or later.
6  */
7 
8 #include <status_led.h>
9 #include <asm/gpio.h>
10 
11 #ifndef CFG_GPIO_LED_INVERTED_TABLE
12 #define CFG_GPIO_LED_INVERTED_TABLE {}
13 #endif
14 
15 static led_id_t gpio_led_inv[] = CFG_GPIO_LED_INVERTED_TABLE;
16 
gpio_led_gpio_value(led_id_t mask,int state)17 static int gpio_led_gpio_value(led_id_t mask, int state)
18 {
19 	int i, gpio_value = (state == CONFIG_LED_STATUS_ON);
20 
21 	for (i = 0; i < ARRAY_SIZE(gpio_led_inv); i++) {
22 		if (gpio_led_inv[i] == mask)
23 			gpio_value = !gpio_value;
24 	}
25 
26 	return gpio_value;
27 }
28 
__led_init(led_id_t mask,int state)29 void __led_init(led_id_t mask, int state)
30 {
31 	int gpio_value;
32 
33 	if (gpio_request(mask, "gpio_led") != 0) {
34 		printf("%s: failed requesting GPIO%lu!\n", __func__, mask);
35 		return;
36 	}
37 
38 	gpio_value = gpio_led_gpio_value(mask, state);
39 	gpio_direction_output(mask, gpio_value);
40 }
41 
__led_set(led_id_t mask,int state)42 void __led_set(led_id_t mask, int state)
43 {
44 	int gpio_value = gpio_led_gpio_value(mask, state);
45 
46 	gpio_set_value(mask, gpio_value);
47 }
48 
__led_toggle(led_id_t mask)49 void __led_toggle(led_id_t mask)
50 {
51 	gpio_set_value(mask, !gpio_get_value(mask));
52 }
53 
54 #ifdef CONFIG_GPIO_LED_STUBS
55 
56 /* 'generic' override of colored LED stubs, to use GPIO functions instead */
57 
58 #ifdef CONFIG_LED_STATUS_RED
red_led_on(void)59 void red_led_on(void)
60 {
61 	__led_set(CONFIG_LED_STATUS_RED, CONFIG_LED_STATUS_ON);
62 }
63 
red_led_off(void)64 void red_led_off(void)
65 {
66 	__led_set(CONFIG_LED_STATUS_RED, CONFIG_LED_STATUS_OFF);
67 }
68 #endif
69 
70 #ifdef CONFIG_LED_STATUS_GREEN
green_led_on(void)71 void green_led_on(void)
72 {
73 	__led_set(CONFIG_LED_STATUS_GREEN, CONFIG_LED_STATUS_ON);
74 }
75 
green_led_off(void)76 void green_led_off(void)
77 {
78 	__led_set(CONFIG_LED_STATUS_GREEN, CONFIG_LED_STATUS_OFF);
79 }
80 #endif
81 
82 #ifdef CONFIG_LED_STATUS_YELLOW
yellow_led_on(void)83 void yellow_led_on(void)
84 {
85 	__led_set(CONFIG_LED_STATUS_YELLOW, CONFIG_LED_STATUS_ON);
86 }
87 
yellow_led_off(void)88 void yellow_led_off(void)
89 {
90 	__led_set(CONFIG_LED_STATUS_YELLOW, CONFIG_LED_STATUS_OFF);
91 }
92 #endif
93 
94 #ifdef CONFIG_LED_STATUS_BLUE
blue_led_on(void)95 void blue_led_on(void)
96 {
97 	__led_set(CONFIG_LED_STATUS_BLUE, CONFIG_LED_STATUS_ON);
98 }
99 
blue_led_off(void)100 void blue_led_off(void)
101 {
102 	__led_set(CONFIG_LED_STATUS_BLUE, CONFIG_LED_STATUS_OFF);
103 }
104 #endif
105 
106 #endif /* CONFIG_GPIO_LED_STUBS */
107