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 #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_state;
26 
27 #define LED_23    GPIO_GPIO23
28 #define LED_MASK  (LED_23)
29 
lart_leds_event(led_event_t evt)30 void lart_leds_event(led_event_t evt)
31 {
32 	unsigned long flags;
33 
34 	local_irq_save(flags);
35 
36 	switch(evt) {
37 	case led_start:
38 		/* pin 23 is output pin */
39 		GPDR |= LED_23;
40 		hw_led_state = LED_MASK;
41 		led_state = LED_STATE_ENABLED;
42 		break;
43 
44 	case led_stop:
45 		led_state &= ~LED_STATE_ENABLED;
46 		break;
47 
48 	case led_claim:
49 		led_state |= LED_STATE_CLAIMED;
50 		hw_led_state = LED_MASK;
51 		break;
52 
53 	case led_release:
54 		led_state &= ~LED_STATE_CLAIMED;
55 		hw_led_state = LED_MASK;
56 		break;
57 
58 #ifdef CONFIG_LEDS_TIMER
59 	case led_timer:
60 		if (!(led_state & LED_STATE_CLAIMED))
61 			hw_led_state ^= LED_23;
62 		break;
63 #endif
64 
65 #ifdef CONFIG_LEDS_CPU
66 	case led_idle_start:
67 		/* The LART people like the LED to be off when the
68                    system is idle... */
69 		if (!(led_state & LED_STATE_CLAIMED))
70 			hw_led_state &= ~LED_23;
71 		break;
72 
73 	case led_idle_end:
74 		/* ... and on if the system is not idle */
75 		if (!(led_state & LED_STATE_CLAIMED))
76 			hw_led_state |= LED_23;
77 		break;
78 #endif
79 
80 	case led_red_on:
81 		if (led_state & LED_STATE_CLAIMED)
82 			hw_led_state &= ~LED_23;
83 		break;
84 
85 	case led_red_off:
86 		if (led_state & LED_STATE_CLAIMED)
87 			hw_led_state |= LED_23;
88 		break;
89 
90 	default:
91 		break;
92 	}
93 
94 	/* Now set the GPIO state, or nothing will happen at all */
95 	if (led_state & LED_STATE_ENABLED) {
96 		GPSR = hw_led_state;
97 		GPCR = hw_led_state ^ LED_MASK;
98 	}
99 
100 	local_irq_restore(flags);
101 }
102