Add support for requesting GPIOs with a live device tree.

This involves adjusting the function signature for the legacy function
gpio_request_by_name_nodev(), so fix up all callers.

Signed-off-by: Simon Glass <s...@chromium.org>
---

Changes in v3: None
Changes in v2: None

 board/qualcomm/dragonboard410c/dragonboard410c.c | 12 +++---
 board/samsung/common/board.c                     |  4 +-
 board/samsung/common/exynos5-dt.c                |  2 +-
 drivers/gpio/gpio-uclass.c                       | 51 +++++++++++-------------
 drivers/i2c/mxc_i2c.c                            | 12 +++---
 drivers/mmc/fsl_esdhc.c                          |  6 +--
 drivers/mmc/s5p_sdhci.c                          |  8 ++--
 drivers/mtd/nand/sunxi_nand.c                    |  2 +-
 drivers/mtd/nand/tegra_nand.c                    |  4 +-
 drivers/net/pic32_eth.c                          |  3 +-
 drivers/sound/max98095.c                         |  2 +
 drivers/sound/wm8994.c                           |  2 +-
 drivers/spi/pic32_spi.c                          |  2 +-
 drivers/usb/host/ehci-tegra.c                    |  7 ++--
 drivers/usb/host/ehci-vf.c                       |  5 ++-
 include/asm-generic/gpio.h                       | 10 ++---
 16 files changed, 65 insertions(+), 67 deletions(-)

diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c 
b/board/qualcomm/dragonboard410c/dragonboard410c.c
index e923ddc2e2..37d0b85e0e 100644
--- a/board/qualcomm/dragonboard410c/dragonboard410c.c
+++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
@@ -53,8 +53,8 @@ int board_prepare_usb(enum usb_init_type type)
                        printf("Failed to find usb_hub_reset_pm dt node.\n");
                        return node;
                }
-               ret = gpio_request_by_name_nodev(gd->fdt_blob, node, "gpios", 0,
-                                                &hub_reset, 0);
+               ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
+                                                "gpios", 0, &hub_reset, 0);
                if (ret < 0) {
                        printf("Failed to request usb_hub_reset_pm gpio.\n");
                        return ret;
@@ -69,8 +69,8 @@ int board_prepare_usb(enum usb_init_type type)
                        printf("Failed to find usb_sw_sel_pm dt node.\n");
                        return 0;
                }
-               ret = gpio_request_by_name_nodev(gd->fdt_blob, node, "gpios", 0,
-                                                &usb_sel, 0);
+               ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
+                                                "gpios", 0, &usb_sel, 0);
                if (ret < 0) {
                        printf("Failed to request usb_sw_sel_pm gpio.\n");
                        return ret;
@@ -121,8 +121,8 @@ int misc_init_r(void)
                return 0;
        }
 
-       if (gpio_request_by_name_nodev(gd->fdt_blob, node, "gpios", 0, &resin,
-                                      0)) {
+       if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
+                                      &resin, 0)) {
                printf("Failed to request key_vol_down button.\n");
                return 0;
        }
diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
index 17626966aa..88299f17e3 100644
--- a/board/samsung/common/board.c
+++ b/board/samsung/common/board.c
@@ -351,8 +351,8 @@ void reset_misc(void)
        if (node < 0)
                return;
 
-       gpio_request_by_name_nodev(gd->fdt_blob, node, "reset-gpio", 0, &gpio,
-                                  GPIOD_IS_OUT);
+       gpio_request_by_name_nodev(offset_to_ofnode(node), "reset-gpio", 0,
+                                  &gpio, GPIOD_IS_OUT);
 
        if (dm_gpio_is_valid(&gpio)) {
                /*
diff --git a/board/samsung/common/exynos5-dt.c 
b/board/samsung/common/exynos5-dt.c
index aec1f396b0..44f412db5d 100644
--- a/board/samsung/common/exynos5-dt.c
+++ b/board/samsung/common/exynos5-dt.c
@@ -45,7 +45,7 @@ static void board_enable_audio_codec(void)
        if (node <= 0)
                return;
 
-       ret = gpio_request_by_name_nodev(gd->fdt_blob, node,
+       ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
                                         "codec-enable-gpio", 0, &en_gpio,
                                         GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
        if (ret == -FDT_ERR_NOTFOUND)
diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
index 92a1346aa2..f611996f17 100644
--- a/drivers/gpio/gpio-uclass.c
+++ b/drivers/gpio/gpio-uclass.c
@@ -683,45 +683,41 @@ err:
        return ret;
 }
 
-static int _gpio_request_by_name_nodev(const void *blob, int node,
-                                      const char *list_name, int index,
-                                      struct gpio_desc *desc, int flags,
-                                      bool add_index)
+static int _gpio_request_by_name_nodev(ofnode node, const char *list_name,
+                                      int index, struct gpio_desc *desc,
+                                      int flags, bool add_index)
 {
        struct ofnode_phandle_args args;
        int ret;
 
-       ret = ofnode_parse_phandle_with_args(offset_to_ofnode(node), list_name,
-                                            "#gpio-cells", 0, index, &args);
-       if (ret)
-               debug("%s: fdtdec_parse_phandle_with_args failed\n", __func__);
+       ret = ofnode_parse_phandle_with_args(node, list_name, "#gpio-cells", 0,
+                                            index, &args);
 
-       return gpio_request_tail(ret, offset_to_ofnode(node), &args, list_name,
-                                index, desc, flags, add_index);
+       return gpio_request_tail(ret, node, &args, list_name, index, desc,
+                                flags, add_index);
 }
 
-int gpio_request_by_name_nodev(const void *blob, int node,
-                              const char *list_name, int index,
+int gpio_request_by_name_nodev(ofnode node, const char *list_name, int index,
                               struct gpio_desc *desc, int flags)
 {
-       return _gpio_request_by_name_nodev(blob, node, list_name, index, desc,
-                                          flags, index > 0);
+       return _gpio_request_by_name_nodev(node, list_name, index, desc, flags,
+                                          index > 0);
 }
 
-int gpio_request_by_name(struct udevice *dev,  const char *list_name, int 
index,
+int gpio_request_by_name(struct udevice *dev, const char *list_name, int index,
                         struct gpio_desc *desc, int flags)
 {
-       /*
-        * This isn't ideal since we don't use dev->name in the debug()
-        * calls in gpio_request_by_name(), but we can do this until
-        * gpio_request_by_name_nodev() can be dropped.
-        */
-       return gpio_request_by_name_nodev(gd->fdt_blob, dev_of_offset(dev),
-                                         list_name, index, desc, flags);
+       struct ofnode_phandle_args args;
+       int ret;
+
+       ret = dev_read_phandle_with_args(dev, list_name, "#gpio-cells", 0,
+                                        index, &args);
+
+       return gpio_request_tail(ret, dev_ofnode(dev), &args, list_name,
+                                index, desc, flags, index > 0);
 }
 
-int gpio_request_list_by_name_nodev(const void *blob, int node,
-                                   const char *list_name,
+int gpio_request_list_by_name_nodev(ofnode node, const char *list_name,
                                    struct gpio_desc *desc, int max_count,
                                    int flags)
 {
@@ -729,7 +725,7 @@ int gpio_request_list_by_name_nodev(const void *blob, int 
node,
        int ret;
 
        for (count = 0; count < max_count; count++) {
-               ret = _gpio_request_by_name_nodev(blob, node, list_name, count,
+               ret = _gpio_request_by_name_nodev(node, list_name, count,
                                                  &desc[count], flags, true);
                if (ret == -ENOENT)
                        break;
@@ -755,9 +751,8 @@ int gpio_request_list_by_name(struct udevice *dev, const 
char *list_name,
         * calls in gpio_request_by_name(), but we can do this until
         * gpio_request_list_by_name_nodev() can be dropped.
         */
-       return gpio_request_list_by_name_nodev(gd->fdt_blob, dev_of_offset(dev),
-                                              list_name, desc, max_count,
-                                              flags);
+       return gpio_request_list_by_name_nodev(dev_ofnode(dev), list_name, desc,
+                                              max_count, flags);
 }
 
 int gpio_get_list_count(struct udevice *dev, const char *list_name)
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index 3258ae7ced..110b9d6119 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -773,12 +773,12 @@ static int mxc_i2c_probe(struct udevice *bus)
        if (ret < 0) {
                debug("i2c bus %d at 0x%2lx, no gpio pinctrl state.\n", 
bus->seq, i2c_bus->base);
        } else {
-               ret = gpio_request_by_name_nodev(fdt, node, "scl-gpios",
-                                                0, &i2c_bus->scl_gpio,
-                                                GPIOD_IS_OUT);
-               ret2 = gpio_request_by_name_nodev(fdt, node, "sda-gpios",
-                                                0, &i2c_bus->sda_gpio,
-                                                GPIOD_IS_OUT);
+               ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
+                               "scl-gpios", 0, &i2c_bus->scl_gpio,
+                               GPIOD_IS_OUT);
+               ret2 = gpio_request_by_name_nodev(offset_to_ofnode(node),
+                               "sda-gpios", 0, &i2c_bus->sda_gpio,
+                               GPIOD_IS_OUT);
                if (!dm_gpio_is_valid(&i2c_bus->sda_gpio) |
                    !dm_gpio_is_valid(&i2c_bus->scl_gpio) |
                    ret | ret2) {
diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
index 3b3110f58b..5ee712f09b 100644
--- a/drivers/mmc/fsl_esdhc.c
+++ b/drivers/mmc/fsl_esdhc.c
@@ -983,15 +983,15 @@ static int fsl_esdhc_probe(struct udevice *dev)
         } else {
                priv->non_removable = 0;
 #ifdef CONFIG_DM_GPIO
-               gpio_request_by_name_nodev(fdt, node, "cd-gpios", 0,
-                                          &priv->cd_gpio, GPIOD_IS_IN);
+               gpio_request_by_name_nodev(offset_to_ofnode(node), "cd-gpios",
+                                          0, &priv->cd_gpio, GPIOD_IS_IN);
 #endif
        }
 
        priv->wp_enable = 1;
 
 #ifdef CONFIG_DM_GPIO
-       ret = gpio_request_by_name_nodev(fdt, node, "wp-gpios", 0,
+       ret = gpio_request_by_name_nodev(offset_to_ofnode(node), "wp-gpios", 0,
                                         &priv->wp_gpio, GPIOD_IS_IN);
        if (ret)
                priv->wp_enable = 0;
diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
index 640ea0261e..62817a0d07 100644
--- a/drivers/mmc/s5p_sdhci.c
+++ b/drivers/mmc/s5p_sdhci.c
@@ -184,10 +184,10 @@ static int sdhci_get_config(const void *blob, int node, 
struct sdhci_host *host)
        }
        host->ioaddr = (void *)base;
 
-       gpio_request_by_name_nodev(blob, node, "pwr-gpios", 0, &host->pwr_gpio,
-                                  GPIOD_IS_OUT);
-       gpio_request_by_name_nodev(blob, node, "cd-gpios", 0, &host->cd_gpio,
-                                  GPIOD_IS_IN);
+       gpio_request_by_name_nodev(offset_to_ofnode(node), "pwr-gpios", 0,
+                                  &host->pwr_gpio, GPIOD_IS_OUT);
+       gpio_request_by_name_nodev(offset_to_ofnode(node), "cd-gpios", 0,
+                                  &host->cd_gpio, GPIOD_IS_IN);
 
        return 0;
 }
diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c
index c4e2cd7f55..8bc3828854 100644
--- a/drivers/mtd/nand/sunxi_nand.c
+++ b/drivers/mtd/nand/sunxi_nand.c
@@ -1663,7 +1663,7 @@ static int sunxi_nand_chip_init(int node, struct 
sunxi_nfc *nfc, int devnum)
                        chip->sels[i].rb.type = RB_NATIVE;
                        chip->sels[i].rb.info.nativeid = tmp;
                } else {
-                       ret = gpio_request_by_name_nodev(blob, node,
+                       ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
                                                "rb-gpios", i,
                                                &chip->sels[i].rb.info.gpio,
                                                GPIOD_IS_IN);
diff --git a/drivers/mtd/nand/tegra_nand.c b/drivers/mtd/nand/tegra_nand.c
index 5c9b485b08..c03c9cb178 100644
--- a/drivers/mtd/nand/tegra_nand.c
+++ b/drivers/mtd/nand/tegra_nand.c
@@ -894,8 +894,8 @@ static int fdt_decode_nand(const void *blob, int node, 
struct fdt_nand *config)
        config->reg = (struct nand_ctlr *)fdtdec_get_addr(blob, node, "reg");
        config->enabled = fdtdec_get_is_enabled(blob, node);
        config->width = fdtdec_get_int(blob, node, "nvidia,nand-width", 8);
-       err = gpio_request_by_name_nodev(blob, node, "nvidia,wp-gpios", 0,
-                                &config->wp_gpio, GPIOD_IS_OUT);
+       err = gpio_request_by_name_nodev(offset_to_ofnode(node),
+                       "nvidia,wp-gpios", 0, &config->wp_gpio, GPIOD_IS_OUT);
        if (err)
                return err;
        err = fdtdec_get_int_array(blob, node, "nvidia,timing",
diff --git a/drivers/net/pic32_eth.c b/drivers/net/pic32_eth.c
index 385aad5b7e..0b89911f04 100644
--- a/drivers/net/pic32_eth.c
+++ b/drivers/net/pic32_eth.c
@@ -561,8 +561,7 @@ static int pic32_eth_probe(struct udevice *dev)
                phy_addr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
 
        /* phy reset gpio */
-       gpio_request_by_name_nodev(gd->fdt_blob, dev_of_offset(dev),
-                                  "reset-gpios", 0,
+       gpio_request_by_name_nodev(dev_ofnode(dev), "reset-gpios", 0,
                                   &priv->rst_gpio, GPIOD_IS_OUT);
 
        priv->phyif     = pdata->phy_interface;
diff --git a/drivers/sound/max98095.c b/drivers/sound/max98095.c
index 35829f88c9..7c37bd0701 100644
--- a/drivers/sound/max98095.c
+++ b/drivers/sound/max98095.c
@@ -9,6 +9,8 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
+#include <common.h>
 #include <asm/arch/clk.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/power.h>
diff --git a/drivers/sound/wm8994.c b/drivers/sound/wm8994.c
index d378442c50..b8208cdc87 100644
--- a/drivers/sound/wm8994.c
+++ b/drivers/sound/wm8994.c
@@ -4,11 +4,11 @@
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
+#include <common.h>
 #include <asm/arch/clk.h>
 #include <asm/arch/cpu.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
-#include <common.h>
 #include <div64.h>
 #include <fdtdec.h>
 #include <i2c.h>
diff --git a/drivers/spi/pic32_spi.c b/drivers/spi/pic32_spi.c
index 78d78bc54b..15266b048c 100644
--- a/drivers/spi/pic32_spi.c
+++ b/drivers/spi/pic32_spi.c
@@ -414,7 +414,7 @@ static int pic32_spi_probe(struct udevice *bus)
         * of the ongoing transfer. To avoid this sort of error we will drive
         * /CS manually by toggling cs-gpio pins.
         */
-       ret = gpio_request_by_name_nodev(gd->fdt_blob, node, "cs-gpios", 0,
+       ret = gpio_request_by_name_nodev(offset_to_ofnode(node), "cs-gpios", 0,
                                         &priv->cs_gpio, GPIOD_IS_OUT);
        if (ret) {
                printf("pic32-spi: error, cs-gpios not found\n");
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index da9e9440b7..7dc37f045d 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -728,9 +728,10 @@ static int fdt_decode_usb(struct udevice *dev, struct 
fdt_usb *config)
                debug("%s: Missing/invalid peripheral ID\n", __func__);
                return -EINVAL;
        }
-       gpio_request_by_name_nodev(blob, node, "nvidia,vbus-gpio", 0,
-                                  &config->vbus_gpio, GPIOD_IS_OUT);
-       gpio_request_by_name_nodev(blob, node, "nvidia,phy-reset-gpio", 0,
+       gpio_request_by_name_nodev(offset_to_ofnode(node), "nvidia,vbus-gpio",
+                                  0, &config->vbus_gpio, GPIOD_IS_OUT);
+       gpio_request_by_name_nodev(offset_to_ofnode(node),
+                                  "nvidia,phy-reset-gpio", 0,
                                   &config->phy_reset_gpio, GPIOD_IS_OUT);
        debug("enabled=%d, legacy_mode=%d, utmi=%d, ulpi=%d, periph_id=%d, "
                "vbus=%d, phy_reset=%d, dr_mode=%d\n",
diff --git a/drivers/usb/host/ehci-vf.c b/drivers/usb/host/ehci-vf.c
index e52cd6ad32..a7f6f21fa2 100644
--- a/drivers/usb/host/ehci-vf.c
+++ b/drivers/usb/host/ehci-vf.c
@@ -252,8 +252,9 @@ static int vf_usb_ofdata_to_platdata(struct udevice *dev)
        }
 
        if (priv->dr_mode == DR_MODE_OTG) {
-               gpio_request_by_name_nodev(dt_blob, node, "fsl,cdet-gpio", 0,
-                                          &priv->cdet_gpio, GPIOD_IS_IN);
+               gpio_request_by_name_nodev(offset_to_ofnode(node),
+                                          "fsl,cdet-gpio", 0, &priv->cdet_gpio,
+                                          GPIOD_IS_IN);
                if (dm_gpio_is_valid(&priv->cdet_gpio)) {
                        if (dm_gpio_get_value(&priv->cdet_gpio))
                                priv->init_type = USB_INIT_DEVICE;
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index d78491dfc2..bf230c15ba 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -7,6 +7,8 @@
 #ifndef _ASM_GENERIC_GPIO_H_
 #define _ASM_GENERIC_GPIO_H_
 
+#include <dm/ofnode.h>
+
 struct ofnode_phandle_args;
 
 /*
@@ -488,9 +490,8 @@ int gpio_get_list_count(struct udevice *dev, const char 
*list_name);
  * This is a version of gpio_request_list_by_name() that does not use a
  * device. Avoid it unless the caller is not yet using driver model
  */
-int gpio_request_by_name_nodev(const void *blob, int node,
-                              const char *list_name,
-                              int index, struct gpio_desc *desc, int flags);
+int gpio_request_by_name_nodev(ofnode node, const char *list_name, int index,
+                              struct gpio_desc *desc, int flags);
 
 /**
  * gpio_request_list_by_name_nodev() - request GPIOs without a device
@@ -498,8 +499,7 @@ int gpio_request_by_name_nodev(const void *blob, int node,
  * This is a version of gpio_request_list_by_name() that does not use a
  * device. Avoid it unless the caller is not yet using driver model
  */
-int gpio_request_list_by_name_nodev(const void *blob, int node,
-                                   const char *list_name,
+int gpio_request_list_by_name_nodev(ofnode node, const char *list_name,
                                    struct gpio_desc *desc_list, int max_count,
                                    int flags);
 
-- 
2.13.0.303.g4ebf302169-goog

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to