diff options
Diffstat (limited to 'arch/powerpc/include/asm/status_led.h')
| -rw-r--r-- | arch/powerpc/include/asm/status_led.h | 77 | 
1 files changed, 77 insertions, 0 deletions
| diff --git a/arch/powerpc/include/asm/status_led.h b/arch/powerpc/include/asm/status_led.h new file mode 100644 index 000000000..037570993 --- /dev/null +++ b/arch/powerpc/include/asm/status_led.h @@ -0,0 +1,77 @@ +/* + * asm/status_led.h + * + * MPC8xx/MPC8260/MPC5xx based status led support functions + */ + +#ifndef __ASM_STATUS_LED_H__ +#define __ASM_STATUS_LED_H__ + +/* if not overriden */ +#ifndef CONFIG_BOARD_SPECIFIC_LED +# if defined(CONFIG_8xx) +#  include <mpc8xx.h> +# elif defined(CONFIG_8260) +#  include <mpc8260.h> +# elif defined(CONFIG_5xx) +#  include <mpc5xx.h> +# else +#  error CPU specific Status LED header file missing. +#endif + +/* led_id_t is unsigned long mask */ +typedef unsigned long led_id_t; + +static inline void __led_init (led_id_t mask, int state) +{ +	volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; + +#ifdef STATUS_LED_PAR +	immr->STATUS_LED_PAR &= ~mask; +#endif +#ifdef STATUS_LED_ODR +	immr->STATUS_LED_ODR &= ~mask; +#endif + +#if (STATUS_LED_ACTIVE == 0) +	if (state == STATUS_LED_ON) +		immr->STATUS_LED_DAT &= ~mask; +	else +		immr->STATUS_LED_DAT |= mask; +#else +	if (state == STATUS_LED_ON) +		immr->STATUS_LED_DAT |= mask; +	else +		immr->STATUS_LED_DAT &= ~mask; +#endif +#ifdef STATUS_LED_DIR +	immr->STATUS_LED_DIR |= mask; +#endif +} + +static inline void __led_toggle (led_id_t mask) +{ +	((immap_t *) CONFIG_SYS_IMMR)->STATUS_LED_DAT ^= mask; +} + +static inline void __led_set (led_id_t mask, int state) +{ +	volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR; + +#if (STATUS_LED_ACTIVE == 0) +	if (state == STATUS_LED_ON) +		immr->STATUS_LED_DAT &= ~mask; +	else +		immr->STATUS_LED_DAT |= mask; +#else +	if (state == STATUS_LED_ON) +		immr->STATUS_LED_DAT |= mask; +	else +		immr->STATUS_LED_DAT &= ~mask; +#endif + +} + +#endif + +#endif	/* __ASM_STATUS_LED_H__ */ |