Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-06 Thread Saravana Kannan
On Thu, Nov 5, 2020 at 11:51 PM Greg Kroah-Hartman
 wrote:
>
> On Thu, Nov 05, 2020 at 11:41:20PM -0800, Saravana Kannan wrote:
> > On Thu, Nov 5, 2020 at 11:22 PM Greg Kroah-Hartman
> >  wrote:
> > >
> > > On Thu, Nov 05, 2020 at 03:25:56PM -0800, Saravana Kannan wrote:
> > > > On Thu, Nov 5, 2020 at 1:41 AM Greg Kroah-Hartman
> > > >  wrote:
> > > > >
> > > > > On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> > > > > > The semantics of add_links() has changed from creating device link
> > > > > > between devices to creating fwnode links between fwnodes. So, 
> > > > > > update the
> > > > > > implementation of add_links() to match the new semantics.
> > > > > >
> > > > > > Signed-off-by: Saravana Kannan 
> > > > > > ---
> > > > > >  drivers/of/property.c | 150 
> > > > > > --
> > > > > >  1 file changed, 41 insertions(+), 109 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/of/property.c b/drivers/of/property.c
> > > > > > index 408a7b5f06a9..86303803f1b3 100644
> > > > > > --- a/drivers/of/property.c
> > > > > > +++ b/drivers/of/property.c
> > > > > > @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct 
> > > > > > device_node *test_ancestor,
> > > > > >  }
> > > > > >
> > > > > >  /**
> > > > > > - * of_get_next_parent_dev - Add device link to supplier from 
> > > > > > supplier phandle
> > > > > > - * @np: device tree node
> > > > > > - *
> > > > > > - * Given a device tree node (@np), this function finds its closest 
> > > > > > ancestor
> > > > > > - * device tree node that has a corresponding struct device.
> > > > > > - *
> > > > > > - * The caller of this function is expected to call put_device() on 
> > > > > > the returned
> > > > > > - * device when they are done.
> > > > > > - */
> > > > > > -static struct device *of_get_next_parent_dev(struct device_node 
> > > > > > *np)
> > > > > > -{
> > > > > > - struct device *dev = NULL;
> > > > > > -
> > > > > > - of_node_get(np);
> > > > > > - do {
> > > > > > - np = of_get_next_parent(np);
> > > > > > - if (np)
> > > > > > - dev = get_dev_from_fwnode(>fwnode);
> > > > > > - } while (np && !dev);
> > > > > > - of_node_put(np);
> > > > > > - return dev;
> > > > > > -}
> > > > > > -
> > > > > > -/**
> > > > > > - * of_link_to_phandle - Add device link to supplier from supplier 
> > > > > > phandle
> > > > > > - * @dev: consumer device
> > > > > > - * @sup_np: phandle to supplier device tree node
> > > > > > + * of_link_to_phandle - Add fwnode link to supplier from supplier 
> > > > > > phandle
> > > > > > + * @con_np: consumer device tree node
> > > > > > + * @sup_np: supplier device tree node
> > > > > >   *
> > > > > >   * Given a phandle to a supplier device tree node (@sup_np), this 
> > > > > > function
> > > > > >   * finds the device that owns the supplier device tree node and 
> > > > > > creates a
> > > > > > @@ -1074,16 +1050,14 @@ static struct device 
> > > > > > *of_get_next_parent_dev(struct device_node *np)
> > > > > >   * cases, it returns an error.
> > > > > >   *
> > > > > >   * Returns:
> > > > > > - * - 0 if link successfully created to supplier
> > > > > > - * - -EAGAIN if linking to the supplier should be reattempted
> > > > > > + * - 0 if fwnode link successfully created to supplier
> > > > > >   * - -EINVAL if the supplier link is invalid and should not be 
> > > > > > created
> > > > > > - * - -ENODEV if there is no device that corresponds to the 
> > > > > > supplier phandle
> > > > > > + * - -ENODEV if struct device will never be create for supplier
> > > > > >   */
> > > > > > -static int of_link_to_phandle(struct device *dev, struct 
> > > > > > device_node *sup_np,
> > > > > > -   u32 dl_flags)
> > > > > > +static int of_link_to_phandle(struct device_node *con_np,
> > > > > > +   struct device_node *sup_np)
> > > > > >  {
> > > > > > - struct device *sup_dev, *sup_par_dev;
> > > > > > - int ret = 0;
> > > > > > + struct device *sup_dev;
> > > > > >   struct device_node *tmp_np = sup_np;
> > > > > >
> > > > > >   of_node_get(sup_np);
> > > > > > @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device 
> > > > > > *dev, struct device_node *sup_np,
> > > > > >   }
> > > > > >
> > > > > >   if (!sup_np) {
> > > > > > - dev_dbg(dev, "Not linking to %pOFP - No device\n", 
> > > > > > tmp_np);
> > > > > > + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> > > > > > +  con_np, tmp_np);
> > > > >
> > > > > Who is calling this function without a valid dev pointer?
> > > >
> > > > Sorry, I plan to delete the "dev" parameter as it's not really used
> > > > anywhere. I'm trying to do that without causing build time errors and
> > > > making the series into digestible small patches.
> > > >
> > > > I can do the deletion of the parameter as a Patch 19/19. Will 

Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-05 Thread Greg Kroah-Hartman
On Thu, Nov 05, 2020 at 11:41:20PM -0800, Saravana Kannan wrote:
> On Thu, Nov 5, 2020 at 11:22 PM Greg Kroah-Hartman
>  wrote:
> >
> > On Thu, Nov 05, 2020 at 03:25:56PM -0800, Saravana Kannan wrote:
> > > On Thu, Nov 5, 2020 at 1:41 AM Greg Kroah-Hartman
> > >  wrote:
> > > >
> > > > On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> > > > > The semantics of add_links() has changed from creating device link
> > > > > between devices to creating fwnode links between fwnodes. So, update 
> > > > > the
> > > > > implementation of add_links() to match the new semantics.
> > > > >
> > > > > Signed-off-by: Saravana Kannan 
> > > > > ---
> > > > >  drivers/of/property.c | 150 
> > > > > --
> > > > >  1 file changed, 41 insertions(+), 109 deletions(-)
> > > > >
> > > > > diff --git a/drivers/of/property.c b/drivers/of/property.c
> > > > > index 408a7b5f06a9..86303803f1b3 100644
> > > > > --- a/drivers/of/property.c
> > > > > +++ b/drivers/of/property.c
> > > > > @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct 
> > > > > device_node *test_ancestor,
> > > > >  }
> > > > >
> > > > >  /**
> > > > > - * of_get_next_parent_dev - Add device link to supplier from 
> > > > > supplier phandle
> > > > > - * @np: device tree node
> > > > > - *
> > > > > - * Given a device tree node (@np), this function finds its closest 
> > > > > ancestor
> > > > > - * device tree node that has a corresponding struct device.
> > > > > - *
> > > > > - * The caller of this function is expected to call put_device() on 
> > > > > the returned
> > > > > - * device when they are done.
> > > > > - */
> > > > > -static struct device *of_get_next_parent_dev(struct device_node *np)
> > > > > -{
> > > > > - struct device *dev = NULL;
> > > > > -
> > > > > - of_node_get(np);
> > > > > - do {
> > > > > - np = of_get_next_parent(np);
> > > > > - if (np)
> > > > > - dev = get_dev_from_fwnode(>fwnode);
> > > > > - } while (np && !dev);
> > > > > - of_node_put(np);
> > > > > - return dev;
> > > > > -}
> > > > > -
> > > > > -/**
> > > > > - * of_link_to_phandle - Add device link to supplier from supplier 
> > > > > phandle
> > > > > - * @dev: consumer device
> > > > > - * @sup_np: phandle to supplier device tree node
> > > > > + * of_link_to_phandle - Add fwnode link to supplier from supplier 
> > > > > phandle
> > > > > + * @con_np: consumer device tree node
> > > > > + * @sup_np: supplier device tree node
> > > > >   *
> > > > >   * Given a phandle to a supplier device tree node (@sup_np), this 
> > > > > function
> > > > >   * finds the device that owns the supplier device tree node and 
> > > > > creates a
> > > > > @@ -1074,16 +1050,14 @@ static struct device 
> > > > > *of_get_next_parent_dev(struct device_node *np)
> > > > >   * cases, it returns an error.
> > > > >   *
> > > > >   * Returns:
> > > > > - * - 0 if link successfully created to supplier
> > > > > - * - -EAGAIN if linking to the supplier should be reattempted
> > > > > + * - 0 if fwnode link successfully created to supplier
> > > > >   * - -EINVAL if the supplier link is invalid and should not be 
> > > > > created
> > > > > - * - -ENODEV if there is no device that corresponds to the supplier 
> > > > > phandle
> > > > > + * - -ENODEV if struct device will never be create for supplier
> > > > >   */
> > > > > -static int of_link_to_phandle(struct device *dev, struct device_node 
> > > > > *sup_np,
> > > > > -   u32 dl_flags)
> > > > > +static int of_link_to_phandle(struct device_node *con_np,
> > > > > +   struct device_node *sup_np)
> > > > >  {
> > > > > - struct device *sup_dev, *sup_par_dev;
> > > > > - int ret = 0;
> > > > > + struct device *sup_dev;
> > > > >   struct device_node *tmp_np = sup_np;
> > > > >
> > > > >   of_node_get(sup_np);
> > > > > @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device 
> > > > > *dev, struct device_node *sup_np,
> > > > >   }
> > > > >
> > > > >   if (!sup_np) {
> > > > > - dev_dbg(dev, "Not linking to %pOFP - No device\n", 
> > > > > tmp_np);
> > > > > + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> > > > > +  con_np, tmp_np);
> > > >
> > > > Who is calling this function without a valid dev pointer?
> > >
> > > Sorry, I plan to delete the "dev" parameter as it's not really used
> > > anywhere. I'm trying to do that without causing build time errors and
> > > making the series into digestible small patches.
> > >
> > > I can do the deletion of the parameter as a Patch 19/19. Will that work?
> >
> > That's fine, but why get rid of dev?  The driver core works on these
> > things, and we want errors/messages/warnings to spit out what device is
> > causing those issues.  It is fine to drag around a struct device pointer
> > just for messages, that's to be expected, and is good.

Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-05 Thread Saravana Kannan
On Thu, Nov 5, 2020 at 11:22 PM Greg Kroah-Hartman
 wrote:
>
> On Thu, Nov 05, 2020 at 03:25:56PM -0800, Saravana Kannan wrote:
> > On Thu, Nov 5, 2020 at 1:41 AM Greg Kroah-Hartman
> >  wrote:
> > >
> > > On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> > > > The semantics of add_links() has changed from creating device link
> > > > between devices to creating fwnode links between fwnodes. So, update the
> > > > implementation of add_links() to match the new semantics.
> > > >
> > > > Signed-off-by: Saravana Kannan 
> > > > ---
> > > >  drivers/of/property.c | 150 --
> > > >  1 file changed, 41 insertions(+), 109 deletions(-)
> > > >
> > > > diff --git a/drivers/of/property.c b/drivers/of/property.c
> > > > index 408a7b5f06a9..86303803f1b3 100644
> > > > --- a/drivers/of/property.c
> > > > +++ b/drivers/of/property.c
> > > > @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct device_node 
> > > > *test_ancestor,
> > > >  }
> > > >
> > > >  /**
> > > > - * of_get_next_parent_dev - Add device link to supplier from supplier 
> > > > phandle
> > > > - * @np: device tree node
> > > > - *
> > > > - * Given a device tree node (@np), this function finds its closest 
> > > > ancestor
> > > > - * device tree node that has a corresponding struct device.
> > > > - *
> > > > - * The caller of this function is expected to call put_device() on the 
> > > > returned
> > > > - * device when they are done.
> > > > - */
> > > > -static struct device *of_get_next_parent_dev(struct device_node *np)
> > > > -{
> > > > - struct device *dev = NULL;
> > > > -
> > > > - of_node_get(np);
> > > > - do {
> > > > - np = of_get_next_parent(np);
> > > > - if (np)
> > > > - dev = get_dev_from_fwnode(>fwnode);
> > > > - } while (np && !dev);
> > > > - of_node_put(np);
> > > > - return dev;
> > > > -}
> > > > -
> > > > -/**
> > > > - * of_link_to_phandle - Add device link to supplier from supplier 
> > > > phandle
> > > > - * @dev: consumer device
> > > > - * @sup_np: phandle to supplier device tree node
> > > > + * of_link_to_phandle - Add fwnode link to supplier from supplier 
> > > > phandle
> > > > + * @con_np: consumer device tree node
> > > > + * @sup_np: supplier device tree node
> > > >   *
> > > >   * Given a phandle to a supplier device tree node (@sup_np), this 
> > > > function
> > > >   * finds the device that owns the supplier device tree node and 
> > > > creates a
> > > > @@ -1074,16 +1050,14 @@ static struct device 
> > > > *of_get_next_parent_dev(struct device_node *np)
> > > >   * cases, it returns an error.
> > > >   *
> > > >   * Returns:
> > > > - * - 0 if link successfully created to supplier
> > > > - * - -EAGAIN if linking to the supplier should be reattempted
> > > > + * - 0 if fwnode link successfully created to supplier
> > > >   * - -EINVAL if the supplier link is invalid and should not be created
> > > > - * - -ENODEV if there is no device that corresponds to the supplier 
> > > > phandle
> > > > + * - -ENODEV if struct device will never be create for supplier
> > > >   */
> > > > -static int of_link_to_phandle(struct device *dev, struct device_node 
> > > > *sup_np,
> > > > -   u32 dl_flags)
> > > > +static int of_link_to_phandle(struct device_node *con_np,
> > > > +   struct device_node *sup_np)
> > > >  {
> > > > - struct device *sup_dev, *sup_par_dev;
> > > > - int ret = 0;
> > > > + struct device *sup_dev;
> > > >   struct device_node *tmp_np = sup_np;
> > > >
> > > >   of_node_get(sup_np);
> > > > @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device *dev, 
> > > > struct device_node *sup_np,
> > > >   }
> > > >
> > > >   if (!sup_np) {
> > > > - dev_dbg(dev, "Not linking to %pOFP - No device\n", 
> > > > tmp_np);
> > > > + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> > > > +  con_np, tmp_np);
> > >
> > > Who is calling this function without a valid dev pointer?
> >
> > Sorry, I plan to delete the "dev" parameter as it's not really used
> > anywhere. I'm trying to do that without causing build time errors and
> > making the series into digestible small patches.
> >
> > I can do the deletion of the parameter as a Patch 19/19. Will that work?
>
> That's fine, but why get rid of dev?  The driver core works on these
> things, and we want errors/messages/warnings to spit out what device is
> causing those issues.  It is fine to drag around a struct device pointer
> just for messages, that's to be expected, and is good.

In general I agree. If the fwnode being parsed is related to the dev,
it's nice to have the dev name in the logs.

But in this instance I feel it's analogous to printing the PID that's
parsing the fwnode -- kinda irrelevant. The device in question can
appear very random and it'll just cause more confusion than be of help

Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-05 Thread Greg Kroah-Hartman
On Thu, Nov 05, 2020 at 03:25:56PM -0800, Saravana Kannan wrote:
> On Thu, Nov 5, 2020 at 1:41 AM Greg Kroah-Hartman
>  wrote:
> >
> > On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> > > The semantics of add_links() has changed from creating device link
> > > between devices to creating fwnode links between fwnodes. So, update the
> > > implementation of add_links() to match the new semantics.
> > >
> > > Signed-off-by: Saravana Kannan 
> > > ---
> > >  drivers/of/property.c | 150 --
> > >  1 file changed, 41 insertions(+), 109 deletions(-)
> > >
> > > diff --git a/drivers/of/property.c b/drivers/of/property.c
> > > index 408a7b5f06a9..86303803f1b3 100644
> > > --- a/drivers/of/property.c
> > > +++ b/drivers/of/property.c
> > > @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct device_node 
> > > *test_ancestor,
> > >  }
> > >
> > >  /**
> > > - * of_get_next_parent_dev - Add device link to supplier from supplier 
> > > phandle
> > > - * @np: device tree node
> > > - *
> > > - * Given a device tree node (@np), this function finds its closest 
> > > ancestor
> > > - * device tree node that has a corresponding struct device.
> > > - *
> > > - * The caller of this function is expected to call put_device() on the 
> > > returned
> > > - * device when they are done.
> > > - */
> > > -static struct device *of_get_next_parent_dev(struct device_node *np)
> > > -{
> > > - struct device *dev = NULL;
> > > -
> > > - of_node_get(np);
> > > - do {
> > > - np = of_get_next_parent(np);
> > > - if (np)
> > > - dev = get_dev_from_fwnode(>fwnode);
> > > - } while (np && !dev);
> > > - of_node_put(np);
> > > - return dev;
> > > -}
> > > -
> > > -/**
> > > - * of_link_to_phandle - Add device link to supplier from supplier phandle
> > > - * @dev: consumer device
> > > - * @sup_np: phandle to supplier device tree node
> > > + * of_link_to_phandle - Add fwnode link to supplier from supplier phandle
> > > + * @con_np: consumer device tree node
> > > + * @sup_np: supplier device tree node
> > >   *
> > >   * Given a phandle to a supplier device tree node (@sup_np), this 
> > > function
> > >   * finds the device that owns the supplier device tree node and creates a
> > > @@ -1074,16 +1050,14 @@ static struct device 
> > > *of_get_next_parent_dev(struct device_node *np)
> > >   * cases, it returns an error.
> > >   *
> > >   * Returns:
> > > - * - 0 if link successfully created to supplier
> > > - * - -EAGAIN if linking to the supplier should be reattempted
> > > + * - 0 if fwnode link successfully created to supplier
> > >   * - -EINVAL if the supplier link is invalid and should not be created
> > > - * - -ENODEV if there is no device that corresponds to the supplier 
> > > phandle
> > > + * - -ENODEV if struct device will never be create for supplier
> > >   */
> > > -static int of_link_to_phandle(struct device *dev, struct device_node 
> > > *sup_np,
> > > -   u32 dl_flags)
> > > +static int of_link_to_phandle(struct device_node *con_np,
> > > +   struct device_node *sup_np)
> > >  {
> > > - struct device *sup_dev, *sup_par_dev;
> > > - int ret = 0;
> > > + struct device *sup_dev;
> > >   struct device_node *tmp_np = sup_np;
> > >
> > >   of_node_get(sup_np);
> > > @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device *dev, 
> > > struct device_node *sup_np,
> > >   }
> > >
> > >   if (!sup_np) {
> > > - dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np);
> > > + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> > > +  con_np, tmp_np);
> >
> > Who is calling this function without a valid dev pointer?
> 
> Sorry, I plan to delete the "dev" parameter as it's not really used
> anywhere. I'm trying to do that without causing build time errors and
> making the series into digestible small patches.
> 
> I can do the deletion of the parameter as a Patch 19/19. Will that work?

That's fine, but why get rid of dev?  The driver core works on these
things, and we want errors/messages/warnings to spit out what device is
causing those issues.  It is fine to drag around a struct device pointer
just for messages, that's to be expected, and is good.

> > And the only way it can be NULL is if fwnode is NULL, and as you control
> > the callers to it, how can that be the case?
> 
> fwnode represents a generic firmware node. The to_of_node() returns
> NULL if fwnode is not a DT node. So con_np can be NULL if that
> happens. That's why we need a NULL check here.  With the current code,
> that can never happen, bit I think it doesn't hurt to check in case
> there's a buggy caller. I don't have a strong opinion - so I can do it
> whichever way.

If it can't happen, no need to check for it :)

thanks,

greg k-h


Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-05 Thread Saravana Kannan
On Thu, Nov 5, 2020 at 3:25 PM Saravana Kannan  wrote:
>
> On Thu, Nov 5, 2020 at 1:41 AM Greg Kroah-Hartman
>  wrote:
> >
> > On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> > > The semantics of add_links() has changed from creating device link
> > > between devices to creating fwnode links between fwnodes. So, update the
> > > implementation of add_links() to match the new semantics.
> > >
> > > Signed-off-by: Saravana Kannan 
> > > ---
> > >  drivers/of/property.c | 150 --
> > >  1 file changed, 41 insertions(+), 109 deletions(-)
> > >
> > > diff --git a/drivers/of/property.c b/drivers/of/property.c
> > > index 408a7b5f06a9..86303803f1b3 100644
> > > --- a/drivers/of/property.c
> > > +++ b/drivers/of/property.c
> > > @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct device_node 
> > > *test_ancestor,
> > >  }
> > >
> > >  /**
> > > - * of_get_next_parent_dev - Add device link to supplier from supplier 
> > > phandle
> > > - * @np: device tree node
> > > - *
> > > - * Given a device tree node (@np), this function finds its closest 
> > > ancestor
> > > - * device tree node that has a corresponding struct device.
> > > - *
> > > - * The caller of this function is expected to call put_device() on the 
> > > returned
> > > - * device when they are done.
> > > - */
> > > -static struct device *of_get_next_parent_dev(struct device_node *np)
> > > -{
> > > - struct device *dev = NULL;
> > > -
> > > - of_node_get(np);
> > > - do {
> > > - np = of_get_next_parent(np);
> > > - if (np)
> > > - dev = get_dev_from_fwnode(>fwnode);
> > > - } while (np && !dev);
> > > - of_node_put(np);
> > > - return dev;
> > > -}
> > > -
> > > -/**
> > > - * of_link_to_phandle - Add device link to supplier from supplier phandle
> > > - * @dev: consumer device
> > > - * @sup_np: phandle to supplier device tree node
> > > + * of_link_to_phandle - Add fwnode link to supplier from supplier phandle
> > > + * @con_np: consumer device tree node
> > > + * @sup_np: supplier device tree node
> > >   *
> > >   * Given a phandle to a supplier device tree node (@sup_np), this 
> > > function
> > >   * finds the device that owns the supplier device tree node and creates a
> > > @@ -1074,16 +1050,14 @@ static struct device 
> > > *of_get_next_parent_dev(struct device_node *np)
> > >   * cases, it returns an error.
> > >   *
> > >   * Returns:
> > > - * - 0 if link successfully created to supplier
> > > - * - -EAGAIN if linking to the supplier should be reattempted
> > > + * - 0 if fwnode link successfully created to supplier
> > >   * - -EINVAL if the supplier link is invalid and should not be created
> > > - * - -ENODEV if there is no device that corresponds to the supplier 
> > > phandle
> > > + * - -ENODEV if struct device will never be create for supplier
> > >   */
> > > -static int of_link_to_phandle(struct device *dev, struct device_node 
> > > *sup_np,
> > > -   u32 dl_flags)
> > > +static int of_link_to_phandle(struct device_node *con_np,
> > > +   struct device_node *sup_np)
> > >  {
> > > - struct device *sup_dev, *sup_par_dev;
> > > - int ret = 0;
> > > + struct device *sup_dev;
> > >   struct device_node *tmp_np = sup_np;
> > >
> > >   of_node_get(sup_np);
> > > @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device *dev, 
> > > struct device_node *sup_np,
> > >   }
> > >
> > >   if (!sup_np) {
> > > - dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np);
> > > + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> > > +  con_np, tmp_np);
> >
> > Who is calling this function without a valid dev pointer?
>
> Sorry, I plan to delete the "dev" parameter as it's not really used
> anywhere. I'm trying to do that without causing build time errors and
> making the series into digestible small patches.

*facepalm* for my earlier response. You'll notice that I've already
deleted the "dev" input param to this function. That's why I can't use
it here :)

-Saravana


Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-05 Thread Saravana Kannan
On Thu, Nov 5, 2020 at 1:41 AM Greg Kroah-Hartman
 wrote:
>
> On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> > The semantics of add_links() has changed from creating device link
> > between devices to creating fwnode links between fwnodes. So, update the
> > implementation of add_links() to match the new semantics.
> >
> > Signed-off-by: Saravana Kannan 
> > ---
> >  drivers/of/property.c | 150 --
> >  1 file changed, 41 insertions(+), 109 deletions(-)
> >
> > diff --git a/drivers/of/property.c b/drivers/of/property.c
> > index 408a7b5f06a9..86303803f1b3 100644
> > --- a/drivers/of/property.c
> > +++ b/drivers/of/property.c
> > @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct device_node 
> > *test_ancestor,
> >  }
> >
> >  /**
> > - * of_get_next_parent_dev - Add device link to supplier from supplier 
> > phandle
> > - * @np: device tree node
> > - *
> > - * Given a device tree node (@np), this function finds its closest ancestor
> > - * device tree node that has a corresponding struct device.
> > - *
> > - * The caller of this function is expected to call put_device() on the 
> > returned
> > - * device when they are done.
> > - */
> > -static struct device *of_get_next_parent_dev(struct device_node *np)
> > -{
> > - struct device *dev = NULL;
> > -
> > - of_node_get(np);
> > - do {
> > - np = of_get_next_parent(np);
> > - if (np)
> > - dev = get_dev_from_fwnode(>fwnode);
> > - } while (np && !dev);
> > - of_node_put(np);
> > - return dev;
> > -}
> > -
> > -/**
> > - * of_link_to_phandle - Add device link to supplier from supplier phandle
> > - * @dev: consumer device
> > - * @sup_np: phandle to supplier device tree node
> > + * of_link_to_phandle - Add fwnode link to supplier from supplier phandle
> > + * @con_np: consumer device tree node
> > + * @sup_np: supplier device tree node
> >   *
> >   * Given a phandle to a supplier device tree node (@sup_np), this function
> >   * finds the device that owns the supplier device tree node and creates a
> > @@ -1074,16 +1050,14 @@ static struct device *of_get_next_parent_dev(struct 
> > device_node *np)
> >   * cases, it returns an error.
> >   *
> >   * Returns:
> > - * - 0 if link successfully created to supplier
> > - * - -EAGAIN if linking to the supplier should be reattempted
> > + * - 0 if fwnode link successfully created to supplier
> >   * - -EINVAL if the supplier link is invalid and should not be created
> > - * - -ENODEV if there is no device that corresponds to the supplier phandle
> > + * - -ENODEV if struct device will never be create for supplier
> >   */
> > -static int of_link_to_phandle(struct device *dev, struct device_node 
> > *sup_np,
> > -   u32 dl_flags)
> > +static int of_link_to_phandle(struct device_node *con_np,
> > +   struct device_node *sup_np)
> >  {
> > - struct device *sup_dev, *sup_par_dev;
> > - int ret = 0;
> > + struct device *sup_dev;
> >   struct device_node *tmp_np = sup_np;
> >
> >   of_node_get(sup_np);
> > @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device *dev, 
> > struct device_node *sup_np,
> >   }
> >
> >   if (!sup_np) {
> > - dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np);
> > + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> > +  con_np, tmp_np);
>
> Who is calling this function without a valid dev pointer?

Sorry, I plan to delete the "dev" parameter as it's not really used
anywhere. I'm trying to do that without causing build time errors and
making the series into digestible small patches.

I can do the deletion of the parameter as a Patch 19/19. Will that work?

> >   return -ENODEV;
> >   }
> >
> > @@ -1115,53 +1090,30 @@ static int of_link_to_phandle(struct device *dev, 
> > struct device_node *sup_np,
> >* descendant nodes. By definition, a child node can't be a functional
> >* dependency for the parent node.
> >*/
> > - if (of_is_ancestor_of(dev->of_node, sup_np)) {
> > - dev_dbg(dev, "Not linking to %pOFP - is descendant\n", 
> > sup_np);
> > + if (of_is_ancestor_of(con_np, sup_np)) {
> > + pr_debug("Not linking %pOFP to %pOFP - is descendant\n",
> > +  con_np, sup_np);
>
> Why not dev_dbg() here?  dev should be valid, correct?

Responded above.

> >   of_node_put(sup_np);
> >   return -EINVAL;
> >   }
> > +
> > + /*
> > +  * Don't create links to "early devices" that won't have struct 
> > devices
> > +  * created for them.
> > +  */
> >   sup_dev = get_dev_from_fwnode(_np->fwnode);
> >   if (!sup_dev && of_node_check_flag(sup_np, OF_POPULATED)) {
> > - /* Early device without struct device. */
> > - dev_dbg(dev, "Not linking to %pOFP - No struct 

Re: [PATCH v1 15/18] of: property: Update implementation of add_links() to create fwnode links

2020-11-05 Thread Greg Kroah-Hartman
On Wed, Nov 04, 2020 at 03:23:52PM -0800, Saravana Kannan wrote:
> The semantics of add_links() has changed from creating device link
> between devices to creating fwnode links between fwnodes. So, update the
> implementation of add_links() to match the new semantics.
> 
> Signed-off-by: Saravana Kannan 
> ---
>  drivers/of/property.c | 150 --
>  1 file changed, 41 insertions(+), 109 deletions(-)
> 
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index 408a7b5f06a9..86303803f1b3 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
> @@ -1038,33 +1038,9 @@ static bool of_is_ancestor_of(struct device_node 
> *test_ancestor,
>  }
>  
>  /**
> - * of_get_next_parent_dev - Add device link to supplier from supplier phandle
> - * @np: device tree node
> - *
> - * Given a device tree node (@np), this function finds its closest ancestor
> - * device tree node that has a corresponding struct device.
> - *
> - * The caller of this function is expected to call put_device() on the 
> returned
> - * device when they are done.
> - */
> -static struct device *of_get_next_parent_dev(struct device_node *np)
> -{
> - struct device *dev = NULL;
> -
> - of_node_get(np);
> - do {
> - np = of_get_next_parent(np);
> - if (np)
> - dev = get_dev_from_fwnode(>fwnode);
> - } while (np && !dev);
> - of_node_put(np);
> - return dev;
> -}
> -
> -/**
> - * of_link_to_phandle - Add device link to supplier from supplier phandle
> - * @dev: consumer device
> - * @sup_np: phandle to supplier device tree node
> + * of_link_to_phandle - Add fwnode link to supplier from supplier phandle
> + * @con_np: consumer device tree node
> + * @sup_np: supplier device tree node
>   *
>   * Given a phandle to a supplier device tree node (@sup_np), this function
>   * finds the device that owns the supplier device tree node and creates a
> @@ -1074,16 +1050,14 @@ static struct device *of_get_next_parent_dev(struct 
> device_node *np)
>   * cases, it returns an error.
>   *
>   * Returns:
> - * - 0 if link successfully created to supplier
> - * - -EAGAIN if linking to the supplier should be reattempted
> + * - 0 if fwnode link successfully created to supplier
>   * - -EINVAL if the supplier link is invalid and should not be created
> - * - -ENODEV if there is no device that corresponds to the supplier phandle
> + * - -ENODEV if struct device will never be create for supplier
>   */
> -static int of_link_to_phandle(struct device *dev, struct device_node *sup_np,
> -   u32 dl_flags)
> +static int of_link_to_phandle(struct device_node *con_np,
> +   struct device_node *sup_np)
>  {
> - struct device *sup_dev, *sup_par_dev;
> - int ret = 0;
> + struct device *sup_dev;
>   struct device_node *tmp_np = sup_np;
>  
>   of_node_get(sup_np);
> @@ -1106,7 +1080,8 @@ static int of_link_to_phandle(struct device *dev, 
> struct device_node *sup_np,
>   }
>  
>   if (!sup_np) {
> - dev_dbg(dev, "Not linking to %pOFP - No device\n", tmp_np);
> + pr_debug("Not linking %pOFP to %pOFP - No device\n",
> +  con_np, tmp_np);

Who is calling this function without a valid dev pointer?

>   return -ENODEV;
>   }
>  
> @@ -1115,53 +1090,30 @@ static int of_link_to_phandle(struct device *dev, 
> struct device_node *sup_np,
>* descendant nodes. By definition, a child node can't be a functional
>* dependency for the parent node.
>*/
> - if (of_is_ancestor_of(dev->of_node, sup_np)) {
> - dev_dbg(dev, "Not linking to %pOFP - is descendant\n", sup_np);
> + if (of_is_ancestor_of(con_np, sup_np)) {
> + pr_debug("Not linking %pOFP to %pOFP - is descendant\n",
> +  con_np, sup_np);

Why not dev_dbg() here?  dev should be valid, correct?


>   of_node_put(sup_np);
>   return -EINVAL;
>   }
> +
> + /*
> +  * Don't create links to "early devices" that won't have struct devices
> +  * created for them.
> +  */
>   sup_dev = get_dev_from_fwnode(_np->fwnode);
>   if (!sup_dev && of_node_check_flag(sup_np, OF_POPULATED)) {
> - /* Early device without struct device. */
> - dev_dbg(dev, "Not linking to %pOFP - No struct device\n",
> - sup_np);
> + pr_debug("Not linking %pOFP to %pOFP - No struct device\n",
> +  con_np, sup_np);

How is dev not valid here?  sup_dev might not be, but dev should be.


>   of_node_put(sup_np);
>   return -ENODEV;
> - } else if (!sup_dev) {
> - /*
> -  * DL_FLAG_SYNC_STATE_ONLY doesn't block probing and supports
> -  * cycles. So cycle detection isn't necessary and shouldn't be
> -  * done.
> -  */
> - if