Path: blob/master/arch/arm/mach-footbridge/ebsa285-leds.c
10817 views
/*1* linux/arch/arm/mach-footbridge/ebsa285-leds.c2*3* Copyright (C) 1998-1999 Russell King4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License version 2 as7* published by the Free Software Foundation.8* EBSA-285 control routines.9*10* The EBSA-285 uses the leds as follows:11* - Green - toggles state every 50 timer interrupts12* - Amber - On if system is not idle13* - Red - currently unused14*15* Changelog:16* 02-05-1999 RMK Various cleanups17*/18#include <linux/module.h>19#include <linux/kernel.h>20#include <linux/init.h>21#include <linux/spinlock.h>2223#include <mach/hardware.h>24#include <asm/leds.h>25#include <asm/mach-types.h>26#include <asm/system.h>2728#define LED_STATE_ENABLED 129#define LED_STATE_CLAIMED 230static char led_state;31static char hw_led_state;3233static DEFINE_SPINLOCK(leds_lock);3435static void ebsa285_leds_event(led_event_t evt)36{37unsigned long flags;3839spin_lock_irqsave(&leds_lock, flags);4041switch (evt) {42case led_start:43hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN;44#ifndef CONFIG_LEDS_CPU45hw_led_state |= XBUS_LED_AMBER;46#endif47led_state |= LED_STATE_ENABLED;48break;4950case led_stop:51led_state &= ~LED_STATE_ENABLED;52break;5354case led_claim:55led_state |= LED_STATE_CLAIMED;56hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN | XBUS_LED_AMBER;57break;5859case led_release:60led_state &= ~LED_STATE_CLAIMED;61hw_led_state = XBUS_LED_RED | XBUS_LED_GREEN | XBUS_LED_AMBER;62break;6364#ifdef CONFIG_LEDS_TIMER65case led_timer:66if (!(led_state & LED_STATE_CLAIMED))67hw_led_state ^= XBUS_LED_GREEN;68break;69#endif7071#ifdef CONFIG_LEDS_CPU72case led_idle_start:73if (!(led_state & LED_STATE_CLAIMED))74hw_led_state |= XBUS_LED_AMBER;75break;7677case led_idle_end:78if (!(led_state & LED_STATE_CLAIMED))79hw_led_state &= ~XBUS_LED_AMBER;80break;81#endif8283case led_halted:84if (!(led_state & LED_STATE_CLAIMED))85hw_led_state &= ~XBUS_LED_RED;86break;8788case led_green_on:89if (led_state & LED_STATE_CLAIMED)90hw_led_state &= ~XBUS_LED_GREEN;91break;9293case led_green_off:94if (led_state & LED_STATE_CLAIMED)95hw_led_state |= XBUS_LED_GREEN;96break;9798case led_amber_on:99if (led_state & LED_STATE_CLAIMED)100hw_led_state &= ~XBUS_LED_AMBER;101break;102103case led_amber_off:104if (led_state & LED_STATE_CLAIMED)105hw_led_state |= XBUS_LED_AMBER;106break;107108case led_red_on:109if (led_state & LED_STATE_CLAIMED)110hw_led_state &= ~XBUS_LED_RED;111break;112113case led_red_off:114if (led_state & LED_STATE_CLAIMED)115hw_led_state |= XBUS_LED_RED;116break;117118default:119break;120}121122if (led_state & LED_STATE_ENABLED)123*XBUS_LEDS = hw_led_state;124125spin_unlock_irqrestore(&leds_lock, flags);126}127128static int __init leds_init(void)129{130if (machine_is_ebsa285())131leds_event = ebsa285_leds_event;132133leds_event(led_start);134135return 0;136}137138__initcall(leds_init);139140141