} else {
int ooffset = fdt_subnode_offset(ofnode_to_fdt(node),
ofnode_to_offset(node), subnode_name);
- subnode = offset_to_ofnode(ooffset);
+ subnode = noffset_to_ofnode(node, ooffset);
}
debug("%s\n", ofnode_valid(subnode) ?
ofnode_get_name(subnode) : "<none>");
if (ofnode_is_np(node))
return np_to_ofnode(node.np->child);
- return offset_to_ofnode(
+ return noffset_to_ofnode(node,
fdt_first_subnode(ofnode_to_fdt(node), ofnode_to_offset(node)));
}
if (ofnode_is_np(node))
return np_to_ofnode(node.np->sibling);
- return offset_to_ofnode(
+ return noffset_to_ofnode(node,
fdt_next_subnode(ofnode_to_fdt(node), ofnode_to_offset(node)));
}
#endif /* !DM_INLINE_OFNODE */
(struct device_node *)ofnode_to_np(from), NULL,
compat));
} else {
- return offset_to_ofnode(fdt_node_offset_by_compatible(
- ofnode_to_fdt(from),
+ return noffset_to_ofnode(from,
+ fdt_node_offset_by_compatible(ofnode_to_fdt(from),
ofnode_to_offset(from), compat));
}
}
(struct device_node *)ofnode_to_np(from), propname,
propval, proplen));
} else {
- return offset_to_ofnode(fdt_node_offset_by_prop_value(
- ofnode_to_fdt(from), ofnode_to_offset(from),
- propname, propval, proplen));
+ return noffset_to_ofnode(from,
+ fdt_node_offset_by_prop_value(ofnode_to_fdt(from),
+ ofnode_to_offset(from), propname, propval,
+ proplen));
}
}
}
if (offset < 0)
return -EINVAL;
- subnode = offset_to_ofnode(offset);
+ subnode = noffset_to_ofnode(node, offset);
}
*subnodep = subnode;
return (void *)gd->fdt_blob;
}
+/**
+ * ofnode_to_offset() - convert an ofnode to a flat DT offset
+ *
+ * This cannot be called if the reference contains a node pointer.
+ *
+ * @node: Reference containing offset (possibly invalid)
+ * Return: DT offset (can be -1)
+ */
+static inline int ofnode_to_offset(ofnode node)
+{
+#ifdef OF_CHECKS
+ if (of_live_active())
+ return -1;
+#endif
+ return node.of_offset;
+}
+
/**
* ofnode_to_np() - convert an ofnode to a live DT node pointer
*
}
/**
- * ofnode_to_offset() - convert an ofnode to a flat DT offset
+ * noffset_to_ofnode() - convert a DT offset to an ofnode
*
- * This cannot be called if the reference contains a node pointer.
- *
- * @node: Reference containing offset (possibly invalid)
- * Return: DT offset (can be -1)
+ * @other_node: Node in the same tree to use as a reference
+ * @of_offset: DT offset (either valid, or -1)
+ * Return: reference to the associated DT offset
*/
-static inline int ofnode_to_offset(ofnode node)
+static inline ofnode noffset_to_ofnode(ofnode other_node, int of_offset)
{
-#ifdef OF_CHECKS
+ ofnode node;
+
if (of_live_active())
- return -1;
-#endif
- return node.of_offset;
+ node.np = NULL;
+ else
+ node.of_offset = of_offset;
+
+ return node;
}
/**
* Find the next node after @from that has a @propname with a value
* @propval and a length @proplen.
*
- * @from: ofnode to start from (use ofnode_null() to start at the
- * beginning)
+ * @from: ofnode to start from. Use ofnode_null() to start at the
+ * beginning, or the return value from oftree_root() to start at the first
+ * child of the root
* @propname: property name to check
* @propval: property value to search for
* @proplen: length of the value in propval