dm: gpio: Add live tree support
authorSimon Glass <sjg@chromium.org>
Wed, 31 May 2017 03:47:09 +0000 (21:47 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 1 Jun 2017 13:03:10 +0000 (07:03 -0600)
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 <sjg@chromium.org>
Fixes to stm32f746-disco.c:
Signed-off-by: Tom Rini <trini@konsulko.com>
17 files changed:
board/qualcomm/dragonboard410c/dragonboard410c.c
board/samsung/common/board.c
board/samsung/common/exynos5-dt.c
board/st/stm32f746-disco/stm32f746-disco.c
drivers/gpio/gpio-uclass.c
drivers/i2c/mxc_i2c.c
drivers/mmc/fsl_esdhc.c
drivers/mmc/s5p_sdhci.c
drivers/mtd/nand/sunxi_nand.c
drivers/mtd/nand/tegra_nand.c
drivers/net/pic32_eth.c
drivers/sound/max98095.c
drivers/sound/wm8994.c
drivers/spi/pic32_spi.c
drivers/usb/host/ehci-tegra.c
drivers/usb/host/ehci-vf.c
include/asm-generic/gpio.h

index e923ddc2e27f755775aff85dc67f406409c49d31..37d0b85e0eacb7f6417d8b0b83965bbac8c89e3e 100644 (file)
@@ -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;
        }
index 17626966aa05796e2790d8dc232a5012f618097c..88299f17e37dde596b70c7302c32013bd0f0cf6a 100644 (file)
@@ -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)) {
                /*
index aec1f396b09c22035450406c9295d14d79d70cb2..44f412db5d82cdc36dc6c3c978a49993e4e4892c 100644 (file)
@@ -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)
index aeaa31146a5ad073e981fe21e338a9334abaabd4..7a6d93cb676a8a4c4eb62b29906024f7a37977d0 100644 (file)
@@ -101,7 +101,7 @@ int board_late_init(void)
        if (node < 0)
                return -1;
 
-       gpio_request_by_name_nodev(gd->fdt_blob, node, "led-gpio", 0, &gpio,
+       gpio_request_by_name_nodev(offset_to_ofnode(node), "led-gpio", 0, &gpio,
                                   GPIOD_IS_OUT);
 
        if (dm_gpio_is_valid(&gpio)) {
@@ -115,8 +115,8 @@ int board_late_init(void)
        if (node < 0)
                return -1;
 
-       gpio_request_by_name_nodev(gd->fdt_blob, node, "button-gpio", 0, &gpio,
-                                  GPIOD_IS_IN);
+       gpio_request_by_name_nodev(offset_to_ofnode(node), "button-gpio", 0,
+                                  &gpio, GPIOD_IS_IN);
 
        if (dm_gpio_is_valid(&gpio)) {
                if (dm_gpio_get_value(&gpio))
index 92a1346aa28b9fafb056a44e029ddb5f31a19144..f611996f1729b862450679cb730ccee20fad32d7 100644 (file)
@@ -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)
index 3258ae7ced4900f1606e90bffb449e59623e8120..110b9d6119255e9cbdfd0cc7ef4d1b510ad9688f 100644 (file)
@@ -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) {
index 3b3110f58b3bd666705515dd21b8fe72c2240195..5ee712f09baca87f6415dc8d24b23dbfada1cc82 100644 (file)
@@ -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;
index 640ea0261eb50e24c586de49d0928dffefec90fd..62817a0d07495a9833975b03fdd17c52339188b3 100644 (file)
@@ -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;
 }
index c4e2cd7f552766a42e471937313e1e6ee2ff4681..8bc3828854c1c92ca6b69e7a2ba4e3f532ba575d 100644 (file)
@@ -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);
index 5c9b485b082ace0b0aa9eeb02070869fdd630d3c..c03c9cb1789e19f3b7a9c081638610a8e8cde3a2 100644 (file)
@@ -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",
index 385aad5b7e1d735afdcecdcc5bec4570a6c73efa..0b89911f04a2b13c433bd5a626c1a0e6fc823a71 100644 (file)
@@ -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;
index 35829f88c9d99c132175c21f04b204d0f928cfba..7c37bd070156fab6b2fdc08988db436982e5bb94 100644 (file)
@@ -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>
index d378442c5035d2e9e53b23e622085eabcc55156c..b8208cdc87495e7c547831f4b6a11c3249f6fc32 100644 (file)
@@ -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>
index 78d78bc54bad97bf99aa544d12cd7d64bfe793d5..15266b048c7a349da5f04df769962b34a380dc9e 100644 (file)
@@ -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");
index da9e9440b7d4dc00f270707968a0c51e2eecf89b..7dc37f045d96ed599798195c1f03d26088e37bfe 100644 (file)
@@ -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",
index e52cd6ad32898e78c12ec6eaea92b081c7842159..a7f6f21fa2c9e0b3477f7d8b1c07dace16f0e3f2 100644 (file)
@@ -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;
index d78491dfc21e5d6fefc8c897a4b4e2ace60c2a36..bf230c15ba5f2b08d581c87d1a66b484267dcfb5 100644 (file)
@@ -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);