|
@@ -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 */
|