diff options
Diffstat (limited to 'arch/arm/mach-ep93xx/core.c')
| -rw-r--r-- | arch/arm/mach-ep93xx/core.c | 96 | 
1 files changed, 96 insertions, 0 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 */  |