Pull bugzilla-5452 into release branch
[pandora-kernel.git] / arch / arm / mach-at91rm9200 / leds.c
1 /*
2  * LED driver for Atmel AT91-based boards.
3  *
4  *  Copyright (C) SAN People (Pty) Ltd
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10 */
11
12 #include <linux/config.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/init.h>
16
17 #include <asm/mach-types.h>
18 #include <asm/leds.h>
19 #include <asm/arch/board.h>
20 #include <asm/arch/gpio.h>
21
22
23 static inline void at91_led_on(unsigned int led)
24 {
25         at91_set_gpio_value(led, 0);
26 }
27
28 static inline void at91_led_off(unsigned int led)
29 {
30         at91_set_gpio_value(led, 1);
31 }
32
33 static inline void at91_led_toggle(unsigned int led)
34 {
35         unsigned long is_off = at91_get_gpio_value(led);
36         if (is_off)
37                 at91_led_on(led);
38         else
39                 at91_led_off(led);
40 }
41
42
43 /*
44  * Handle LED events.
45  */
46 static void at91_leds_event(led_event_t evt)
47 {
48         unsigned long flags;
49
50         local_irq_save(flags);
51
52         switch(evt) {
53         case led_start:         /* System startup */
54                 at91_led_on(at91_leds_cpu);
55                 break;
56
57         case led_stop:          /* System stop / suspend */
58                 at91_led_off(at91_leds_cpu);
59                 break;
60
61 #ifdef CONFIG_LEDS_TIMER
62         case led_timer:         /* Every 50 timer ticks */
63                 at91_led_toggle(at91_leds_timer);
64                 break;
65 #endif
66
67 #ifdef CONFIG_LEDS_CPU
68         case led_idle_start:    /* Entering idle state */
69                 at91_led_off(at91_leds_cpu);
70                 break;
71
72         case led_idle_end:      /* Exit idle state */
73                 at91_led_on(at91_leds_cpu);
74                 break;
75 #endif
76
77         default:
78                 break;
79         }
80
81         local_irq_restore(flags);
82 }
83
84
85 static int __init leds_init(void)
86 {
87         if (!at91_leds_timer || !at91_leds_cpu)
88                 return -ENODEV;
89
90         /* Enable PIO to access the LEDs */
91         at91_set_gpio_output(at91_leds_timer, 1);
92         at91_set_gpio_output(at91_leds_cpu, 1);
93
94         leds_event = at91_leds_event;
95
96         leds_event(led_start);
97         return 0;
98 }
99
100 __initcall(leds_init);