[PATCH v2 2/3] ep93xx: IDE driver platform support code
From: Rafal Prylowski <hidden>
Date: 2012-04-04 08:41:06
Also in:
linux-ide
On 2012-04-03 19:41, H Hartley Sweeten wrote:
On Tuesday, April 03, 2012 7:47 AM, Rafal Prylowski wrote:quoted
+int ep93xx_ide_acquire_gpio(struct platform_device *pdev) +{ + int err; + int i; + + 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)); + return err; +} +EXPORT_SYMBOL(ep93xx_ide_acquire_gpio);
[not related to my patch, but ep93xx keypad]: Isn't ep93xx_keypad_acquire_gpio be more correct if we apply the following patch: Index: linux-2.6/arch/arm/mach-ep93xx/core.c ===================================================================
--- linux-2.6.orig/arch/arm/mach-ep93xx/core.c
+++ linux-2.6/arch/arm/mach-ep93xx/core.c@@ -734,7 +734,7 @@ int ep93xx_keypad_acquire_gpio(struct pl fail_gpio_d: gpio_free(EP93XX_GPIO_LINE_C(i)); fail_gpio_c: - for ( ; i >= 0; --i) { + for (--i; i >= 0; --i) { gpio_free(EP93XX_GPIO_LINE_C(i)); gpio_free(EP93XX_GPIO_LINE_D(i)); }
This way we don't double free EP93XX_GPIO_LINE_C(i), and don't free lines which were not successfully acquired (I noticed this when writing my patch, which is based on ep93xx_keypad_acquire/release_gpio). Thanks, RP