ep93xx: IDE driver platform support code
[deliverable/linux.git] / arch / arm / mach-ep93xx / core.c
index 4dd07a0e3604a19498cf4fa507b544a666e2d8a5..4afe52aaaff3573e97e6d46ba479b56303445f89 100644 (file)
@@ -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 */
This page took 0.040114 seconds and 5 git commands to generate.