diff options
Diffstat (limited to 'arch/arm/mach-ep93xx')
| -rw-r--r-- | arch/arm/mach-ep93xx/core.c | 96 | ||||
| -rw-r--r-- | arch/arm/mach-ep93xx/edb93xx.c | 28 | ||||
| -rw-r--r-- | arch/arm/mach-ep93xx/include/mach/platform.h | 3 | ||||
| -rw-r--r-- | arch/arm/mach-ep93xx/soc.h | 1 | 
4 files changed, 126 insertions, 2 deletions
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 4dd07a0e360..4afe52aaaff 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -797,6 +797,102 @@ static struct platform_device ep93xx_wdt_device = {  	.resource	= ep93xx_wdt_resources,  }; +/************************************************************************* + * EP93xx IDE + *************************************************************************/ +static struct resource ep93xx_ide_resources[] = { +	DEFINE_RES_MEM(EP93XX_IDE_PHYS_BASE, 0x38), +	DEFINE_RES_IRQ(IRQ_EP93XX_EXT3), +}; + +static struct platform_device ep93xx_ide_device = { +	.name		= "ep93xx-ide", +	.id		= -1, +	.dev		= { +		.dma_mask		= &ep93xx_ide_device.dev.coherent_dma_mask, +		.coherent_dma_mask	= DMA_BIT_MASK(32), +	}, +	.num_resources	= ARRAY_SIZE(ep93xx_ide_resources), +	.resource	= ep93xx_ide_resources, +}; + +void __init ep93xx_register_ide(void) +{ +	platform_device_register(&ep93xx_ide_device); +} + +int ep93xx_ide_acquire_gpio(struct platform_device *pdev) +{ +	int err; +	int i; + +	err = gpio_request(EP93XX_GPIO_LINE_EGPIO2, dev_name(&pdev->dev)); +	if (err) +		return err; +	err = gpio_request(EP93XX_GPIO_LINE_EGPIO15, dev_name(&pdev->dev)); +	if (err) +		goto fail_egpio15; +	for (i = 2; i < 8; i++) { +		err = gpio_request(EP93XX_GPIO_LINE_E(i), dev_name(&pdev->dev)); +		if (err) +			goto fail_gpio_e; +	} +	for (i = 4; i < 8; i++) { +		err = gpio_request(EP93XX_GPIO_LINE_G(i), dev_name(&pdev->dev)); +		if (err) +			goto fail_gpio_g; +	} +	for (i = 0; i < 8; i++) { +		err = gpio_request(EP93XX_GPIO_LINE_H(i), dev_name(&pdev->dev)); +		if (err) +			goto fail_gpio_h; +	} + +	/* GPIO ports E[7:2], G[7:4] and H used by IDE */ +	ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_EONIDE | +				 EP93XX_SYSCON_DEVCFG_GONIDE | +				 EP93XX_SYSCON_DEVCFG_HONIDE); +	return 0; + +fail_gpio_h: +	for (--i; i >= 0; --i) +		gpio_free(EP93XX_GPIO_LINE_H(i)); +	i = 8; +fail_gpio_g: +	for (--i; i >= 4; --i) +		gpio_free(EP93XX_GPIO_LINE_G(i)); +	i = 8; +fail_gpio_e: +	for (--i; i >= 2; --i) +		gpio_free(EP93XX_GPIO_LINE_E(i)); +	gpio_free(EP93XX_GPIO_LINE_EGPIO15); +fail_egpio15: +	gpio_free(EP93XX_GPIO_LINE_EGPIO2); +	return err; +} +EXPORT_SYMBOL(ep93xx_ide_acquire_gpio); + +void ep93xx_ide_release_gpio(struct platform_device *pdev) +{ +	int i; + +	for (i = 2; i < 8; i++) +		gpio_free(EP93XX_GPIO_LINE_E(i)); +	for (i = 4; i < 8; i++) +		gpio_free(EP93XX_GPIO_LINE_G(i)); +	for (i = 0; i < 8; i++) +		gpio_free(EP93XX_GPIO_LINE_H(i)); +	gpio_free(EP93XX_GPIO_LINE_EGPIO15); +	gpio_free(EP93XX_GPIO_LINE_EGPIO2); + + +	/* GPIO ports E[7:2], G[7:4] and H used by GPIO */ +	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_EONIDE | +			       EP93XX_SYSCON_DEVCFG_GONIDE | +			       EP93XX_SYSCON_DEVCFG_HONIDE); +} +EXPORT_SYMBOL(ep93xx_ide_release_gpio); +  void __init ep93xx_init_devices(void)  {  	/* Disallow access to MaverickCrunch initially */ diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index d74c5cddb98..337ab7cf4c1 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c @@ -91,8 +91,8 @@ static void __init edb93xx_register_i2c(void)  		ep93xx_register_i2c(&edb93xx_i2c_gpio_data,  				    edb93xxa_i2c_board_info,  				    ARRAY_SIZE(edb93xxa_i2c_board_info)); -	} else if (machine_is_edb9307() || machine_is_edb9312() || -		   machine_is_edb9315()) { +	} else if (machine_is_edb9302() || machine_is_edb9307() +		|| machine_is_edb9312() || machine_is_edb9315()) {  		ep93xx_register_i2c(&edb93xx_i2c_gpio_data,  				    edb93xx_i2c_board_info,  				    ARRAY_SIZE(edb93xx_i2c_board_info)); @@ -233,6 +233,29 @@ static void __init edb93xx_register_fb(void)  } +/************************************************************************* + * EDB93xx IDE + *************************************************************************/ +static int __init edb93xx_has_ide(void) +{ +	/* +	 * Although EDB9312 and EDB9315 do have IDE capability, they have +	 * INTRQ line wired as pull-up, which makes using IDE interface +	 * problematic. +	 */ +	return machine_is_edb9312() || machine_is_edb9315() || +	       machine_is_edb9315a(); +} + +static void __init edb93xx_register_ide(void) +{ +	if (!edb93xx_has_ide()) +		return; + +	ep93xx_register_ide(); +} + +  static void __init edb93xx_init_machine(void)  {  	ep93xx_init_devices(); @@ -243,6 +266,7 @@ static void __init edb93xx_init_machine(void)  	edb93xx_register_i2s();  	edb93xx_register_pwm();  	edb93xx_register_fb(); +	edb93xx_register_ide();  } diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 1ecb040d98b..33a5122c6dc 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h @@ -48,6 +48,9 @@ void ep93xx_register_i2s(void);  int ep93xx_i2s_acquire(void);  void ep93xx_i2s_release(void);  void ep93xx_register_ac97(void); +void ep93xx_register_ide(void); +int ep93xx_ide_acquire_gpio(struct platform_device *pdev); +void ep93xx_ide_release_gpio(struct platform_device *pdev);  void ep93xx_init_devices(void);  extern struct sys_timer ep93xx_timer; diff --git a/arch/arm/mach-ep93xx/soc.h b/arch/arm/mach-ep93xx/soc.h index 979fba72292..7bf7ff8beae 100644 --- a/arch/arm/mach-ep93xx/soc.h +++ b/arch/arm/mach-ep93xx/soc.h @@ -69,6 +69,7 @@  #define EP93XX_BOOT_ROM_BASE		EP93XX_AHB_IOMEM(0x00090000) +#define EP93XX_IDE_PHYS_BASE		EP93XX_AHB_PHYS(0x000a0000)  #define EP93XX_IDE_BASE			EP93XX_AHB_IOMEM(0x000a0000)  #define EP93XX_VIC1_BASE		EP93XX_AHB_IOMEM(0x000b0000)  |