Messages in this thread | | | Date | Mon, 24 Oct 2016 11:08:05 +0100 | From | Lee Jones <> | Subject | Re: [PATCH] MFD: do not assign already already assigned compatible of_nodes |
| |
On Mon, 19 Sep 2016, Valentin Longchamp wrote:
> If 2 similar cells have the same of_compatible (2 instances of the same > functionality), they both are assigned the first found of_node with this > compatible. In the below example, the pdev of both cells get the child@0 > of_node. > > parent@0 { /* MFD devices with 2 cells > reg = <0>; > child@0 { > reg = <0>; > compatible = "child-driver"; > }; > child@1 { > reg = <1>; > compatible = "child-driver"; > }; > }; > > To avoid this, the found of_nodes are checked to see if they are already > assigned in the children of the parent dev and are only assigned if > still "available" (not assigned to a child). > > This allows the 2nd cell's pdev to get the child@1 of_node. > > Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com> > --- > drivers/mfd/mfd-core.c | 19 +++++++++++++++++-- > 1 file changed, 17 insertions(+), 2 deletions(-) > > diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c > index 3ac486a..11c5ded 100644 > --- a/drivers/mfd/mfd-core.c > +++ b/drivers/mfd/mfd-core.c > @@ -137,6 +137,19 @@ static inline void mfd_acpi_add_device(const struct mfd_cell *cell, > } > #endif > > +static inline int is_my_of_node(struct device *dev, void *data)
Rename to mfd_check_node_callback().
> +{ > + struct device_node *np = data; > + > + return dev->of_node == np; > +} > + > +static inline int of_node_already_in_children(struct device *dev,
Rename to mfd_is_node_allocated_to_dev()
> + struct device_node *node) > +{ > + return device_for_each_child(dev, node, is_my_of_node); > +} > + > static int mfd_add_device(struct device *parent, int id, > const struct mfd_cell *cell, atomic_t *usage_count, > struct resource *mem_base, > @@ -178,8 +191,10 @@ static int mfd_add_device(struct device *parent, int id, > if (parent->of_node && cell->of_compatible) { > for_each_child_of_node(parent->of_node, np) { > if (of_device_is_compatible(np, cell->of_compatible)) { > - pdev->dev.of_node = np; > - break; > + if (!of_node_already_in_children(parent, np)) { > + pdev->dev.of_node = np; > + break; > + } > } > } > }
-- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
| |