diff options
Diffstat (limited to 'arch/arm/mach-ixp4xx/dsmg600-setup.c')
| -rw-r--r-- | arch/arm/mach-ixp4xx/dsmg600-setup.c | 80 | 
1 files changed, 46 insertions, 34 deletions
diff --git a/arch/arm/mach-ixp4xx/dsmg600-setup.c b/arch/arm/mach-ixp4xx/dsmg600-setup.c index d398229cfaa..43ee06d3abe 100644 --- a/arch/arm/mach-ixp4xx/dsmg600-setup.c +++ b/arch/arm/mach-ixp4xx/dsmg600-setup.c @@ -16,7 +16,7 @@   * Author: Rod Whitby <rod@whitby.id.au>   * Maintainers: http://www.nslu2-linux.org/   */ - +#include <linux/gpio.h>  #include <linux/irq.h>  #include <linux/jiffies.h>  #include <linux/timer.h> @@ -26,12 +26,14 @@  #include <linux/reboot.h>  #include <linux/i2c.h>  #include <linux/i2c-gpio.h> +#include <linux/gpio.h> + +#include <mach/hardware.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/time.h> -#include <asm/gpio.h>  #define DSMG600_SDA_PIN		5  #define DSMG600_SCL_PIN		4 @@ -160,11 +162,8 @@ static struct platform_device *dsmg600_devices[] __initdata = {  static void dsmg600_power_off(void)  { -	/* enable the pwr cntl gpio */ -	gpio_line_config(DSMG600_PO_GPIO, IXP4XX_GPIO_OUT); - -	/* poweroff */ -	gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH); +	/* enable the pwr cntl and drive it high */ +	gpio_direction_output(DSMG600_PO_GPIO, 1);  }  /* This is used to make sure the power-button pusher is serious.  The button @@ -201,7 +200,7 @@ static void dsmg600_power_handler(unsigned long data)  			ctrl_alt_del();  			/* Change the state of the power LED to "blink" */ -			gpio_line_set(DSMG600_LED_PWR_GPIO, IXP4XX_GPIO_LOW); +			gpio_set_value(DSMG600_LED_PWR_GPIO, 0);  		} else {  			power_button_countdown = PBUTTON_HOLDDOWN_COUNT;  		} @@ -227,9 +226,38 @@ static void __init dsmg600_timer_init(void)      ixp4xx_timer_init();  } -static struct sys_timer dsmg600_timer = { -    .init   = dsmg600_timer_init, -}; +static int __init dsmg600_gpio_init(void) +{ +	if (!machine_is_dsmg600()) +		return 0; + +	gpio_request(DSMG600_RB_GPIO, "reset button"); +	if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, +		IRQF_TRIGGER_LOW, "DSM-G600 reset button", NULL) < 0) { + +		printk(KERN_DEBUG "Reset Button IRQ %d not available\n", +			gpio_to_irq(DSMG600_RB_GPIO)); +	} + +	/* +	 * The power button on the D-Link DSM-G600 is on GPIO 15, but +	 * it cannot handle interrupts on that GPIO line.  So we'll +	 * have to poll it with a kernel timer. +	 */ + +	/* Make sure that the power button GPIO is set up as an input */ +	gpio_request(DSMG600_PB_GPIO, "power button"); +	gpio_direction_input(DSMG600_PB_GPIO); +	/* Request poweroff GPIO line */ +	gpio_request(DSMG600_PO_GPIO, "power off button"); + +	/* Set the initial value for the power button IRQ handler */ +	power_button_countdown = PBUTTON_HOLDDOWN_COUNT; + +	mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500)); +	return 0; +} +device_initcall(dsmg600_gpio_init);  static void __init dsmg600_init(void)  { @@ -254,34 +282,18 @@ static void __init dsmg600_init(void)  	platform_add_devices(dsmg600_devices, ARRAY_SIZE(dsmg600_devices));  	pm_power_off = dsmg600_power_off; - -	if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler, -		IRQF_DISABLED | IRQF_TRIGGER_LOW, -		"DSM-G600 reset button", NULL) < 0) { - -		printk(KERN_DEBUG "Reset Button IRQ %d not available\n", -			gpio_to_irq(DSMG600_RB_GPIO)); -	} - -	/* The power button on the D-Link DSM-G600 is on GPIO 15, but -	 * it cannot handle interrupts on that GPIO line.  So we'll -	 * have to poll it with a kernel timer. -	 */ - -	/* Make sure that the power button GPIO is set up as an input */ -	gpio_line_config(DSMG600_PB_GPIO, IXP4XX_GPIO_IN); - -	/* Set the initial value for the power button IRQ handler */ -	power_button_countdown = PBUTTON_HOLDDOWN_COUNT; - -	mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500));  }  MACHINE_START(DSMG600, "D-Link DSM-G600 RevA")  	/* Maintainer: www.nslu2-linux.org */ -	.boot_params	= 0x00000100, +	.atag_offset	= 0x100,  	.map_io		= ixp4xx_map_io, +	.init_early	= ixp4xx_init_early,  	.init_irq	= ixp4xx_init_irq, -	.timer          = &dsmg600_timer, +	.init_time	= dsmg600_timer_init,  	.init_machine	= dsmg600_init, +#if defined(CONFIG_PCI) +	.dma_zone_size	= SZ_64M, +#endif +	.restart	= ixp4xx_restart,  MACHINE_END  | 
