1/* 2 * linux/arch/arm/mach-sa1100/leds-lart.c 3 * 4 * (C) Erik Mouw (J.A.K.Mouw@its.tudelft.nl), April 21, 2000 5 * 6 * LART uses the LED as follows: 7 * - GPIO23 is the LED, on if system is not idle 8 * You can use both CONFIG_LEDS_CPU and CONFIG_LEDS_TIMER at the same 9 * time, but in that case the timer events will still dictate the 10 * pace of the LED. 11 */ 12#include <linux/config.h> 13#include <linux/init.h> 14 15#include <asm/hardware.h> 16#include <asm/leds.h> 17#include <asm/system.h> 18 19#include "leds.h" 20 21 22#define LED_STATE_ENABLED 1 23#define LED_STATE_CLAIMED 2 24 25static unsigned int led_state; 26static unsigned int hw_led_state; 27 28#define LED_23 GPIO_GPIO23 29#define LED_MASK (LED_23) 30 31void lart_leds_event(led_event_t evt) 32{ 33 unsigned long flags; 34 35 local_irq_save(flags); 36 37 switch(evt) { 38 case led_start: 39 /* pin 23 is output pin */ 40 GPDR |= LED_23; 41 hw_led_state = LED_MASK; 42 led_state = LED_STATE_ENABLED; 43 break; 44 45 case led_stop: 46 led_state &= ~LED_STATE_ENABLED; 47 break; 48 49 case led_claim: 50 led_state |= LED_STATE_CLAIMED; 51 hw_led_state = LED_MASK; 52 break; 53 54 case led_release: 55 led_state &= ~LED_STATE_CLAIMED; 56 hw_led_state = LED_MASK; 57 break; 58 59#ifdef CONFIG_LEDS_TIMER 60 case led_timer: 61 if (!(led_state & LED_STATE_CLAIMED)) 62 hw_led_state ^= LED_23; 63 break; 64#endif 65 66#ifdef CONFIG_LEDS_CPU 67 case led_idle_start: 68 /* The LART people like the LED to be off when the 69 system is idle... */ 70 if (!(led_state & LED_STATE_CLAIMED)) 71 hw_led_state &= ~LED_23; 72 break; 73 74 case led_idle_end: 75 /* ... and on if the system is not idle */ 76 if (!(led_state & LED_STATE_CLAIMED)) 77 hw_led_state |= LED_23; 78 break; 79#endif 80 81 case led_red_on: 82 if (led_state & LED_STATE_CLAIMED) 83 hw_led_state &= ~LED_23; 84 break; 85 86 case led_red_off: 87 if (led_state & LED_STATE_CLAIMED) 88 hw_led_state |= LED_23; 89 break; 90 91 default: 92 break; 93 } 94 95 /* Now set the GPIO state, or nothing will happen at all */ 96 if (led_state & LED_STATE_ENABLED) { 97 GPSR = hw_led_state; 98 GPCR = hw_led_state ^ LED_MASK; 99 } 100 101 local_irq_restore(flags); 102} 103