[PATCH] ARM: 2691/1: PXA27x sleep fixes take 2
[linux-2.6] / arch / arm / mach-sa1100 / leds-badge4.c
1 /*
2  * linux/arch/arm/mach-sa1100/leds-badge4.c
3  *
4  * Author: Christopher Hoover <ch@hpl.hp.com>
5  * Copyright (C) 2002 Hewlett-Packard Company
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  */
12
13 #include <linux/config.h>
14 #include <linux/init.h>
15
16 #include <asm/hardware.h>
17 #include <asm/leds.h>
18 #include <asm/system.h>
19
20 #include "leds.h"
21
22 #define LED_STATE_ENABLED       1
23 #define LED_STATE_CLAIMED       2
24
25 static unsigned int led_state;
26 static unsigned int hw_led_state;
27
28 #define LED_RED         GPIO_GPIO(7)
29 #define LED_GREEN       GPIO_GPIO(9)
30 #define LED_MASK        (LED_RED|LED_GREEN)
31
32 #define LED_IDLE        LED_GREEN
33 #define LED_TIMER       LED_RED
34
35 void badge4_leds_event(led_event_t evt)
36 {
37         unsigned long flags;
38
39         local_irq_save(flags);
40
41         switch (evt) {
42         case led_start:
43                 GPDR |= LED_MASK;
44                 hw_led_state = LED_MASK;
45                 led_state = LED_STATE_ENABLED;
46                 break;
47
48         case led_stop:
49                 led_state &= ~LED_STATE_ENABLED;
50                 break;
51
52         case led_claim:
53                 led_state |= LED_STATE_CLAIMED;
54                 hw_led_state = LED_MASK;
55                 break;
56
57         case led_release:
58                 led_state &= ~LED_STATE_CLAIMED;
59                 hw_led_state = LED_MASK;
60                 break;
61
62 #ifdef CONFIG_LEDS_TIMER
63         case led_timer:
64                 if (!(led_state & LED_STATE_CLAIMED))
65                         hw_led_state ^= LED_TIMER;
66                 break;
67 #endif
68
69 #ifdef CONFIG_LEDS_CPU
70         case led_idle_start:
71                 /* LED off when system is idle */
72                 if (!(led_state & LED_STATE_CLAIMED))
73                         hw_led_state &= ~LED_IDLE;
74                 break;
75
76         case led_idle_end:
77                 if (!(led_state & LED_STATE_CLAIMED))
78                         hw_led_state |= LED_IDLE;
79                 break;
80 #endif
81
82         case led_red_on:
83                 if (!(led_state & LED_STATE_CLAIMED))
84                         hw_led_state &= ~LED_RED;
85                 break;
86
87         case led_red_off:
88                 if (!(led_state & LED_STATE_CLAIMED))
89                         hw_led_state |= LED_RED;
90                 break;
91
92         case led_green_on:
93                 if (!(led_state & LED_STATE_CLAIMED))
94                         hw_led_state &= ~LED_GREEN;
95                 break;
96
97         case led_green_off:
98                 if (!(led_state & LED_STATE_CLAIMED))
99                         hw_led_state |= LED_GREEN;
100                 break;
101
102         default:
103                 break;
104         }
105
106         if  (led_state & LED_STATE_ENABLED) {
107                 GPSR = hw_led_state;
108                 GPCR = hw_led_state ^ LED_MASK;
109         }
110
111         local_irq_restore(flags);
112 }