forked from Minki/linux
51c62982a3
Considering the header mess ATM, it is not always possible to include the correct header files within board code. Let's keep this simple: <mach/pxa25x.h> - for pxa25x based platforms <mach/pxa27x.h> - for pxa27x based platforms <mach/pxa300.h> - for pxa300 based platforms <mach/pxa320.h> - for pxa320 based platforms <mach/pxa930.h> - for pxa930 based platforms NOTE: 1. one header one board file, they are not compatible (i.e. they have conflicting definitions which won't compile if included together). 2. Unless strictly necessary, the following header files are considered to be SoC files use _only_, and is not recommended to be included in board code: <mach/hardware.h> <mach/pxa-regs.h> <mach/pxa2xx-regs.h> <mach/pxa3xx-regs.h> <mach/mfp.h> <mach/mfp-pxa2xx.h> <mach/mfp-pxa25x.h> <mach/mfp-pxa27x.h> <mach/mfp-pxa3xx.h> <mach/mfp-pxa300.h> <mach/mfp-pxa320.h> <mach/mfp-pxa930.h> Signed-off-by: Eric Miao <eric.miao@marvell.com>
117 lines
2.1 KiB
C
117 lines
2.1 KiB
C
/*
|
|
* linux/arch/arm/mach-pxa/leds-idp.c
|
|
*
|
|
* Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu>
|
|
*
|
|
* Copyright (c) 2001 Jeff Sutherland <jeffs@accelent.com>
|
|
*
|
|
* Original (leds-footbridge.c) by Russell King
|
|
*
|
|
* Macros for actual LED manipulation should be in machine specific
|
|
* files in this 'mach' directory.
|
|
*/
|
|
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <mach/hardware.h>
|
|
#include <asm/leds.h>
|
|
#include <asm/system.h>
|
|
|
|
#include <mach/pxa25x.h>
|
|
#include <mach/idp.h>
|
|
|
|
#include "leds.h"
|
|
|
|
#define LED_STATE_ENABLED 1
|
|
#define LED_STATE_CLAIMED 2
|
|
|
|
static unsigned int led_state;
|
|
static unsigned int hw_led_state;
|
|
|
|
void idp_leds_event(led_event_t evt)
|
|
{
|
|
unsigned long flags;
|
|
|
|
local_irq_save(flags);
|
|
|
|
switch (evt) {
|
|
case led_start:
|
|
hw_led_state = IDP_HB_LED | IDP_BUSY_LED;
|
|
led_state = LED_STATE_ENABLED;
|
|
break;
|
|
|
|
case led_stop:
|
|
led_state &= ~LED_STATE_ENABLED;
|
|
break;
|
|
|
|
case led_claim:
|
|
led_state |= LED_STATE_CLAIMED;
|
|
hw_led_state = IDP_HB_LED | IDP_BUSY_LED;
|
|
break;
|
|
|
|
case led_release:
|
|
led_state &= ~LED_STATE_CLAIMED;
|
|
hw_led_state = IDP_HB_LED | IDP_BUSY_LED;
|
|
break;
|
|
|
|
#ifdef CONFIG_LEDS_TIMER
|
|
case led_timer:
|
|
if (!(led_state & LED_STATE_CLAIMED))
|
|
hw_led_state ^= IDP_HB_LED;
|
|
break;
|
|
#endif
|
|
|
|
#ifdef CONFIG_LEDS_CPU
|
|
case led_idle_start:
|
|
if (!(led_state & LED_STATE_CLAIMED))
|
|
hw_led_state &= ~IDP_BUSY_LED;
|
|
break;
|
|
|
|
case led_idle_end:
|
|
if (!(led_state & LED_STATE_CLAIMED))
|
|
hw_led_state |= IDP_BUSY_LED;
|
|
break;
|
|
#endif
|
|
|
|
case led_halted:
|
|
break;
|
|
|
|
case led_green_on:
|
|
if (led_state & LED_STATE_CLAIMED)
|
|
hw_led_state |= IDP_HB_LED;
|
|
break;
|
|
|
|
case led_green_off:
|
|
if (led_state & LED_STATE_CLAIMED)
|
|
hw_led_state &= ~IDP_HB_LED;
|
|
break;
|
|
|
|
case led_amber_on:
|
|
break;
|
|
|
|
case led_amber_off:
|
|
break;
|
|
|
|
case led_red_on:
|
|
if (led_state & LED_STATE_CLAIMED)
|
|
hw_led_state |= IDP_BUSY_LED;
|
|
break;
|
|
|
|
case led_red_off:
|
|
if (led_state & LED_STATE_CLAIMED)
|
|
hw_led_state &= ~IDP_BUSY_LED;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (led_state & LED_STATE_ENABLED)
|
|
IDP_CPLD_LED_CONTROL = ( (IDP_CPLD_LED_CONTROL | IDP_LEDS_MASK) & ~hw_led_state);
|
|
else
|
|
IDP_CPLD_LED_CONTROL |= IDP_LEDS_MASK;
|
|
|
|
local_irq_restore(flags);
|
|
}
|