[U-Boot] [PATCH v3 17/72] dm: core: Update device_bind_driver_to_node() to use ofnode

Simon Glass sjg at chromium.org
Fri May 19 02:09:07 UTC 2017


Adjust this function to us an ofnode instead of an offset, so it can be
used with livetree. This involves updating all callers.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

Changes in v3: None
Changes in v2: None

 drivers/clk/at91/pmc.c             |  2 +-
 drivers/core/lists.c               | 15 ++++++---------
 drivers/cpu/cpu-uclass.c           |  6 +++---
 drivers/i2c/muxes/i2c-mux-uclass.c | 11 ++++-------
 drivers/led/led_bcm6328.c          |  2 +-
 drivers/led/led_bcm6358.c          |  2 +-
 drivers/led/led_gpio.c             | 13 +++++--------
 drivers/misc/tegra186_bpmp.c       |  6 +++---
 drivers/misc/tegra_car.c           |  4 ++--
 drivers/net/keystone_net.c         |  6 +++---
 drivers/pinctrl/pinctrl-uclass.c   | 15 ++++++---------
 drivers/usb/musb-new/ti-musb.c     |  2 +-
 include/dm.h                       |  2 ++
 include/dm/lists.h                 |  2 +-
 14 files changed, 39 insertions(+), 49 deletions(-)

diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
index c552c75562..f4ec5fcb5e 100644
--- a/drivers/clk/at91/pmc.c
+++ b/drivers/clk/at91/pmc.c
@@ -79,7 +79,7 @@ int at91_clk_sub_device_bind(struct udevice *dev, const char *drv_name)
 		if (!name)
 			return -EINVAL;
 		ret = device_bind_driver_to_node(dev, drv_name, name,
-						 offset, NULL);
+					offset_to_ofnode(offset), NULL);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/core/lists.c b/drivers/core/lists.c
index facf276474..b79f26dbe6 100644
--- a/drivers/core/lists.c
+++ b/drivers/core/lists.c
@@ -74,11 +74,12 @@ int lists_bind_drivers(struct udevice *parent, bool pre_reloc_only)
 int device_bind_driver(struct udevice *parent, const char *drv_name,
 		       const char *dev_name, struct udevice **devp)
 {
-	return device_bind_driver_to_node(parent, drv_name, dev_name, -1, devp);
+	return device_bind_driver_to_node(parent, drv_name, dev_name,
+					  ofnode_null(), devp);
 }
 
 int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
-			       const char *dev_name, int node,
+			       const char *dev_name, ofnode node,
 			       struct udevice **devp)
 {
 	struct driver *drv;
@@ -89,14 +90,10 @@ int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
 		debug("Cannot find driver '%s'\n", drv_name);
 		return -ENOENT;
 	}
-	ret = device_bind(parent, drv, dev_name, NULL, node, devp);
-	if (ret) {
-		debug("Cannot create device named '%s' (err=%d)\n",
-		      dev_name, ret);
-		return ret;
-	}
+	ret = device_bind_with_driver_data(parent, drv, dev_name, 0 /* data */,
+					   node, devp);
 
-	return 0;
+	return ret;
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
diff --git a/drivers/cpu/cpu-uclass.c b/drivers/cpu/cpu-uclass.c
index c57ac16b3a..73e4853939 100644
--- a/drivers/cpu/cpu-uclass.c
+++ b/drivers/cpu/cpu-uclass.c
@@ -63,11 +63,11 @@ U_BOOT_DRIVER(cpu_bus) = {
 static int uclass_cpu_init(struct uclass *uc)
 {
 	struct udevice *dev;
-	int node;
+	ofnode node;
 	int ret;
 
-	node = fdt_path_offset(gd->fdt_blob, "/cpus");
-	if (node < 0)
+	node = ofnode_path("/cpus");
+	if (!ofnode_valid(node))
 		return 0;
 
 	ret = device_bind_driver_to_node(dm_root(), "cpu_bus", "cpus", node,
diff --git a/drivers/i2c/muxes/i2c-mux-uclass.c b/drivers/i2c/muxes/i2c-mux-uclass.c
index d243b8e32d..187e8a7c91 100644
--- a/drivers/i2c/muxes/i2c-mux-uclass.c
+++ b/drivers/i2c/muxes/i2c-mux-uclass.c
@@ -51,24 +51,21 @@ static int i2c_mux_child_post_bind(struct udevice *dev)
 /* Find the I2C buses selected by this mux */
 static int i2c_mux_post_bind(struct udevice *mux)
 {
-	const void *blob = gd->fdt_blob;
+	ofnode node;
 	int ret;
-	int offset;
 
 	debug("%s: %s\n", __func__, mux->name);
 	/*
 	 * There is no compatible string in the sub-nodes, so we must manually
 	 * bind these
 	 */
-	for (offset = fdt_first_subnode(blob, dev_of_offset(mux));
-	     offset > 0;
-	     offset = fdt_next_subnode(blob, offset)) {
+	dev_for_each_subnode(node, mux) {
 		struct udevice *dev;
 		const char *name;
 
-		name = fdt_get_name(blob, offset, NULL);
+		name = ofnode_get_name(node);
 		ret = device_bind_driver_to_node(mux, "i2c_mux_bus_drv", name,
-						 offset, &dev);
+						 node, &dev);
 		debug("   - bind ret=%d, %s\n", ret, dev ? dev->name : NULL);
 		if (ret)
 			return ret;
diff --git a/drivers/led/led_bcm6328.c b/drivers/led/led_bcm6328.c
index fa7c6d16d5..5d545c5096 100644
--- a/drivers/led/led_bcm6328.c
+++ b/drivers/led/led_bcm6328.c
@@ -236,7 +236,7 @@ static int bcm6328_led_bind(struct udevice *parent)
 
 		ret = device_bind_driver_to_node(parent, "bcm6328-led",
 						 fdt_get_name(blob, node, NULL),
-						 node, &dev);
+						 offset_to_ofnode(node), &dev);
 		if (ret)
 			return ret;
 
diff --git a/drivers/led/led_bcm6358.c b/drivers/led/led_bcm6358.c
index a9a194b0e1..e8a3b64e68 100644
--- a/drivers/led/led_bcm6358.c
+++ b/drivers/led/led_bcm6358.c
@@ -201,7 +201,7 @@ static int bcm6358_led_bind(struct udevice *parent)
 
 		ret = device_bind_driver_to_node(parent, "bcm6358-led",
 						 fdt_get_name(blob, node, NULL),
-						 node, &dev);
+						 offset_to_ofnode(node), &dev);
 		if (ret)
 			return ret;
 
diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index 4106ecb679..9976635887 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -85,25 +85,22 @@ static int led_gpio_remove(struct udevice *dev)
 
 static int led_gpio_bind(struct udevice *parent)
 {
-	const void *blob = gd->fdt_blob;
 	struct udevice *dev;
-	int node;
+	ofnode node;
 	int ret;
 
-	for (node = fdt_first_subnode(blob, dev_of_offset(parent));
-	     node > 0;
-	     node = fdt_next_subnode(blob, node)) {
+	dev_for_each_subnode(node, parent) {
 		struct led_uc_plat *uc_plat;
 		const char *label;
 
-		label = fdt_getprop(blob, node, "label", NULL);
+		label = ofnode_read_string(node, "label");
 		if (!label) {
 			debug("%s: node %s has no label\n", __func__,
-			      fdt_get_name(blob, node, NULL));
+			      ofnode_get_name(node));
 			return -EINVAL;
 		}
 		ret = device_bind_driver_to_node(parent, "gpio_led",
-						 fdt_get_name(blob, node, NULL),
+						 ofnode_get_name(node),
 						 node, &dev);
 		if (ret)
 			return ret;
diff --git a/drivers/misc/tegra186_bpmp.c b/drivers/misc/tegra186_bpmp.c
index bd8b9602e0..d61bacfc44 100644
--- a/drivers/misc/tegra186_bpmp.c
+++ b/drivers/misc/tegra186_bpmp.c
@@ -112,19 +112,19 @@ static int tegra186_bpmp_bind(struct udevice *dev)
 	debug("%s(dev=%p)\n", __func__, dev);
 
 	ret = device_bind_driver_to_node(dev, "tegra186_clk", "tegra186_clk",
-					 dev_of_offset(dev), &child);
+					 dev_ofnode(dev), &child);
 	if (ret)
 		return ret;
 
 	ret = device_bind_driver_to_node(dev, "tegra186_reset",
-					 "tegra186_reset", dev_of_offset(dev),
+					 "tegra186_reset", dev_ofnode(dev),
 					 &child);
 	if (ret)
 		return ret;
 
 	ret = device_bind_driver_to_node(dev, "tegra186_power_domain",
 					 "tegra186_power_domain",
-					 dev_of_offset(dev), &child);
+					 dev_ofnode(dev), &child);
 	if (ret)
 		return ret;
 
diff --git a/drivers/misc/tegra_car.c b/drivers/misc/tegra_car.c
index 5db3c374ce..93639e1989 100644
--- a/drivers/misc/tegra_car.c
+++ b/drivers/misc/tegra_car.c
@@ -22,12 +22,12 @@ static int tegra_car_bpmp_bind(struct udevice *dev)
 	debug("%s(dev=%p)\n", __func__, dev);
 
 	ret = device_bind_driver_to_node(dev, "tegra_car_clk", "tegra_car_clk",
-					 dev_of_offset(dev), &child);
+					 dev_ofnode(dev), &child);
 	if (ret)
 		return ret;
 
 	ret = device_bind_driver_to_node(dev, "tegra_car_reset",
-					 "tegra_car_reset", dev_of_offset(dev),
+					 "tegra_car_reset", dev_ofnode(dev),
 					 &child);
 	if (ret)
 		return ret;
diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c
index f9ffd6d725..72ef42cca8 100644
--- a/drivers/net/keystone_net.c
+++ b/drivers/net/keystone_net.c
@@ -1008,8 +1008,8 @@ static int ks2_eth_bind_slaves(struct udevice *dev, int gbe, int *gbe_0)
 			slave_name = malloc(20);
 			snprintf(slave_name, 20, "netcp at slave-%d", slave_no);
 			ret = device_bind_driver_to_node(dev, "eth_ks2_sl",
-							 slave_name, slave,
-							 &sl_dev);
+					slave_name, offset_to_ofnode(slave),
+					&sl_dev);
 			if (ret) {
 				error("ks2_net - not able to bind slave interfaces\n");
 				return ret;
@@ -1029,7 +1029,7 @@ static int ks2_eth_bind_slaves(struct udevice *dev, int gbe, int *gbe_0)
 		slave_name = malloc(20);
 		snprintf(slave_name, 20, "netcp at slave-%d", slave_no);
 		ret = device_bind_driver_to_node(dev, "eth_ks2_sl", slave_name,
-						 slave, &sl_dev);
+					offset_to_ofnode(slave), &sl_dev);
 		if (ret) {
 			error("ks2_net - not able to bind slave interfaces\n");
 			return ret;
diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c
index 0633b69bbe..02e269020d 100644
--- a/drivers/pinctrl/pinctrl-uclass.c
+++ b/drivers/pinctrl/pinctrl-uclass.c
@@ -121,34 +121,31 @@ static int pinctrl_select_state_full(struct udevice *dev, const char *statename)
  */
 static int pinconfig_post_bind(struct udevice *dev)
 {
-	const void *fdt = gd->fdt_blob;
-	int offset = dev_of_offset(dev);
 	bool pre_reloc_only = !(gd->flags & GD_FLG_RELOC);
 	const char *name;
+	ofnode node;
 	int ret;
 
-	for (offset = fdt_first_subnode(fdt, offset);
-	     offset > 0;
-	     offset = fdt_next_subnode(fdt, offset)) {
+	dev_for_each_subnode(node, dev) {
 		if (pre_reloc_only &&
-		    !dm_fdt_pre_reloc(fdt, offset))
+		    !ofnode_pre_reloc(node))
 			continue;
 		/*
 		 * If this node has "compatible" property, this is not
 		 * a pin configuration node, but a normal device. skip.
 		 */
-		fdt_get_property(fdt, offset, "compatible", &ret);
+		ofnode_read_prop(node, "compatible", &ret);
 		if (ret >= 0)
 			continue;
 
 		if (ret != -FDT_ERR_NOTFOUND)
 			return ret;
 
-		name = fdt_get_name(fdt, offset, NULL);
+		name = ofnode_get_name(node);
 		if (!name)
 			return -EINVAL;
 		ret = device_bind_driver_to_node(dev, "pinconfig", name,
-						 offset, NULL);
+						 node, NULL);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/usb/musb-new/ti-musb.c b/drivers/usb/musb-new/ti-musb.c
index 27018c73b6..de101319cd 100644
--- a/drivers/usb/musb-new/ti-musb.c
+++ b/drivers/usb/musb-new/ti-musb.c
@@ -227,7 +227,7 @@ static int ti_musb_wrapper_bind(struct udevice *parent)
 		case USB_DR_MODE_HOST:
 			/* Bind MUSB host */
 			ret = device_bind_driver_to_node(parent, "ti-musb-host",
-							 name, node, &dev);
+					name, offset_to_ofnode(node), &dev);
 			if (ret) {
 				error("musb - not able to bind usb host node\n");
 				return ret;
diff --git a/include/dm.h b/include/dm.h
index e634814d74..f752792c92 100644
--- a/include/dm.h
+++ b/include/dm.h
@@ -10,6 +10,8 @@
 #include <dm/ofnode.h>
 #include <dm/device.h>
 #include <dm/fdtaddr.h>
+#include <dm/ofnode.h>
+#include <dm/read.h>
 #include <dm/platdata.h>
 #include <dm/uclass.h>
 
diff --git a/include/dm/lists.h b/include/dm/lists.h
index f55c41991b..d4d82d2fc4 100644
--- a/include/dm/lists.h
+++ b/include/dm/lists.h
@@ -85,7 +85,7 @@ int device_bind_driver(struct udevice *parent, const char *drv_name,
  * @devp:	If non-NULL, returns the newly bound device
  */
 int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
-			       const char *dev_name, int node,
+			       const char *dev_name, ofnode node,
 			       struct udevice **devp);
 
 #endif
-- 
2.13.0.303.g4ebf302169-goog



More information about the U-Boot mailing list