Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Feb 2018 14:00:23 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r330019 - head/sys/dev/ofw
Message-ID:  <201802261400.w1QE0N5s062680@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Mon Feb 26 14:00:23 2018
New Revision: 330019
URL: https://svnweb.freebsd.org/changeset/base/330019

Log:
  ofw_fdt: Simplify parts with new libfdt methods
  
  libfdt now provides methods to iterate through subnodes and properties in a
  convenient fashion.
  
  Replace our ofw_fdt_{peer,child} searches with calls to their corresponding
  libfdt methods. Rework ofw_fdt_nextprop to use the
  fdt_for_each_property_offset macro, making it even more obvious what it's
  doing.
  
  No functional change intended.
  
  Reviewed by:	nwhitehorn
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D14225

Modified:
  head/sys/dev/ofw/ofw_fdt.c

Modified: head/sys/dev/ofw/ofw_fdt.c
==============================================================================
--- head/sys/dev/ofw/ofw_fdt.c	Mon Feb 26 13:12:51 2018	(r330018)
+++ head/sys/dev/ofw/ofw_fdt.c	Mon Feb 26 14:00:23 2018	(r330019)
@@ -174,7 +174,7 @@ fdt_phandle_offset(phandle_t p)
 static phandle_t
 ofw_fdt_peer(ofw_t ofw, phandle_t node)
 {
-	int depth, offset;
+	int offset;
 
 	if (node == 0) {
 		/* Find root node */
@@ -186,39 +186,21 @@ ofw_fdt_peer(ofw_t ofw, phandle_t node)
 	offset = fdt_phandle_offset(node);
 	if (offset < 0)
 		return (0);
-
-	for (depth = 1, offset = fdt_next_node(fdtp, offset, &depth);
-	    offset >= 0;
-	    offset = fdt_next_node(fdtp, offset, &depth)) {
-		if (depth < 0)
-			return (0);
-		if (depth == 1)
-			return (fdt_offset_phandle(offset));
-	}
-
-	return (0);
+	offset = fdt_next_subnode(fdtp, offset);
+	return (fdt_offset_phandle(offset));
 }
 
 /* Return the first child of this node or 0. */
 static phandle_t
 ofw_fdt_child(ofw_t ofw, phandle_t node)
 {
-	int depth, offset;
+	int offset;
 
 	offset = fdt_phandle_offset(node);
 	if (offset < 0)
 		return (0);
-
-	for (depth = 0, offset = fdt_next_node(fdtp, offset, &depth);
-	    (offset >= 0) && (depth > 0);
-	    offset = fdt_next_node(fdtp, offset, &depth)) {
-		if (depth < 0)
-			return (0);
-		if (depth == 1)
-			return (fdt_offset_phandle(offset));
-	}
-
-	return (0);
+	offset = fdt_first_subnode(fdtp, offset);
+	return (fdt_offset_phandle(offset));
 }
 
 /* Return the parent of this node or 0. */
@@ -341,26 +323,24 @@ ofw_fdt_nextprop(ofw_t ofw, phandle_t package, const c
 	if (offset < 0)
 		return (-1);
 
-	/* Find the first prop in the node */
-	offset = fdt_first_property_offset(fdtp, offset);
-	if (offset < 0)
-		return (0); /* No properties */
-
-	if (previous != NULL) {
-		while (offset >= 0) {
+	if (previous == NULL)
+		/* Find the first prop in the node */
+		offset = fdt_first_property_offset(fdtp, offset);
+	else {
+		fdt_for_each_property_offset(offset, fdtp, offset) {
 			prop = fdt_getprop_by_offset(fdtp, offset, &name, NULL);
 			if (prop == NULL)
 				return (-1); /* Internal error */
-
+			/* Skip until we find 'previous', then bail out */
+			if (strcmp(name, previous) != 0)
+				continue;
 			offset = fdt_next_property_offset(fdtp, offset);
-			if (offset < 0)
-				return (0); /* No more properties */
-
-			/* Check if the last one was the one we wanted */
-			if (strcmp(name, previous) == 0)
-				break;
+			break;
 		}
 	}
+
+	if (offset < 0)
+		return (0); /* No properties */
 
 	prop = fdt_getprop_by_offset(fdtp, offset, &name, &offset);
 	if (prop == NULL)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802261400.w1QE0N5s062680>