Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934415AbcJXKFe (ORCPT ); Mon, 24 Oct 2016 06:05:34 -0400 Received: from mail-lf0-f47.google.com ([209.85.215.47]:35524 "EHLO mail-lf0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750839AbcJXKFd (ORCPT ); Mon, 24 Oct 2016 06:05:33 -0400 Date: Mon, 24 Oct 2016 11:08:05 +0100 From: Lee Jones To: Valentin Longchamp Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH] MFD: do not assign already already assigned compatible of_nodes Message-ID: <20161024100805.GH14477@dell> References: <1474285670-17078-1-git-send-email-valentin.longchamp@keymile.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1474285670-17078-1-git-send-email-valentin.longchamp@keymile.com> User-Agent: Mutt/1.6.2 (2016-07-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2331 Lines: 79 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 > --- > 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