Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[linux-2.6] / arch / arm / mach-ks8695 / leds.c
1 /*
2  * LED driver for KS8695-based boards.
3  *
4  * Copyright (C) Andrew Victor
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/init.h>
14
15 #include <asm/leds.h>
16 #include <mach/devices.h>
17 #include <mach/gpio.h>
18
19
20 static inline void ks8695_led_on(unsigned int led)
21 {
22         gpio_set_value(led, 0);
23 }
24
25 static inline void ks8695_led_off(unsigned int led)
26 {
27         gpio_set_value(led, 1);
28 }
29
30 static inline void ks8695_led_toggle(unsigned int led)
31 {
32         unsigned long is_off = gpio_get_value(led);
33         if (is_off)
34                 ks8695_led_on(led);
35         else
36                 ks8695_led_off(led);
37 }
38
39
40 /*
41  * Handle LED events.
42  */
43 static void ks8695_leds_event(led_event_t evt)
44 {
45         unsigned long flags;
46
47         local_irq_save(flags);
48
49         switch(evt) {
50         case led_start:         /* System startup */
51                 ks8695_led_on(ks8695_leds_cpu);
52                 break;
53
54         case led_stop:          /* System stop / suspend */
55                 ks8695_led_off(ks8695_leds_cpu);
56                 break;
57
58 #ifdef CONFIG_LEDS_TIMER
59         case led_timer:         /* Every 50 timer ticks */
60                 ks8695_led_toggle(ks8695_leds_timer);
61                 break;
62 #endif
63
64 #ifdef CONFIG_LEDS_CPU
65         case led_idle_start:    /* Entering idle state */
66                 ks8695_led_off(ks8695_leds_cpu);
67                 break;
68
69         case led_idle_end:      /* Exit idle state */
70                 ks8695_led_on(ks8695_leds_cpu);
71                 break;
72 #endif
73
74         default:
75                 break;
76         }
77
78         local_irq_restore(flags);
79 }
80
81
82 static int __init leds_init(void)
83 {
84         if ((ks8695_leds_timer == -1) || (ks8695_leds_cpu == -1))
85                 return -ENODEV;
86
87         leds_event = ks8695_leds_event;
88
89         leds_event(led_start);
90         return 0;
91 }
92
93 __initcall(leds_init);