Merge 3.2-rc1 into usb-linus
[cascardo/linux.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/init.h>
7
8 #include <mach/hardware.h>
9 #include <asm/leds.h>
10
11 #include "leds.h"
12
13
14 #define LED_STATE_ENABLED       1
15 #define LED_STATE_CLAIMED       2
16
17 static unsigned int led_state;
18 static unsigned int hw_led_state;
19
20 #define LED_D0          GPIO_GPIO(0)
21 #define LED_D1          GPIO_GPIO(1)
22 #define LED_D2          GPIO_GPIO(2)
23 #define LED_D3          GPIO_GPIO(3)
24 #define LED_MASK        (LED_D0|LED_D1|LED_D2|LED_D3)
25
26 void cerf_leds_event(led_event_t evt)
27 {
28         unsigned long flags;
29
30         local_irq_save(flags);
31
32         switch (evt) {
33         case led_start:
34                 hw_led_state = LED_MASK;
35                 led_state = LED_STATE_ENABLED;
36                 break;
37
38         case led_stop:
39                 led_state &= ~LED_STATE_ENABLED;
40                 break;
41
42         case led_claim:
43                 led_state |= LED_STATE_CLAIMED;
44                 hw_led_state = LED_MASK;
45                 break;
46         case led_release:
47                 led_state &= ~LED_STATE_CLAIMED;
48                 hw_led_state = LED_MASK;
49                 break;
50
51 #ifdef CONFIG_LEDS_TIMER
52         case led_timer:
53                 if (!(led_state & LED_STATE_CLAIMED))
54                         hw_led_state ^= LED_D0;
55                 break;
56 #endif
57
58 #ifdef CONFIG_LEDS_CPU
59         case led_idle_start:
60                 if (!(led_state & LED_STATE_CLAIMED))
61                         hw_led_state &= ~LED_D1;
62                 break;
63
64         case led_idle_end:
65                 if (!(led_state & LED_STATE_CLAIMED))
66                         hw_led_state |= LED_D1;
67                 break;
68 #endif
69         case led_green_on:
70                 if (!(led_state & LED_STATE_CLAIMED))
71                         hw_led_state &= ~LED_D2;
72                 break;
73
74         case led_green_off:
75                 if (!(led_state & LED_STATE_CLAIMED))
76                         hw_led_state |= LED_D2;
77                 break;
78
79         case led_amber_on:
80                 if (!(led_state & LED_STATE_CLAIMED))
81                         hw_led_state &= ~LED_D3;
82                 break;
83
84         case led_amber_off:
85                 if (!(led_state & LED_STATE_CLAIMED))
86                         hw_led_state |= LED_D3;
87                 break;
88
89         case led_red_on:
90                 if (!(led_state & LED_STATE_CLAIMED))
91                         hw_led_state &= ~LED_D1;
92                 break;
93
94         case led_red_off:
95                 if (!(led_state & LED_STATE_CLAIMED))
96                         hw_led_state |= LED_D1;
97                 break;
98
99         default:
100                 break;
101         }
102
103         if  (led_state & LED_STATE_ENABLED) {
104                 GPSR = hw_led_state;
105                 GPCR = hw_led_state ^ LED_MASK;
106         }
107
108         local_irq_restore(flags);
109 }