1 /*
2  * linux/arch/arm/mach-sa1100/leds-lart.c
3  *
4  * (C) Erik Mouw (J.A.K.Mouw@its.tudelft.nl), April 21, 2000
5  *
6  * LART uses the LED as follows:
7  *   - GPIO23 is the LED, on if system is not idle
8  *  You can use both CONFIG_LEDS_CPU and CONFIG_LEDS_TIMER at the same
9  *  time, but in that case the timer events will still dictate the
10  *  pace of the LED.
11  */
12 #include <linux/init.h>
13 
14 #include <mach/hardware.h>
15 #include <asm/leds.h>
16 
17 #include "leds.h"
18 
19 
20 #define LED_STATE_ENABLED	1
21 #define LED_STATE_CLAIMED	2
22 
23 static unsigned int led_state;
24 static unsigned int hw_led_state;
25 
26 #define LED_23    GPIO_GPIO23
27 #define LED_MASK  (LED_23)
28 
lart_leds_event(led_event_t evt)29 void lart_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 		/* pin 23 is output pin */
38 		GPDR |= LED_23;
39 		hw_led_state = LED_MASK;
40 		led_state = LED_STATE_ENABLED;
41 		break;
42 
43 	case led_stop:
44 		led_state &= ~LED_STATE_ENABLED;
45 		break;
46 
47 	case led_claim:
48 		led_state |= LED_STATE_CLAIMED;
49 		hw_led_state = LED_MASK;
50 		break;
51 
52 	case led_release:
53 		led_state &= ~LED_STATE_CLAIMED;
54 		hw_led_state = LED_MASK;
55 		break;
56 
57 #ifdef CONFIG_LEDS_TIMER
58 	case led_timer:
59 		if (!(led_state & LED_STATE_CLAIMED))
60 			hw_led_state ^= LED_23;
61 		break;
62 #endif
63 
64 #ifdef CONFIG_LEDS_CPU
65 	case led_idle_start:
66 		/* The LART people like the LED to be off when the
67                    system is idle... */
68 		if (!(led_state & LED_STATE_CLAIMED))
69 			hw_led_state &= ~LED_23;
70 		break;
71 
72 	case led_idle_end:
73 		/* ... and on if the system is not idle */
74 		if (!(led_state & LED_STATE_CLAIMED))
75 			hw_led_state |= LED_23;
76 		break;
77 #endif
78 
79 	case led_red_on:
80 		if (led_state & LED_STATE_CLAIMED)
81 			hw_led_state &= ~LED_23;
82 		break;
83 
84 	case led_red_off:
85 		if (led_state & LED_STATE_CLAIMED)
86 			hw_led_state |= LED_23;
87 		break;
88 
89 	default:
90 		break;
91 	}
92 
93 	/* Now set the GPIO state, or nothing will happen at all */
94 	if (led_state & LED_STATE_ENABLED) {
95 		GPSR = hw_led_state;
96 		GPCR = hw_led_state ^ LED_MASK;
97 	}
98 
99 	local_irq_restore(flags);
100 }
101