diff options
author | Pantelis Antoniou <panto@antoniou-consulting.com> | 2013-12-13 20:08:59 +0200 |
---|---|---|
committer | Grant Likely <grant.likely@linaro.org> | 2014-03-19 14:58:40 +0000 |
commit | 0829f6d1f69e4f2fae4062987ae6531a9af1a2e3 (patch) | |
tree | 4081a4bee4a9e193b4de690735b5a3782d100eac /drivers/of/pdt.c | |
parent | 8357041a69b368991d1b04d9f1d297f8d71e1314 (diff) | |
download | op-kernel-dev-0829f6d1f69e4f2fae4062987ae6531a9af1a2e3.zip op-kernel-dev-0829f6d1f69e4f2fae4062987ae6531a9af1a2e3.tar.gz |
of: device_node kobject lifecycle fixes
After the move to having device nodes be proper kobjects the lifecycle
of the node needs to be controlled better.
At first convert of_add_node() in the unflattened functions to
of_init_node() which initializes the kobject so that of_node_get/put
work correctly even before of_init is called.
Afterwards introduce of_node_is_initialized & of_node_is_attached that
query the underlying kobject about the state (attached means kobj
is visible in sysfs)
Using that make sure the lifecycle of the tree is correct at all
times.
Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
[grant.likely: moved of_node_init() calls, fixed up locking, and
dropped __of_populate() hunks]
Signed-off-by: Grant Likely <grant.likely@linaro.org>
Diffstat (limited to 'drivers/of/pdt.c')
-rw-r--r-- | drivers/of/pdt.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c index e64fa3d..36b4035 100644 --- a/drivers/of/pdt.c +++ b/drivers/of/pdt.c @@ -176,6 +176,7 @@ static struct device_node * __init of_pdt_create_node(phandle node, return NULL; dp = prom_early_alloc(sizeof(*dp)); + of_node_init(dp); of_pdt_incr_unique_id(dp); dp->parent = parent; @@ -213,7 +214,6 @@ static struct device_node * __init of_pdt_build_tree(struct device_node *parent, *nextp = &dp->allnext; dp->full_name = of_pdt_build_full_name(dp); - of_node_add(dp); dp->child = of_pdt_build_tree(dp, of_pdt_prom_ops->getchild(node), nextp); @@ -244,7 +244,6 @@ void __init of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops) of_allnodes->path_component_name = ""; #endif of_allnodes->full_name = "/"; - of_node_add(of_allnodes); nextp = &of_allnodes->allnext; of_allnodes->child = of_pdt_build_tree(of_allnodes, |