[PATCH] add PATA host controller support for Cirrus Logic's EP93xx CPUs

H Hartley Sweeten hartleys at visionengravers.com
Tue Dec 1 20:16:21 EST 2009


On Tuesday, December 01, 2009 6:07 PM, Bartlomiej Zolnierkiewicz wrote:
> On Wednesday 02 December 2009 01:53:53 am Ryan Mallon wrote:
>> Bartlomiej Zolnierkiewicz wrote:
>>> Based on the older IDE host driver by Joao Ramos and review comments
>>> for it from Sergei Shtylyov.  Not yet tested with the real hardware.
>>>
>> 
>> Hi Bartlomiej,
>> 
>> I have got as far as patching this into my kernel and doing a build test
>> (still need to find a hard-disk to test). I got some build errors, see
>> below:
>
> Hi,
>
> Many thanks for picking this driver up.
>
> The following preparatory libata one-liner is needed to make it build:
>
>	http://patchwork.kernel.org/patch/62926/
>
> and you may also need to update ep93xx ide gpio patch:
>
>	http://thread.gmane.org/gmane.linux.ports.arm.kernel/57688/focus=58730
>
> to current kernels to make the hardware work.

Ryan,

I updated the core parts of this patch with the ide gpio stuff.  This will
patch cleanly to 2.6.32-rc8 but will have problems after the 2.6.33 merge
due to the core keypad support already in Russell's tree.

But, for what it's worth....

Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>

---

diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index b4357c3..7c12c71 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -728,6 +728,91 @@ void __init ep93xx_register_fb(struct ep93xxfb_mach_info *data)
 	platform_device_register(&ep93xx_fb_device);
 }
 
+
+/*************************************************************************
+ * EP93xx ide peripheral handling
+ *************************************************************************/
+static struct resource ep93xx_ide_resources[] = {
+	{
+		.start	= EP93XX_IDE_PHYS_BASE,
+		.end	= EP93XX_IDE_PHYS_BASE + 0x38 - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
+		.start	= IRQ_EP93XX_EXT3,
+		.end	= IRQ_EP93XX_EXT3,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device ep93xx_ide_device = {
+	.name		= "ep93xx-ide",
+	.id		= -1,
+	.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_aquire_gpio(struct platform_device *pdev)
+{
+	int i, err;
+
+	for (i = 0; i < 8; i++) {
+		err = gpio_request(EP93XX_GPIO_LINE_E(i),
+				   dev_name(&pdev->dev));
+		if (err)
+			goto fail_gpio_e;
+		err = gpio_request(EP93XX_GPIO_LINE_F(i),
+				   dev_name(&pdev->dev));
+		if (err)
+			goto fail_gpio_f;
+		err = gpio_request(EP93XX_GPIO_LINE_G(i),
+				   dev_name(&pdev->dev));
+		if (err)
+			goto fail_gpio_g;
+	}
+
+	ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_EONIDE |
+				 EP93XX_SYSCON_DEVCFG_GONIDE |
+				 EP93XX_SYSCON_DEVCFG_HONIDE);
+
+	return 0;
+
+fail_gpio_g:
+	gpio_free(EP93XX_GPIO_LINE_F(i));
+fail_gpio_f:
+	gpio_free(EP93XX_GPIO_LINE_E(i));
+fail_gpio_e:
+	for ( ; i >= 0; --i) {
+		gpio_free(EP93XX_GPIO_LINE_E(i));
+		gpio_free(EP93XX_GPIO_LINE_F(i));
+		gpio_free(EP93XX_GPIO_LINE_G(i));
+	}
+	return err;
+}
+EXPORT_SYMBOL(ep93xx_ide_aquire_gpio);
+
+void ep93xx_ide_release_gpio(struct platform_device *pdev)
+{
+	int i;
+
+	for (i = 0; i < 8; i++) {
+		gpio_free(EP93XX_GPIO_LINE_E(i));
+		gpio_free(EP93XX_GPIO_LINE_F(i));
+		gpio_free(EP93XX_GPIO_LINE_G(i));
+	}
+
+	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_EONIDE |
+			       EP93XX_SYSCON_DEVCFG_GONIDE |
+			       EP93XX_SYSCON_DEVCFG_HONIDE);
+}
+EXPORT_SYMBOL(ep93xx_ide_release_gpio);
+
+
 extern void ep93xx_gpio_init(void);
 
 void __init ep93xx_init_devices(void)
diff --git a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
index b1f937e..bda1930 100644
--- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
+++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
@@ -83,6 +83,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)
diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h
index 469fd96..43e8f4d 100644
--- a/arch/arm/mach-ep93xx/include/mach/platform.h
+++ b/arch/arm/mach-ep93xx/include/mach/platform.h
@@ -39,6 +39,9 @@ void ep93xx_register_fb(struct ep93xxfb_mach_info *data);
 void ep93xx_register_pwm(int pwm0, int pwm1);
 int ep93xx_pwm_acquire_gpio(struct platform_device *pdev);
 void ep93xx_pwm_release_gpio(struct platform_device *pdev);
+void ep93xx_register_ide(void);
+int ep93xx_ide_aquire_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; 



More information about the linux-arm-kernel mailing list