linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 01/16] Add of_get_next_parent()
@ 2007-10-26  6:54 Michael Ellerman
  2007-10-26  6:54 ` [PATCH 02/16] Use of_get_next_parent() in pci_dma_bus_setup_pSeries() Michael Ellerman
                   ` (15 more replies)
  0 siblings, 16 replies; 21+ messages in thread
From: Michael Ellerman @ 2007-10-26  6:54 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: davem

Iterating through a device node's parents is simple enough, but dealing
with the refcounts properly is a little ugly, and replicating that logic
is asking for someone to get it wrong or forget it all together, eg:

while (dn != NULL) {
	/* loop body */
	tmp = of_get_parent(dn);
	of_node_put(dn);
	dn = tmp;
}

So add of_get_next_parent(), inspired by of_get_next_child(). The contract
is that it returns the parent and drops the reference on the current node,
this makes the loop look like:

while (dn != NULL) {
	/* loop body */
	dn = of_get_next_parent(dn);
}

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 drivers/of/base.c  |   25 +++++++++++++++++++++++++
 include/linux/of.h |    1 +
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 9377f3b..e0db2b5 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -138,6 +138,31 @@ struct device_node *of_get_parent(const struct device_node *node)
 EXPORT_SYMBOL(of_get_parent);
 
 /**
+ *	of_get_next_parent - Iterate to a node's parent
+ *	@node:	Node to get parent of
+ *
+ * 	This is like of_get_parent() except that it drops the
+ * 	refcount on the passed node, making it suitable for iterating
+ * 	through a node's parents.
+ *
+ *	Returns a node pointer with refcount incremented, use
+ *	of_node_put() on it when done.
+ */
+struct device_node *of_get_next_parent(struct device_node *node)
+{
+	struct device_node *parent;
+
+	if (!node)
+		return NULL;
+
+	read_lock(&devtree_lock);
+	parent = of_node_get(node->parent);
+	of_node_put(node);
+	read_unlock(&devtree_lock);
+	return parent;
+}
+
+/**
  *	of_get_next_child - Iterate a node childs
  *	@node:	parent node
  *	@prev:	previous child of the parent node, or NULL to get first
diff --git a/include/linux/of.h b/include/linux/of.h
index 5c39b92..3557d1e 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -44,6 +44,7 @@ extern struct device_node *of_find_compatible_node(struct device_node *from,
 extern struct device_node *of_find_node_by_path(const char *path);
 extern struct device_node *of_find_node_by_phandle(phandle handle);
 extern struct device_node *of_get_parent(const struct device_node *node);
+extern struct device_node *of_get_next_parent(struct device_node *node);
 extern struct device_node *of_get_next_child(const struct device_node *node,
 					     struct device_node *prev);
 extern struct property *of_find_property(const struct device_node *np,
-- 
1.5.2.rc1.1884.g59b20

^ permalink raw reply related	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2007-11-05 19:23 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-26  6:54 [PATCH 01/16] Add of_get_next_parent() Michael Ellerman
2007-10-26  6:54 ` [PATCH 02/16] Use of_get_next_parent() in pci_dma_bus_setup_pSeries() Michael Ellerman
2007-10-26  6:54 ` [PATCH 03/16] Use of_get_next_parent() in pci_dma_bus_setup_pSeriesLP() Michael Ellerman
2007-10-26  6:54 ` [PATCH 04/16] Use of_get_next_parent() in pci_dma_dev_setup_pSeries() Michael Ellerman
2007-10-26  6:54 ` [PATCH 05/16] Use of_get_next_parent() in pci_dma_dev_setup_pSeriesLP() Michael Ellerman
2007-10-26  6:54 ` [PATCH 06/16] Use of_get_next_child() in pci_dma_bus_setup_pSeries() Michael Ellerman
2007-10-26  6:54 ` [PATCH 07/16] Use of_get_next_parent() in xics_setup_8259_cascade() Michael Ellerman
2007-10-26  6:54 ` [PATCH 08/16] Use of_get_next_parent() in pseries_mpic_init_IRQ() Michael Ellerman
2007-10-26  6:54 ` [PATCH 09/16] Use of_get_next_parent() in axon_msi.c Michael Ellerman
2007-10-26  7:24   ` Stephen Rothwell
2007-10-26  6:54 ` [PATCH 10/16] Use of_get_next_child() in EEH gather_pci_data() Michael Ellerman
2007-10-26  6:54 ` [PATCH 11/16] Use of_get_next_child() in eeh_restore_bars() Michael Ellerman
2007-10-26  7:29   ` Stephen Rothwell
2007-10-29  3:46     ` Michael Ellerman
2007-11-05 19:23       ` Linas Vepstas
2007-10-26  6:54 ` [PATCH 12/16] Use of_get_next_child() in eeh_add_device_tree_early() Michael Ellerman
2007-10-26  6:54 ` [PATCH 13/16] Use of_get_next_child() in __eeh_mark_slot() Michael Ellerman
2007-10-26  6:54 ` [PATCH 14/16] Use of_get_next_child() in __eeh_clear_slot() Michael Ellerman
2007-10-26  6:54 ` [PATCH 15/16] Use of_get_next_child() in eeh_reset_device() Michael Ellerman
2007-10-26  6:54 ` [PATCH 16/16] Use of_get_next_child() in EEH print_device_node_tree() Michael Ellerman
2007-10-26 10:38 ` [PATCH 01/16] Add of_get_next_parent() David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).