diff options
Diffstat (limited to 'arch/arm/mach-footbridge/ebsa285.c')
| -rw-r--r-- | arch/arm/mach-footbridge/ebsa285.c | 34 | 
1 files changed, 25 insertions, 9 deletions
diff --git a/arch/arm/mach-footbridge/ebsa285.c b/arch/arm/mach-footbridge/ebsa285.c index b08243500e2..aee8300f349 100644 --- a/arch/arm/mach-footbridge/ebsa285.c +++ b/arch/arm/mach-footbridge/ebsa285.c @@ -4,6 +4,7 @@   * EBSA285 machine fixup   */  #include <linux/init.h> +#include <linux/io.h>  #include <linux/spinlock.h>  #include <linux/slab.h>  #include <linux/leds.h> @@ -17,6 +18,11 @@  /* LEDs */  #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) +#define XBUS_AMBER_L	BIT(0) +#define XBUS_GREEN_L	BIT(1) +#define XBUS_RED_L	BIT(2) +#define XBUS_TOGGLE	BIT(7) +  struct ebsa285_led {  	struct led_classdev     cdev;  	u8                      mask; @@ -30,21 +36,25 @@ static const struct {  	const char *name;  	const char *trigger;  } ebsa285_leds[] = { -	{ "ebsa285:amber", "heartbeat", }, -	{ "ebsa285:green", "cpu0", }, +	{ "ebsa285:amber", "cpu0", }, +	{ "ebsa285:green", "heartbeat", },  	{ "ebsa285:red",},  }; +static unsigned char hw_led_state; +static void __iomem *xbus; +  static void ebsa285_led_set(struct led_classdev *cdev,  		enum led_brightness b)  {  	struct ebsa285_led *led = container_of(cdev,  			struct ebsa285_led, cdev); -	if (b != LED_OFF) -		*XBUS_LEDS |= led->mask; +	if (b == LED_OFF) +		hw_led_state |= led->mask;  	else -		*XBUS_LEDS &= ~led->mask; +		hw_led_state &= ~led->mask; +	writeb(hw_led_state, xbus);  }  static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) @@ -52,18 +62,23 @@ static enum led_brightness ebsa285_led_get(struct led_classdev *cdev)  	struct ebsa285_led *led = container_of(cdev,  			struct ebsa285_led, cdev); -	return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF; +	return hw_led_state & led->mask ? LED_OFF : LED_FULL;  }  static int __init ebsa285_leds_init(void)  {  	int i; -	if (machine_is_ebsa285()) +	if (!machine_is_ebsa285())  		return -ENODEV; -	/* 3 LEDS All ON */ -	*XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; +	xbus = ioremap(XBUS_CS2, SZ_4K); +	if (!xbus) +		return -ENOMEM; + +	/* 3 LEDS all off */ +	hw_led_state = XBUS_AMBER_L | XBUS_GREEN_L | XBUS_RED_L; +	writeb(hw_led_state, xbus);  	for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) {  		struct ebsa285_led *led; @@ -100,6 +115,7 @@ MACHINE_START(EBSA285, "EBSA285")  	.video_start	= 0x000a0000,  	.video_end	= 0x000bffff,  	.map_io		= footbridge_map_io, +	.init_early	= footbridge_sched_clock,  	.init_irq	= footbridge_init_irq,  	.init_time	= footbridge_timer_init,  	.restart	= footbridge_restart,  | 
