1/* 2 * linux/arch/arm/mach-sa1100/leds-hackkit.c 3 * 4 * based on leds-lart.c 5 * 6 * (C) Erik Mouw (J.A.K.Mouw@its.tudelft.nl), April 21, 2000 7 * (C) Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de>, 2002 8 * 9 * The HackKit has two leds (GPIO 22/23). The red led (gpio 22) is used 10 * as cpu led, the green one is used as timer led. 11 */ 12#include <linux/init.h> 13 14#include <mach/hardware.h> 15#include <asm/leds.h> 16#include <asm/system.h> 17 18#include "leds.h" 19 20 21#define LED_STATE_ENABLED 1 22#define LED_STATE_CLAIMED 2 23 24static unsigned int led_state; 25static unsigned int hw_led_state; 26 27#define LED_GREEN GPIO_GPIO23 28#define LED_RED GPIO_GPIO22 29#define LED_MASK (LED_RED | LED_GREEN) 30 31void hackkit_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 22/23 are outputs */ 40 GPDR |= LED_MASK; 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_GREEN; 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_RED; 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_RED; 78 break; 79#endif 80 81 case led_red_on: 82 if (led_state & LED_STATE_CLAIMED) 83 hw_led_state &= ~LED_RED; 84 break; 85 86 case led_red_off: 87 if (led_state & LED_STATE_CLAIMED) 88 hw_led_state |= LED_RED; 89 break; 90 91 case led_green_on: 92 if (led_state & LED_STATE_CLAIMED) 93 hw_led_state &= ~LED_GREEN; 94 break; 95 96 case led_green_off: 97 if (led_state & LED_STATE_CLAIMED) 98 hw_led_state |= LED_GREEN; 99 break; 100 101 default: 102 break; 103 } 104 105 /* Now set the GPIO state, or nothing will happen at all */ 106 if (led_state & LED_STATE_ENABLED) { 107 GPSR = hw_led_state; 108 GPCR = hw_led_state ^ LED_MASK; 109 } 110 111 local_irq_restore(flags); 112} 113