initial commit with v2.6.9
[linux-2.6.9-moxart.git] / arch / arm / mach-sa1100 / leds-flexanet.c
blobaf7fabe93236c27a09f681c4b3ea9e56a5037873
1 /*
2 * linux/arch/arm/mach-sa1100/leds-flexanet.c
4 * by Jordi Colomer <jco@ict.es>
6 * Flexanet LEDs
8 * - Red - toggles state every 50 timer interrupts (Heartbeat)
9 * - Green - on if system is not idle (CPU load)
11 #include <linux/config.h>
12 #include <linux/init.h>
14 #include <asm/hardware.h>
15 #include <asm/leds.h>
16 #include <asm/system.h>
18 #include "leds.h"
21 #define LED_STATE_ENABLED 1
22 #define LED_STATE_CLAIMED 2
24 static unsigned int led_state;
25 static unsigned int hw_led_bcr;
26 static unsigned int hw_led_gpio;
29 void flexanet_leds_event(led_event_t evt)
31 unsigned long flags;
33 local_irq_save(flags);
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;
43 case led_stop:
44 /* disable LED h/w */
45 led_state &= ~LED_STATE_ENABLED;
46 break;
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;
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;
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
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;
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
84 case led_halted:
85 break;
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;
94 case led_green_off:
95 if (led_state & LED_STATE_CLAIMED)
96 hw_led_bcr &= ~FHH_BCR_LED_GREEN;
97 break;
99 case led_amber_on:
100 break;
102 case led_amber_off:
103 break;
105 case led_red_on:
106 if (led_state & LED_STATE_CLAIMED)
107 hw_led_gpio |= GPIO_LED_RED;
108 break;
110 case led_red_off:
111 if (led_state & LED_STATE_CLAIMED)
112 hw_led_gpio &= ~GPIO_LED_RED;
113 break;
115 default:
116 break;
119 if (led_state & LED_STATE_ENABLED)
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;
127 local_irq_restore(flags);