• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * linux/arch/arm/mach-sa1100/leds-hackkit.c
3  *
4  * based on leds-lart.c
5  *
6  * (C) Erik Mouw (J.A.K.Mouw@its.tudelft.nl), April 21, 2000
7  * (C) Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de>, 2002
8  *
9  * The HackKit has two leds (GPIO 22/23). The red led (gpio 22) is used
10  * as cpu led, the green one is used as timer 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_GREEN    GPIO_GPIO23
27 #define LED_RED    GPIO_GPIO22
28 #define LED_MASK  (LED_RED | LED_GREEN)
29 
hackkit_leds_event(led_event_t evt)30 void hackkit_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 22/23 are outputs */
39 			GPDR |= LED_MASK;
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_GREEN;
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_RED;
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_RED;
77 			break;
78 #endif
79 
80 		case led_red_on:
81 			if (led_state & LED_STATE_CLAIMED)
82 				hw_led_state &= ~LED_RED;
83 			break;
84 
85 		case led_red_off:
86 			if (led_state & LED_STATE_CLAIMED)
87 				hw_led_state |= LED_RED;
88 			break;
89 
90 		case led_green_on:
91 			if (led_state & LED_STATE_CLAIMED)
92 				hw_led_state &= ~LED_GREEN;
93 			break;
94 
95 		case led_green_off:
96 			if (led_state & LED_STATE_CLAIMED)
97 				hw_led_state |= LED_GREEN;
98 			break;
99 
100 		default:
101 			break;
102 	}
103 
104 	/* Now set the GPIO state, or nothing will happen at all */
105 	if (led_state & LED_STATE_ENABLED) {
106 		GPSR = hw_led_state;
107 		GPCR = hw_led_state ^ LED_MASK;
108 	}
109 
110 	local_irq_restore(flags);
111 }
112