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)20static inline void ks8695_led_on(unsigned int led) 21 { 22 gpio_set_value(led, 0); 23 } 24 ks8695_led_off(unsigned int led)25static inline void ks8695_led_off(unsigned int led) 26 { 27 gpio_set_value(led, 1); 28 } 29 ks8695_led_toggle(unsigned int led)30static 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)43static 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)82static 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