import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / arm / mach-sa1100 / leds-cerf.c
1 /*
2  * linux/arch/arm/mach-sa1100/leds-cerf.c
3  *
4  * Author: ???
5  */
6 #include <linux/config.h>
7 #include <linux/init.h>
8
9 #include <asm/hardware.h>
10 #include <asm/leds.h>
11 #include <asm/system.h>
12
13 #include "leds.h"
14
15
16 #define LED_STATE_ENABLED       1
17 #define LED_STATE_CLAIMED       2
18
19 static unsigned int led_state;
20 static unsigned int hw_led_state;
21
22 #ifdef CONFIG_SA1100_CERF_CPLD
23
24 #define LED_D0          GPIO_GPIO(0)
25 #define LED_D1          GPIO_GPIO(0)
26 #define LED_D2          GPIO_GPIO(0)
27 #define LED_D3          GPIO_GPIO(0)
28 #define LED_MASK        (LED_D0|LED_D1|LED_D2|LED_D3)
29
30 #else
31
32 #define LED_D0          GPIO_GPIO(0)
33 #define LED_D1          GPIO_GPIO(1)
34 #define LED_D2          GPIO_GPIO(2)
35 #define LED_D3          GPIO_GPIO(3)
36 #define LED_MASK        (LED_D0|LED_D1|LED_D2|LED_D3)
37
38 #endif
39
40 void cerf_leds_event(led_event_t evt)
41 {
42         unsigned long flags;
43
44         local_irq_save(flags);
45
46         switch (evt) {
47         case led_start:
48                 hw_led_state = LED_MASK;
49                 led_state = LED_STATE_ENABLED;
50                 break;
51
52         case led_stop:
53                 led_state &= ~LED_STATE_ENABLED;
54                 break;
55
56         case led_claim:
57                 led_state |= LED_STATE_CLAIMED;
58                 hw_led_state = LED_MASK;
59                 break;
60         case led_release:
61                 led_state &= ~LED_STATE_CLAIMED;
62                 hw_led_state = LED_MASK;
63                 break;
64
65 #ifdef CONFIG_LEDS_TIMER
66         case led_timer:
67                 if (!(led_state & LED_STATE_CLAIMED))
68                         hw_led_state ^= LED_D0;
69                 break;
70 #endif
71
72 #ifdef CONFIG_LEDS_CPU
73         case led_idle_start:
74                 if (!(led_state & LED_STATE_CLAIMED))
75                         hw_led_state &= ~LED_D1;
76                 break;
77
78         case led_idle_end:
79                 if (!(led_state & LED_STATE_CLAIMED))
80                         hw_led_state |= LED_D1;
81                 break;
82 #endif
83         case led_green_on:
84                 if (!(led_state & LED_STATE_CLAIMED))
85                         hw_led_state &= ~LED_D2;
86                 break;
87
88         case led_green_off:
89                 if (!(led_state & LED_STATE_CLAIMED))
90                         hw_led_state |= LED_D2;
91                 break;
92
93         case led_amber_on:
94                 if (!(led_state & LED_STATE_CLAIMED))
95                         hw_led_state &= ~LED_D3;
96                 break;
97
98         case led_amber_off:
99                 if (!(led_state & LED_STATE_CLAIMED))
100                         hw_led_state |= LED_D3;
101                 break;
102
103         case led_red_on:
104                 if (!(led_state & LED_STATE_CLAIMED))
105                         hw_led_state &= ~LED_D1;
106                 break;
107
108         case led_red_off:
109                 if (!(led_state & LED_STATE_CLAIMED))
110                         hw_led_state |= LED_D1;
111                 break;
112
113         default:
114                 break;
115         }
116
117         if  (led_state & LED_STATE_ENABLED) {
118                 GPSR = hw_led_state;
119                 GPCR = hw_led_state ^ LED_MASK;
120         }
121
122         local_irq_restore(flags);
123 }