diff options
Diffstat (limited to 'arch/arm/mach-pxa/idp.c')
| -rw-r--r-- | arch/arm/mach-pxa/idp.c | 98 | 
1 files changed, 91 insertions, 7 deletions
diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index e773dceeabc..343c4e3a7c5 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c @@ -33,9 +33,9 @@  #include <mach/pxa25x.h>  #include <mach/idp.h> -#include <mach/pxafb.h> +#include <linux/platform_data/video-pxafb.h>  #include <mach/bitfield.h> -#include <mach/mmc.h> +#include <linux/platform_data/mmc-pxamci.h>  #include "generic.h"  #include "devices.h" @@ -75,8 +75,8 @@ static struct resource smc91x_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= IRQ_GPIO(4), -		.end	= IRQ_GPIO(4), +		.start	= PXA_GPIO_TO_IRQ(4), +		.end	= PXA_GPIO_TO_IRQ(4),  		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,  	}  }; @@ -167,7 +167,7 @@ static void __init idp_init(void)  	platform_device_register(&smc91x_device);  	//platform_device_register(&mst_audio_device); -	set_pxa_fb_info(&sharp_lm8v31); +	pxa_set_fb_info(NULL, &sharp_lm8v31);  	pxa_set_mci_info(&idp_mci_platform_data);  } @@ -187,15 +187,99 @@ static struct map_desc idp_io_desc[] __initdata = {  static void __init idp_map_io(void)  { -	pxa_map_io(); +	pxa25x_map_io();  	iotable_init(idp_io_desc, ARRAY_SIZE(idp_io_desc));  } +/* LEDs */ +#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) +struct idp_led { +	struct led_classdev     cdev; +	u8                      mask; +}; + +/* + * The triggers lines up below will only be used if the + * LED triggers are compiled in. + */ +static const struct { +	const char *name; +	const char *trigger; +} idp_leds[] = { +	{ "idp:green", "heartbeat", }, +	{ "idp:red", "cpu0", }, +}; + +static void idp_led_set(struct led_classdev *cdev, +		enum led_brightness b) +{ +	struct idp_led *led = container_of(cdev, +			struct idp_led, cdev); +	u32 reg = IDP_CPLD_LED_CONTROL; + +	if (b != LED_OFF) +		reg &= ~led->mask; +	else +		reg |= led->mask; + +	IDP_CPLD_LED_CONTROL = reg; +} + +static enum led_brightness idp_led_get(struct led_classdev *cdev) +{ +	struct idp_led *led = container_of(cdev, +			struct idp_led, cdev); + +	return (IDP_CPLD_LED_CONTROL & led->mask) ? LED_OFF : LED_FULL; +} + +static int __init idp_leds_init(void) +{ +	int i; + +	if (!machine_is_pxa_idp()) +		return -ENODEV; + +	for (i = 0; i < ARRAY_SIZE(idp_leds); i++) { +		struct idp_led *led; + +		led = kzalloc(sizeof(*led), GFP_KERNEL); +		if (!led) +			break; + +		led->cdev.name = idp_leds[i].name; +		led->cdev.brightness_set = idp_led_set; +		led->cdev.brightness_get = idp_led_get; +		led->cdev.default_trigger = idp_leds[i].trigger; + +		if (i == 0) +			led->mask = IDP_HB_LED; +		else +			led->mask = IDP_BUSY_LED; + +		if (led_classdev_register(NULL, &led->cdev) < 0) { +			kfree(led); +			break; +		} +	} + +	return 0; +} + +/* + * Since we may have triggers on any subsystem, defer registration + * until after subsystem_init. + */ +fs_initcall(idp_leds_init); +#endif  MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")  	/* Maintainer: Vibren Technologies */  	.map_io		= idp_map_io, +	.nr_irqs	= PXA_NR_IRQS,  	.init_irq	= pxa25x_init_irq, -	.timer		= &pxa_timer, +	.handle_irq	= pxa25x_handle_irq, +	.init_time	= pxa_timer_init,  	.init_machine	= idp_init, +	.restart	= pxa_restart,  MACHINE_END  | 
