1/* 2 * linux/arch/arm/mach-pxa/leds-mainstone.c 3 * 4 * Author: Nicolas Pitre 5 * Created: Nov 05, 2002 6 * Copyright: MontaVista Software Inc. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13#include <linux/init.h> 14 15#include <asm/hardware.h> 16#include <asm/leds.h> 17#include <asm/system.h> 18 19#include <asm/arch/pxa-regs.h> 20#include <asm/arch/mainstone.h> 21 22#include "leds.h" 23 24 25/* 8 discrete leds available for general use: */ 26#define D28 (1 << 0) 27#define D27 (1 << 1) 28#define D26 (1 << 2) 29#define D25 (1 << 3) 30#define D24 (1 << 4) 31#define D23 (1 << 5) 32#define D22 (1 << 6) 33#define D21 (1 << 7) 34 35#define LED_STATE_ENABLED 1 36#define LED_STATE_CLAIMED 2 37 38static unsigned int led_state; 39static unsigned int hw_led_state; 40 41void mainstone_leds_event(led_event_t evt) 42{ 43 unsigned long flags; 44 45 local_irq_save(flags); 46 47 switch (evt) { 48 case led_start: 49 hw_led_state = 0; 50 led_state = LED_STATE_ENABLED; 51 break; 52 53 case led_stop: 54 led_state &= ~LED_STATE_ENABLED; 55 break; 56 57 case led_claim: 58 led_state |= LED_STATE_CLAIMED; 59 hw_led_state = 0; 60 break; 61 62 case led_release: 63 led_state &= ~LED_STATE_CLAIMED; 64 hw_led_state = 0; 65 break; 66 67#ifdef CONFIG_LEDS_TIMER 68 case led_timer: 69 hw_led_state ^= D26; 70 break; 71#endif 72 73#ifdef CONFIG_LEDS_CPU 74 case led_idle_start: 75 hw_led_state &= ~D27; 76 break; 77 78 case led_idle_end: 79 hw_led_state |= D27; 80 break; 81#endif 82 83 case led_halted: 84 break; 85 86 case led_green_on: 87 hw_led_state |= D21; 88 break; 89 90 case led_green_off: 91 hw_led_state &= ~D21; 92 break; 93 94 case led_amber_on: 95 hw_led_state |= D22; 96 break; 97 98 case led_amber_off: 99 hw_led_state &= ~D22; 100 break; 101 102 case led_red_on: 103 hw_led_state |= D23; 104 break; 105 106 case led_red_off: 107 hw_led_state &= ~D23; 108 break; 109 110 default: 111 break; 112 } 113 114 if (led_state & LED_STATE_ENABLED) 115 MST_LEDCTRL = (MST_LEDCTRL | 0xff) & ~hw_led_state; 116 else 117 MST_LEDCTRL |= 0xff; 118 119 local_irq_restore(flags); 120} 121