ARM: pxa: Use gpio arrays in palmld_hdd driver
Marek Vasut [Sat, 15 Jan 2011 18:19:05 +0000 (19:19 +0100)]
Use gpio_request_array() / gpio_free_array(), this makes the code
cleaner and less error prone.

This patch also properly frees GPIOs in case ata_host_activate() call fails.

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>

drivers/ata/pata_palmld.c

index 11fb4cc..fecf527 100644 (file)
 
 #define DRV_NAME "pata_palmld"
 
+static struct gpio palmld_hdd_gpios[] = {
+       { GPIO_NR_PALMLD_IDE_PWEN,      GPIOF_INIT_HIGH,        "HDD Power" },
+       { GPIO_NR_PALMLD_IDE_RESET,     GPIOF_INIT_LOW,         "HDD Reset" },
+};
+
 static struct scsi_host_template palmld_sht = {
        ATA_PIO_SHT(DRV_NAME),
 };
@@ -52,28 +57,23 @@ static __devinit int palmld_pata_probe(struct platform_device *pdev)
 
        /* allocate host */
        host = ata_host_alloc(&pdev->dev, 1);
-       if (!host)
-               return -ENOMEM;
+       if (!host) {
+               ret = -ENOMEM;
+               goto err1;
+       }
 
        /* remap drive's physical memory address */
        mem = devm_ioremap(&pdev->dev, PALMLD_IDE_PHYS, 0x1000);
-       if (!mem)
-               return -ENOMEM;
+       if (!mem) {
+               ret = -ENOMEM;
+               goto err1;
+       }
 
        /* request and activate power GPIO, IRQ GPIO */
-       ret = gpio_request(GPIO_NR_PALMLD_IDE_PWEN, "HDD PWR");
+       ret = gpio_request_array(palmld_hdd_gpios,
+                               ARRAY_SIZE(palmld_hdd_gpios));
        if (ret)
                goto err1;
-       ret = gpio_direction_output(GPIO_NR_PALMLD_IDE_PWEN, 1);
-       if (ret)
-               goto err2;
-
-       ret = gpio_request(GPIO_NR_PALMLD_IDE_RESET, "HDD RST");
-       if (ret)
-               goto err2;
-       ret = gpio_direction_output(GPIO_NR_PALMLD_IDE_RESET, 0);
-       if (ret)
-               goto err3;
 
        /* reset the drive */
        gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 0);
@@ -96,13 +96,15 @@ static __devinit int palmld_pata_probe(struct platform_device *pdev)
        ata_sff_std_ports(&ap->ioaddr);
 
        /* activate host */
-       return ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING,
+       ret = ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING,
                                        &palmld_sht);
+       if (ret)
+               goto err2;
+
+       return ret;
 
-err3:
-       gpio_free(GPIO_NR_PALMLD_IDE_RESET);
 err2:
-       gpio_free(GPIO_NR_PALMLD_IDE_PWEN);
+       gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios));
 err1:
        return ret;
 }
@@ -116,8 +118,7 @@ static __devexit int palmld_pata_remove(struct platform_device *dev)
        /* power down the HDD */
        gpio_set_value(GPIO_NR_PALMLD_IDE_PWEN, 0);
 
-       gpio_free(GPIO_NR_PALMLD_IDE_RESET);
-       gpio_free(GPIO_NR_PALMLD_IDE_PWEN);
+       gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios));
 
        return 0;
 }