import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / arm / mach-sa1100 / leds-flexanet.c
1 /*
2  * linux/arch/arm/mach-sa1100/leds-flexanet.c
3  *
4  * by Jordi Colomer <jco@ict.es>
5  *
6  * Flexanet LEDs
7  *
8  *   - Red   - toggles state every 50 timer interrupts (Heartbeat)
9  *   - Green - on if system is not idle (CPU load)
10  */
11 #include <linux/config.h>
12 #include <linux/init.h>
13
14 #include <asm/hardware.h>
15 #include <asm/leds.h>
16 #include <asm/system.h>
17
18 #include "leds.h"
19
20
21 #define LED_STATE_ENABLED       1
22 #define LED_STATE_CLAIMED       2
23
24 static unsigned int led_state;
25 static unsigned int hw_led_bcr;
26 static unsigned int hw_led_gpio;
27
28
29 void flexanet_leds_event(led_event_t evt)
30 {
31         unsigned long flags;
32
33         local_irq_save(flags);
34
35         switch (evt) {
36         case led_start:
37                 /* start using LEDs and enable its hardware */
38                 hw_led_bcr = FHH_BCR_LED_GREEN;
39                 hw_led_gpio = GPIO_LED_RED;
40                 led_state = LED_STATE_ENABLED;
41                 break;
42
43         case led_stop:
44                 /* disable LED h/w */
45                 led_state &= ~LED_STATE_ENABLED;
46                 break;
47
48         case led_claim:
49                 /* select LEDs for direct access */
50                 led_state |= LED_STATE_CLAIMED;
51                 hw_led_bcr = 0;
52                 hw_led_gpio = 0;
53                 break;
54
55         case led_release:
56                 /* release LEDs from direct access */
57                 led_state &= ~LED_STATE_CLAIMED;
58                 hw_led_bcr = 0;
59                 hw_led_gpio = 0;
60                 break;
61
62 #ifdef CONFIG_LEDS_TIMER
63         case led_timer:
64                 /* toggle heartbeat LED */
65                 if (!(led_state & LED_STATE_CLAIMED))
66                         hw_led_gpio ^= GPIO_LED_RED;
67                 break;
68 #endif
69
70 #ifdef CONFIG_LEDS_CPU
71         case led_idle_start:
72                 /* turn off CPU load LED */
73                 if (!(led_state & LED_STATE_CLAIMED))
74                         hw_led_bcr &= ~FHH_BCR_LED_GREEN;
75                 break;
76
77         case led_idle_end:
78                 /* turn on CPU load LED */
79                 if (!(led_state & LED_STATE_CLAIMED))
80                         hw_led_bcr |= FHH_BCR_LED_GREEN;
81                 break;
82 #endif
83
84         case led_halted:
85                 break;
86
87
88         /* direct LED access (must be previously claimed) */
89         case led_green_on:
90                 if (led_state & LED_STATE_CLAIMED)
91                         hw_led_bcr |= FHH_BCR_LED_GREEN;
92                 break;
93
94         case led_green_off:
95                 if (led_state & LED_STATE_CLAIMED)
96                         hw_led_bcr &= ~FHH_BCR_LED_GREEN;
97                 break;
98
99         case led_amber_on:
100                 break;
101
102         case led_amber_off:
103                 break;
104
105         case led_red_on:
106                 if (led_state & LED_STATE_CLAIMED)
107                         hw_led_gpio |= GPIO_LED_RED;
108                 break;
109
110         case led_red_off:
111                 if (led_state & LED_STATE_CLAIMED)
112                         hw_led_gpio &= ~GPIO_LED_RED;
113                 break;
114
115         default:
116                 break;
117         }
118
119         if  (led_state & LED_STATE_ENABLED)
120         {
121                 /* update LEDs */
122                 FHH_BCR = flexanet_BCR = (flexanet_BCR & ~FHH_BCR_LED_GREEN) | hw_led_bcr;
123                 GPSR = hw_led_gpio;
124                 GPCR = hw_led_gpio ^ GPIO_LED_RED;
125         }
126
127         local_irq_restore(flags);
128 }
129