]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - arch/arm/mach-ks8695/leds.c
17c5ef13b0d1a4cd7aa4e6ad5804ae4aafdee7b3
[mirror_ubuntu-hirsute-kernel.git] / 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 <asm/arch/devices.h>
17 #include <asm/arch/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);