On Mon, Oct 24, 2011 at 04:56:31PM +0200, Grant Likely wrote:On Mon, Oct 24, 2011 at 10:51:40PM +0800, Shawn Guo wrote:On Mon, Oct 24, 2011 at 03:59:50PM +0200, Grant Likely wrote:On Mon, Oct 24, 2011 at 09:40:26PM +0800, Shawn Guo wrote:The dev->parent->of_node is meant to point to node 'pmic: mc13892@0'.diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 8fe132d..29dcf90 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2673,7 +2673,8 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
BLOCKING_INIT_NOTIFIER_HEAD(&rdev->notifier);
/* find device_node and attach it */
- rdev->dev.of_node = of_find_node_by_name(NULL, regulator_desc->name);
+ rdev->dev.of_node = of_find_node_by_name(dev->parent->of_node,
+ regulator_desc->name);
of_find_node_by_name() doesn't work that way. The first argument is a
starting point, but it doesn't restrict the search to children of a
node.
for_each_child_of_node() is what you want to use when iterating over
the children which unfortunately changes the structure of this
function.
And the intention here is not to iterate over the children, but to
start a search from a reasonable point rather than the top root node.
It is always better to attach the of_node at struct device
registration time instead of searching the tree in common code. The
of_node should already be assigned by the time regulator_register() is
called.
That's the problem we have. There is no 'struct dev' to attach of_node
for each regulator by the time regulator_register() is called, because
the 'struct dev' for each regulator is created inside
regulator_register() as wrapped by 'struct regulator_dev'.