]>
Commit | Line | Data |
---|---|---|
23b80982 TR |
1 | /* |
2 | * Copyright (c) 2009 Wind River Systems, Inc. | |
3 | * Tom Rix <Tom.Rix@windriver.com> | |
4 | * (C) Copyright 2009 | |
5 | * Eric Benard <eric@eukrea.com> | |
6 | * | |
1a459660 | 7 | * SPDX-License-Identifier: GPL-2.0+ |
23b80982 TR |
8 | */ |
9 | ||
10 | #include <common.h> | |
11 | #include <status_led.h> | |
12 | #include <asm/arch/at91sam9260.h> | |
13 | #include <asm/arch/at91_pmc.h> | |
14 | #include <asm/arch/gpio.h> | |
95d50e5c | 15 | #include <asm/io.h> |
23b80982 TR |
16 | |
17 | static unsigned int saved_state[4] = {STATUS_LED_OFF, STATUS_LED_OFF, | |
18 | STATUS_LED_OFF, STATUS_LED_OFF}; | |
19 | ||
20 | void coloured_LED_init(void) | |
21 | { | |
95d50e5c | 22 | at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; |
c2b2a07e | 23 | |
23b80982 | 24 | /* Enable clock */ |
95d50e5c | 25 | writel(1 << ATMEL_ID_PIOC, &pmc->pcer); |
23b80982 | 26 | |
c2b2a07e EB |
27 | at91_set_pio_output(CONFIG_RED_LED, 1); |
28 | at91_set_pio_output(CONFIG_GREEN_LED, 1); | |
29 | at91_set_pio_output(CONFIG_YELLOW_LED, 1); | |
30 | at91_set_pio_output(CONFIG_BLUE_LED, 1); | |
23b80982 | 31 | |
c2b2a07e EB |
32 | at91_set_pio_value(CONFIG_RED_LED, 1); |
33 | at91_set_pio_value(CONFIG_GREEN_LED, 1); | |
34 | at91_set_pio_value(CONFIG_YELLOW_LED, 1); | |
35 | at91_set_pio_value(CONFIG_BLUE_LED, 1); | |
23b80982 TR |
36 | } |
37 | ||
2d3be7c4 | 38 | void red_led_off(void) |
23b80982 | 39 | { |
c2b2a07e | 40 | at91_set_pio_value(CONFIG_RED_LED, 1); |
23b80982 TR |
41 | saved_state[STATUS_LED_RED] = STATUS_LED_OFF; |
42 | } | |
43 | ||
2d3be7c4 | 44 | void green_led_off(void) |
23b80982 | 45 | { |
c2b2a07e | 46 | at91_set_pio_value(CONFIG_GREEN_LED, 1); |
23b80982 TR |
47 | saved_state[STATUS_LED_GREEN] = STATUS_LED_OFF; |
48 | } | |
49 | ||
2d3be7c4 | 50 | void yellow_led_off(void) |
23b80982 | 51 | { |
c2b2a07e | 52 | at91_set_pio_value(CONFIG_YELLOW_LED, 1); |
23b80982 TR |
53 | saved_state[STATUS_LED_YELLOW] = STATUS_LED_OFF; |
54 | } | |
55 | ||
2d3be7c4 | 56 | void blue_led_off(void) |
23b80982 | 57 | { |
c2b2a07e | 58 | at91_set_pio_value(CONFIG_BLUE_LED, 1); |
23b80982 TR |
59 | saved_state[STATUS_LED_BLUE] = STATUS_LED_OFF; |
60 | } | |
61 | ||
2d3be7c4 | 62 | void red_led_on(void) |
23b80982 | 63 | { |
c2b2a07e | 64 | at91_set_pio_value(CONFIG_RED_LED, 0); |
23b80982 TR |
65 | saved_state[STATUS_LED_RED] = STATUS_LED_ON; |
66 | } | |
67 | ||
2d3be7c4 | 68 | void green_led_on(void) |
23b80982 | 69 | { |
c2b2a07e | 70 | at91_set_pio_value(CONFIG_GREEN_LED, 0); |
23b80982 TR |
71 | saved_state[STATUS_LED_GREEN] = STATUS_LED_ON; |
72 | } | |
73 | ||
2d3be7c4 | 74 | void yellow_led_on(void) |
23b80982 | 75 | { |
c2b2a07e | 76 | at91_set_pio_value(CONFIG_YELLOW_LED, 0); |
23b80982 TR |
77 | saved_state[STATUS_LED_YELLOW] = STATUS_LED_ON; |
78 | } | |
79 | ||
2d3be7c4 | 80 | void blue_led_on(void) |
23b80982 | 81 | { |
c2b2a07e | 82 | at91_set_pio_value(CONFIG_BLUE_LED, 0); |
23b80982 TR |
83 | saved_state[STATUS_LED_BLUE] = STATUS_LED_ON; |
84 | } | |
85 | ||
86 | void __led_init(led_id_t mask, int state) | |
87 | { | |
88 | __led_set(mask, state); | |
89 | } | |
90 | ||
91 | void __led_toggle(led_id_t mask) | |
92 | { | |
93 | if (STATUS_LED_BLUE == mask) { | |
94 | if (STATUS_LED_ON == saved_state[STATUS_LED_BLUE]) | |
2d3be7c4 | 95 | blue_led_off(); |
23b80982 | 96 | else |
2d3be7c4 | 97 | blue_led_on(); |
23b80982 TR |
98 | } else if (STATUS_LED_RED == mask) { |
99 | if (STATUS_LED_ON == saved_state[STATUS_LED_RED]) | |
2d3be7c4 | 100 | red_led_off(); |
23b80982 | 101 | else |
2d3be7c4 | 102 | red_led_on(); |
23b80982 TR |
103 | } else if (STATUS_LED_GREEN == mask) { |
104 | if (STATUS_LED_ON == saved_state[STATUS_LED_GREEN]) | |
2d3be7c4 | 105 | green_led_off(); |
23b80982 | 106 | else |
2d3be7c4 | 107 | green_led_on(); |
23b80982 TR |
108 | } else if (STATUS_LED_YELLOW == mask) { |
109 | if (STATUS_LED_ON == saved_state[STATUS_LED_YELLOW]) | |
2d3be7c4 | 110 | yellow_led_off(); |
23b80982 | 111 | else |
2d3be7c4 | 112 | yellow_led_on(); |
23b80982 TR |
113 | } |
114 | } | |
115 | ||
116 | void __led_set(led_id_t mask, int state) | |
117 | { | |
118 | if (STATUS_LED_BLUE == mask) { | |
119 | if (STATUS_LED_ON == state) | |
2d3be7c4 | 120 | blue_led_on(); |
23b80982 | 121 | else |
2d3be7c4 | 122 | blue_led_off(); |
23b80982 TR |
123 | } else if (STATUS_LED_RED == mask) { |
124 | if (STATUS_LED_ON == state) | |
2d3be7c4 | 125 | red_led_on(); |
23b80982 | 126 | else |
2d3be7c4 | 127 | red_led_off(); |
23b80982 TR |
128 | } else if (STATUS_LED_GREEN == mask) { |
129 | if (STATUS_LED_ON == state) | |
2d3be7c4 | 130 | green_led_on(); |
23b80982 | 131 | else |
2d3be7c4 | 132 | green_led_off(); |
23b80982 TR |
133 | } else if (STATUS_LED_YELLOW == mask) { |
134 | if (STATUS_LED_ON == state) | |
2d3be7c4 | 135 | yellow_led_on(); |
23b80982 | 136 | else |
2d3be7c4 | 137 | yellow_led_off(); |
23b80982 TR |
138 | } |
139 | } |