diff options
Diffstat (limited to 'arch/arm/mach-omap1/leds-osk.c')
-rw-r--r-- | arch/arm/mach-omap1/leds-osk.c | 80 |
1 files changed, 1 insertions, 79 deletions
diff --git a/arch/arm/mach-omap1/leds-osk.c b/arch/arm/mach-omap1/leds-osk.c index 026685ed461a..754383dde807 100644 --- a/arch/arm/mach-omap1/leds-osk.c +++ b/arch/arm/mach-omap1/leds-osk.c | |||
@@ -1,11 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-omap1/leds-osk.c | 2 | * linux/arch/arm/mach-omap1/leds-osk.c |
3 | * | 3 | * |
4 | * LED driver for OSK, and optionally Mistral QVGA, boards | 4 | * LED driver for OSK with optional Mistral QVGA board |
5 | */ | 5 | */ |
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
7 | #include <linux/workqueue.h> | ||
8 | #include <linux/i2c/tps65010.h> | ||
9 | 7 | ||
10 | #include <asm/hardware.h> | 8 | #include <asm/hardware.h> |
11 | #include <asm/leds.h> | 9 | #include <asm/leds.h> |
@@ -20,49 +18,11 @@ | |||
20 | #define LED_STATE_CLAIMED (1 << 1) | 18 | #define LED_STATE_CLAIMED (1 << 1) |
21 | static u8 led_state; | 19 | static u8 led_state; |
22 | 20 | ||
23 | #define GREEN_LED (1 << 0) /* TPS65010 LED1 */ | ||
24 | #define AMBER_LED (1 << 1) /* TPS65010 LED2 */ | ||
25 | #define RED_LED (1 << 2) /* TPS65010 GPIO2 */ | ||
26 | #define TIMER_LED (1 << 3) /* Mistral board */ | 21 | #define TIMER_LED (1 << 3) /* Mistral board */ |
27 | #define IDLE_LED (1 << 4) /* Mistral board */ | 22 | #define IDLE_LED (1 << 4) /* Mistral board */ |
28 | static u8 hw_led_state; | 23 | static u8 hw_led_state; |
29 | 24 | ||
30 | 25 | ||
31 | /* TPS65010 leds are changed using i2c -- from a task context. | ||
32 | * Using one of these for the "idle" LED would be impractical... | ||
33 | */ | ||
34 | #define TPS_LEDS (GREEN_LED | RED_LED | AMBER_LED) | ||
35 | |||
36 | static u8 tps_leds_change; | ||
37 | |||
38 | static void tps_work(struct work_struct *unused) | ||
39 | { | ||
40 | for (;;) { | ||
41 | u8 leds; | ||
42 | |||
43 | local_irq_disable(); | ||
44 | leds = tps_leds_change; | ||
45 | tps_leds_change = 0; | ||
46 | local_irq_enable(); | ||
47 | |||
48 | if (!leds) | ||
49 | break; | ||
50 | |||
51 | /* careful: the set_led() value is on/off/blink */ | ||
52 | if (leds & GREEN_LED) | ||
53 | tps65010_set_led(LED1, !!(hw_led_state & GREEN_LED)); | ||
54 | if (leds & AMBER_LED) | ||
55 | tps65010_set_led(LED2, !!(hw_led_state & AMBER_LED)); | ||
56 | |||
57 | /* the gpio led doesn't have that issue */ | ||
58 | if (leds & RED_LED) | ||
59 | tps65010_set_gpio_out_value(GPIO2, | ||
60 | !(hw_led_state & RED_LED)); | ||
61 | } | ||
62 | } | ||
63 | |||
64 | static DECLARE_WORK(work, tps_work); | ||
65 | |||
66 | #ifdef CONFIG_OMAP_OSK_MISTRAL | 26 | #ifdef CONFIG_OMAP_OSK_MISTRAL |
67 | 27 | ||
68 | /* For now, all system indicators require the Mistral board, since that | 28 | /* For now, all system indicators require the Mistral board, since that |
@@ -112,7 +72,6 @@ void osk_leds_event(led_event_t evt) | |||
112 | case led_stop: | 72 | case led_stop: |
113 | led_state &= ~LED_STATE_ENABLED; | 73 | led_state &= ~LED_STATE_ENABLED; |
114 | hw_led_state = 0; | 74 | hw_led_state = 0; |
115 | /* NOTE: work may still be pending!! */ | ||
116 | break; | 75 | break; |
117 | 76 | ||
118 | case led_claim: | 77 | case led_claim: |
@@ -145,48 +104,11 @@ void osk_leds_event(led_event_t evt) | |||
145 | 104 | ||
146 | #endif /* CONFIG_OMAP_OSK_MISTRAL */ | 105 | #endif /* CONFIG_OMAP_OSK_MISTRAL */ |
147 | 106 | ||
148 | /* "green" == tps LED1 (leftmost, normally power-good) | ||
149 | * works only with DC adapter, not on battery power! | ||
150 | */ | ||
151 | case led_green_on: | ||
152 | if (led_state & LED_STATE_CLAIMED) | ||
153 | hw_led_state |= GREEN_LED; | ||
154 | break; | ||
155 | case led_green_off: | ||
156 | if (led_state & LED_STATE_CLAIMED) | ||
157 | hw_led_state &= ~GREEN_LED; | ||
158 | break; | ||
159 | |||
160 | /* "amber" == tps LED2 (middle) */ | ||
161 | case led_amber_on: | ||
162 | if (led_state & LED_STATE_CLAIMED) | ||
163 | hw_led_state |= AMBER_LED; | ||
164 | break; | ||
165 | case led_amber_off: | ||
166 | if (led_state & LED_STATE_CLAIMED) | ||
167 | hw_led_state &= ~AMBER_LED; | ||
168 | break; | ||
169 | |||
170 | /* "red" == LED on tps gpio3 (rightmost) */ | ||
171 | case led_red_on: | ||
172 | if (led_state & LED_STATE_CLAIMED) | ||
173 | hw_led_state |= RED_LED; | ||
174 | break; | ||
175 | case led_red_off: | ||
176 | if (led_state & LED_STATE_CLAIMED) | ||
177 | hw_led_state &= ~RED_LED; | ||
178 | break; | ||
179 | |||
180 | default: | 107 | default: |
181 | break; | 108 | break; |
182 | } | 109 | } |
183 | 110 | ||
184 | leds ^= hw_led_state; | 111 | leds ^= hw_led_state; |
185 | leds &= TPS_LEDS; | ||
186 | if (leds && (led_state & LED_STATE_CLAIMED)) { | ||
187 | tps_leds_change |= leds; | ||
188 | schedule_work(&work); | ||
189 | } | ||
190 | 112 | ||
191 | done: | 113 | done: |
192 | local_irq_restore(flags); | 114 | local_irq_restore(flags); |