]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: sata_highbank: Convert to use GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 14 Nov 2018 00:02:41 +0000 (01:02 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 5 Dec 2018 00:15:22 +0000 (17:15 -0700)
This pure device tree driver is simple to convert to use
just GPIO descriptors instead of GPIO numbers. So let's
just do it.

Cc: Mark Langsdorf <mlangsdo@redhat.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/ata/sata_highbank.c

index e67815b896fcc40772ac45fdf8e8be7253cecafa..c8fc9280d6e4edc42fd844676a12f9a1ba0006d7 100644 (file)
@@ -31,8 +31,7 @@
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/export.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 
 #include "ahci.h"
 
@@ -85,7 +84,7 @@ struct ecx_plat_data {
        /* number of extra clocks that the SGPIO PIC controller expects */
        u32             pre_clocks;
        u32             post_clocks;
-       unsigned        sgpio_gpio[SGPIO_PINS];
+       struct gpio_desc *sgpio_gpiod[SGPIO_PINS];
        u32             sgpio_pattern;
        u32             port_to_sgpio[SGPIO_PORTS];
 };
@@ -131,9 +130,9 @@ static void ecx_parse_sgpio(struct ecx_plat_data *pdata, u32 port, u32 state)
  */
 static void ecx_led_cycle_clock(struct ecx_plat_data *pdata)
 {
-       gpio_set_value(pdata->sgpio_gpio[SCLOCK], 1);
+       gpiod_set_value(pdata->sgpio_gpiod[SCLOCK], 1);
        udelay(50);
-       gpio_set_value(pdata->sgpio_gpio[SCLOCK], 0);
+       gpiod_set_value(pdata->sgpio_gpiod[SCLOCK], 0);
        udelay(50);
 }
 
@@ -164,15 +163,15 @@ static ssize_t ecx_transmit_led_message(struct ata_port *ap, u32 state,
        for (i = 0; i < pdata->pre_clocks; i++)
                ecx_led_cycle_clock(pdata);
 
-       gpio_set_value(pdata->sgpio_gpio[SLOAD], 1);
+       gpiod_set_value(pdata->sgpio_gpiod[SLOAD], 1);
        ecx_led_cycle_clock(pdata);
-       gpio_set_value(pdata->sgpio_gpio[SLOAD], 0);
+       gpiod_set_value(pdata->sgpio_gpiod[SLOAD], 0);
        /*
         * bit-bang out the SGPIO pattern, by consuming a bit and then
         * clocking it out.
         */
        for (i = 0; i < (SGPIO_SIGNALS * pdata->n_ports); i++) {
-               gpio_set_value(pdata->sgpio_gpio[SDATA], sgpio_out & 1);
+               gpiod_set_value(pdata->sgpio_gpiod[SDATA], sgpio_out & 1);
                sgpio_out >>= 1;
                ecx_led_cycle_clock(pdata);
        }
@@ -193,21 +192,19 @@ static void highbank_set_em_messages(struct device *dev,
        struct device_node *np = dev->of_node;
        struct ecx_plat_data *pdata = hpriv->plat_data;
        int i;
-       int err;
 
        for (i = 0; i < SGPIO_PINS; i++) {
-               err = of_get_named_gpio(np, "calxeda,sgpio-gpio", i);
-               if (err < 0)
-                       return;
-
-               pdata->sgpio_gpio[i] = err;
-               err = gpio_request(pdata->sgpio_gpio[i], "CX SGPIO");
-               if (err) {
-                       pr_err("sata_highbank gpio_request %d failed: %d\n",
-                                       i, err);
-                       return;
+               struct gpio_desc *gpiod;
+
+               gpiod = devm_gpiod_get_index(dev, "calxeda,sgpio", i,
+                                            GPIOD_OUT_HIGH);
+               if (IS_ERR(gpiod)) {
+                       dev_err(dev, "failed to get GPIO %d\n", i);
+                       continue;
                }
-               gpio_direction_output(pdata->sgpio_gpio[i], 1);
+               gpiod_set_consumer_name(gpiod, "CX SGPIO");
+
+               pdata->sgpio_gpiod[i] = gpiod;
        }
        of_property_read_u32_array(np, "calxeda,led-order",
                                                pdata->port_to_sgpio,