1 /* 2 * linux/arch/arm/mach-footbridge/ebsa285-leds.c 3 * 4 * Copyright (C) 1998-1999 Russell King 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 * EBSA-285 control routines. 10 * 11 * The EBSA-285 uses the leds as follows: 12 * - Green - toggles state every 50 timer interrupts 13 * - Amber - On if system is not idle 14 * - Red - currently unused 15 * 16 * Changelog: 17 * 02-05-1999 RMK Various cleanups 18 */ 19 #include <linux/module.h> 20 #include <linux/kernel.h> 21 #include <linux/init.h> 22 #include <linux/spinlock.h> 23 24 #include <mach/hardware.h> 25 #include <asm/leds.h> 26 #include <asm/mach-types.h> 27 #include <asm/system.h> 28 29 #define LED_STATE_ENABLED 1 30 #define LED_STATE_CLAIMED 2 31 static char led_state; 32 static char hw_led_state; 33 34 static DEFINE_SPINLOCK(leds_lock); 35 ebsa285_leds_event(led_event_t evt)36static void ebsa285_leds_event(led_event_t evt) 37 { 38 unsigned long flags; 39 40 spin_lock_irqsave(&leds_lock, flags); 41 42 switch (evt) { 43 case led_start: 44 hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN; 45 #ifndef CONFIG_LEDS_CPU 46 hw_led_state |= XBUS_LED_AMBER; 47 #endif 48 led_state |= LED_STATE_ENABLED; 49 break; 50 51 case led_stop: 52 led_state &= ~LED_STATE_ENABLED; 53 break; 54 55 case led_claim: 56 led_state |= LED_STATE_CLAIMED; 57 hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN | XBUS_LED_AMBER; 58 break; 59 60 case led_release: 61 led_state &= ~LED_STATE_CLAIMED; 62 hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN | XBUS_LED_AMBER; 63 break; 64 65 #ifdef CONFIG_LEDS_TIMER 66 case led_timer: 67 if (!(led_state & LED_STATE_CLAIMED)) 68 hw_led_state ^= XBUS_LED_GREEN; 69 break; 70 #endif 71 72 #ifdef CONFIG_LEDS_CPU 73 case led_idle_start: 74 if (!(led_state & LED_STATE_CLAIMED)) 75 hw_led_state |= XBUS_LED_AMBER; 76 break; 77 78 case led_idle_end: 79 if (!(led_state & LED_STATE_CLAIMED)) 80 hw_led_state &= ~XBUS_LED_AMBER; 81 break; 82 #endif 83 84 case led_halted: 85 if (!(led_state & LED_STATE_CLAIMED)) 86 hw_led_state &= ~XBUS_LED_RED; 87 break; 88 89 case led_green_on: 90 if (led_state & LED_STATE_CLAIMED) 91 hw_led_state &= ~XBUS_LED_GREEN; 92 break; 93 94 case led_green_off: 95 if (led_state & LED_STATE_CLAIMED) 96 hw_led_state |= XBUS_LED_GREEN; 97 break; 98 99 case led_amber_on: 100 if (led_state & LED_STATE_CLAIMED) 101 hw_led_state &= ~XBUS_LED_AMBER; 102 break; 103 104 case led_amber_off: 105 if (led_state & LED_STATE_CLAIMED) 106 hw_led_state |= XBUS_LED_AMBER; 107 break; 108 109 case led_red_on: 110 if (led_state & LED_STATE_CLAIMED) 111 hw_led_state &= ~XBUS_LED_RED; 112 break; 113 114 case led_red_off: 115 if (led_state & LED_STATE_CLAIMED) 116 hw_led_state |= XBUS_LED_RED; 117 break; 118 119 default: 120 break; 121 } 122 123 if (led_state & LED_STATE_ENABLED) 124 *XBUS_LEDS = hw_led_state; 125 126 spin_unlock_irqrestore(&leds_lock, flags); 127 } 128 leds_init(void)129static int __init leds_init(void) 130 { 131 if (machine_is_ebsa285()) 132 leds_event = ebsa285_leds_event; 133 134 leds_event(led_start); 135 136 return 0; 137 } 138 139 __initcall(leds_init); 140