import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / arm / mach-sa1100 / leds-frodo.c
1
2 /*
3  * linux/arch/arm/mach-sa1100/leds-frodo.c
4  *
5  * Author: Abraham van der Merwe <abraham@2d3d.co.za>
6  *
7  * This file contains the 2d3D, Inc. SA-1110 Development Board LED
8  * event handler.
9  *
10  * Frodo LEDs
11  *
12  *   - led6 - toggles state every 50 timer interrupts (Heartbeat)
13  *   - led7 - on if system is not idle (CPU load)
14  */
15
16 #include <linux/config.h>
17 #include <linux/init.h>
18
19 #include <asm/hardware.h>
20 #include <asm/leds.h>
21 #include <asm/system.h>
22
23 #include "leds.h"
24
25 #define led6_on() frodo_cpld_set (FRODO_CPLD_GENERAL,FRODO_LED2)
26 #define led6_off() frodo_cpld_clear (FRODO_CPLD_GENERAL,FRODO_LED2)
27 #define led6_invert() do {                                                                                      \
28                 if ((frodo_cpld_read (FRODO_CPLD_GENERAL) & FRODO_LED2))        \
29                         led6_off ();                                                                                    \
30                 else                                                                                                            \
31                         led6_on ();                                                                                             \
32         } while (0)
33
34 #define led7_on() frodo_cpld_set (FRODO_CPLD_GENERAL,FRODO_LED1)
35 #define led7_off() frodo_cpld_clear (FRODO_CPLD_GENERAL,FRODO_LED1)
36 #define led7_invert() do {                                              \
37                 if ((frodo_cpld_read (FRODO_CPLD_GENERAL) & FRODO_LED1))        \
38                         led7_off ();                                                                                    \
39                 else                                                                                                            \
40                         led7_on ();                                                                                             \
41         } while (0)
42
43 static int claimed;
44
45 void frodo_leds_event (led_event_t evt)
46 {
47    unsigned long flags;
48
49    local_irq_save (flags);
50
51    switch (evt)
52          {
53 #ifdef CONFIG_LEDS_CPU
54                 /* turn off CPU load LED */
55           case led_idle_start:
56                 if (!claimed) led7_off ();
57                 break;
58
59                 /* turn on CPU load LED */
60           case led_idle_end:
61                 if (!claimed) led7_on ();
62                 break;
63 #endif
64
65 #ifdef CONFIG_LEDS_TIMER
66                 /* toggle heartbeat LED */
67           case led_timer:
68                 if (!claimed) led6_invert ();
69                 break;
70 #endif
71
72                 /* start: turn on LEDs and set claimed to 0 */
73           case led_start:
74                 led6_on ();
75                 led7_on ();
76                 claimed = 0;
77                 break;
78
79                 /* stop: turn off LEDs */
80           case led_stop:
81                 led6_off ();
82                 led7_off ();
83                 break;
84
85                 /* override CPU load & timer LEDs */
86           case led_claim:
87                 claimed = 1;
88                 break;
89
90                 /* restore CPU load & timer LEDs */
91           case led_release:
92                 claimed = 0;
93                 break;
94
95                 /* direct LED access (must be previously claimed) */
96
97                 /* led7 */
98           case led_green_on:
99                 if (claimed) led7_on ();
100                 break;
101
102           case led_green_off:
103                 if (claimed) led7_off ();
104                 break;
105
106                 /* led6 -- at the moment this is actually also green */
107           case led_red_on:
108                 if (claimed) led6_on ();
109                 break;
110
111           case led_red_off:
112                 if (claimed) led6_off ();
113                 break;
114
115           default:
116                 break;
117         }
118
119    local_irq_restore (flags);
120 }
121