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