mtd: rawnand: lpc32xx_slc: switch to using gpiod API
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 28 Sep 2022 23:00:19 +0000 (16:00 -0700)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Tue, 18 Oct 2022 08:36:05 +0000 (10:36 +0200)
This switches the driver from legacy gpio API to a newer gpiod API.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20220928230019.2140896-2-dmitry.torokhov@gmail.com
drivers/mtd/nand/raw/lpc32xx_slc.c

index 6b7269cfb7d8390ef3372ef755102454fe76624c..4702577f74e5dae40f0438554fa31e42d296d555 100644 (file)
@@ -23,9 +23,8 @@
 #include <linux/mm.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/mtd/lpc32xx_slc.h>
 
 #define LPC32XX_MODNAME                "lpc32xx-nand"
@@ -208,7 +207,6 @@ struct lpc32xx_nand_cfg_slc {
        uint32_t rwidth;
        uint32_t rhold;
        uint32_t rsetup;
-       int wp_gpio;
        struct mtd_partition *parts;
        unsigned num_parts;
 };
@@ -217,6 +215,7 @@ struct lpc32xx_nand_host {
        struct nand_chip        nand_chip;
        struct lpc32xx_slc_platform_data *pdata;
        struct clk              *clk;
+       struct gpio_desc        *wp_gpio;
        void __iomem            *io_base;
        struct lpc32xx_nand_cfg_slc *ncfg;
 
@@ -309,8 +308,8 @@ static int lpc32xx_nand_device_ready(struct nand_chip *chip)
  */
 static void lpc32xx_wp_enable(struct lpc32xx_nand_host *host)
 {
-       if (gpio_is_valid(host->ncfg->wp_gpio))
-               gpio_set_value(host->ncfg->wp_gpio, 0);
+       if (host->wp_gpio)
+               gpiod_set_value_cansleep(host->wp_gpio, 1);
 }
 
 /*
@@ -318,8 +317,8 @@ static void lpc32xx_wp_enable(struct lpc32xx_nand_host *host)
  */
 static void lpc32xx_wp_disable(struct lpc32xx_nand_host *host)
 {
-       if (gpio_is_valid(host->ncfg->wp_gpio))
-               gpio_set_value(host->ncfg->wp_gpio, 1);
+       if (host->wp_gpio)
+               gpiod_set_value_cansleep(host->wp_gpio, 0);
 }
 
 /*
@@ -764,8 +763,6 @@ static struct lpc32xx_nand_cfg_slc *lpc32xx_parse_dt(struct device *dev)
                return NULL;
        }
 
-       ncfg->wp_gpio = of_get_named_gpio(np, "gpios", 0);
-
        return ncfg;
 }
 
@@ -852,14 +849,18 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
                        "Missing or bad NAND config from device tree\n");
                return -ENOENT;
        }
-       if (host->ncfg->wp_gpio == -EPROBE_DEFER)
-               return -EPROBE_DEFER;
-       if (gpio_is_valid(host->ncfg->wp_gpio) && devm_gpio_request(&pdev->dev,
-                       host->ncfg->wp_gpio, "NAND WP")) {
-               dev_err(&pdev->dev, "GPIO not available\n");
-               return -EBUSY;
+
+       /* Start with WP disabled, if available */
+       host->wp_gpio = gpiod_get_optional(&pdev->dev, NULL, GPIOD_OUT_LOW);
+       res = PTR_ERR_OR_ZERO(host->wp_gpio);
+       if (res) {
+               if (res != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "WP GPIO is not available: %d\n",
+                               res);
+               return res;
        }
-       lpc32xx_wp_disable(host);
+
+       gpiod_set_consumer_name(host->wp_gpio, "NAND WP");
 
        host->pdata = dev_get_platdata(&pdev->dev);