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 #include <linux/gpio.h>
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/gpio.h>
15 
16 #include <asm/leds.h>
17 #include <mach/devices.h>
18 
19 
ks8695_led_on(unsigned int led)20 static inline void ks8695_led_on(unsigned int led)
21 {
22 	gpio_set_value(led, 0);
23 }
24 
ks8695_led_off(unsigned int led)25 static inline void ks8695_led_off(unsigned int led)
26 {
27 	gpio_set_value(led, 1);
28 }
29 
ks8695_led_toggle(unsigned int led)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  */
ks8695_leds_event(led_event_t evt)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 
leds_init(void)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);
94