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