1 /* 2 * linux/arch/arm/mach-pxa/leds-idp.c 3 * 4 * Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu> 5 * 6 * Copyright (c) 2001 Jeff Sutherland <jeffs@accelent.com> 7 * 8 * Original (leds-footbridge.c) by Russell King 9 * 10 * Macros for actual LED manipulation should be in machine specific 11 * files in this 'mach' directory. 12 */ 13 14 15 #include <linux/init.h> 16 17 #include <mach/hardware.h> 18 #include <asm/leds.h> 19 #include <asm/system.h> 20 21 #include <mach/pxa25x.h> 22 #include <mach/idp.h> 23 24 #include "leds.h" 25 26 #define LED_STATE_ENABLED 1 27 #define LED_STATE_CLAIMED 2 28 29 static unsigned int led_state; 30 static unsigned int hw_led_state; 31 idp_leds_event(led_event_t evt)32void idp_leds_event(led_event_t evt) 33 { 34 unsigned long flags; 35 36 local_irq_save(flags); 37 38 switch (evt) { 39 case led_start: 40 hw_led_state = IDP_HB_LED | IDP_BUSY_LED; 41 led_state = LED_STATE_ENABLED; 42 break; 43 44 case led_stop: 45 led_state &= ~LED_STATE_ENABLED; 46 break; 47 48 case led_claim: 49 led_state |= LED_STATE_CLAIMED; 50 hw_led_state = IDP_HB_LED | IDP_BUSY_LED; 51 break; 52 53 case led_release: 54 led_state &= ~LED_STATE_CLAIMED; 55 hw_led_state = IDP_HB_LED | IDP_BUSY_LED; 56 break; 57 58 #ifdef CONFIG_LEDS_TIMER 59 case led_timer: 60 if (!(led_state & LED_STATE_CLAIMED)) 61 hw_led_state ^= IDP_HB_LED; 62 break; 63 #endif 64 65 #ifdef CONFIG_LEDS_CPU 66 case led_idle_start: 67 if (!(led_state & LED_STATE_CLAIMED)) 68 hw_led_state &= ~IDP_BUSY_LED; 69 break; 70 71 case led_idle_end: 72 if (!(led_state & LED_STATE_CLAIMED)) 73 hw_led_state |= IDP_BUSY_LED; 74 break; 75 #endif 76 77 case led_halted: 78 break; 79 80 case led_green_on: 81 if (led_state & LED_STATE_CLAIMED) 82 hw_led_state |= IDP_HB_LED; 83 break; 84 85 case led_green_off: 86 if (led_state & LED_STATE_CLAIMED) 87 hw_led_state &= ~IDP_HB_LED; 88 break; 89 90 case led_amber_on: 91 break; 92 93 case led_amber_off: 94 break; 95 96 case led_red_on: 97 if (led_state & LED_STATE_CLAIMED) 98 hw_led_state |= IDP_BUSY_LED; 99 break; 100 101 case led_red_off: 102 if (led_state & LED_STATE_CLAIMED) 103 hw_led_state &= ~IDP_BUSY_LED; 104 break; 105 106 default: 107 break; 108 } 109 110 if (led_state & LED_STATE_ENABLED) 111 IDP_CPLD_LED_CONTROL = ( (IDP_CPLD_LED_CONTROL | IDP_LEDS_MASK) & ~hw_led_state); 112 else 113 IDP_CPLD_LED_CONTROL |= IDP_LEDS_MASK; 114 115 local_irq_restore(flags); 116 } 117