All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] software node: Fix device_add_software_node()
Date: Mon, 1 Mar 2021 17:11:14 +0200	[thread overview]
Message-ID: <YD0EEthlwXek9NFZ@smile.fi.intel.com> (raw)
In-Reply-To: <20210301143012.55118-3-heikki.krogerus@linux.intel.com>

On Mon, Mar 01, 2021 at 05:30:12PM +0300, Heikki Krogerus wrote:
> The function device_add_software_node() was meant to
> register the node supplied to it, but only if that node
> wasn't already registered. Right now the function attempts
> to always register the node. That will cause a failure with
> nodes that are already registered.
> 
> Fixing that by incrementing the reference count of the nodes
> that have already been registered, and only registering the
> new nodes. Also, clarifying the behaviour in the function
> documentation.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

(On Intel Galileo Gen 2 with some custom patches to convert gpio-dwapb et al.
  to use swnodes. Those patches a subject to further submission.)

Thanks!

> Fixes: e68d0119e328 ("software node: Introduce device_add_software_node()")
> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
>  drivers/base/swnode.c    | 26 +++++++++++++++++---------
>  include/linux/property.h |  2 +-
>  2 files changed, 18 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
> index 74db8c971db74..fa3719ef80e4d 100644
> --- a/drivers/base/swnode.c
> +++ b/drivers/base/swnode.c
> @@ -1005,25 +1005,33 @@ EXPORT_SYMBOL_GPL(fwnode_remove_software_node);
>  /**
>   * device_add_software_node - Assign software node to a device
>   * @dev: The device the software node is meant for.
> - * @swnode: The software node.
> + * @node: The software node.
>   *
> - * This function will register @swnode and make it the secondary firmware node
> - * pointer of @dev. If @dev has no primary node, then @swnode will become the primary
> - * node.
> + * This function will make @node the secondary firmware node pointer of @dev. If
> + * @dev has no primary node, then @node will become the primary node. The
> + * function will register @node automatically if it wasn't already registered.
>   */
> -int device_add_software_node(struct device *dev, const struct software_node *swnode)
> +int device_add_software_node(struct device *dev, const struct software_node *node)
>  {
> +	struct swnode *swnode;
>  	int ret;
>  
>  	/* Only one software node per device. */
>  	if (dev_to_swnode(dev))
>  		return -EBUSY;
>  
> -	ret = software_node_register(swnode);
> -	if (ret)
> -		return ret;
> +	swnode = software_node_to_swnode(node);
> +	if (swnode) {
> +		kobject_get(&swnode->kobj);
> +	} else {
> +		ret = software_node_register(node);
> +		if (ret)
> +			return ret;
> +
> +		swnode = software_node_to_swnode(node);
> +	}
>  
> -	set_secondary_fwnode(dev, software_node_fwnode(swnode));
> +	set_secondary_fwnode(dev, &swnode->fwnode);
>  
>  	return 0;
>  }
> diff --git a/include/linux/property.h b/include/linux/property.h
> index dafccfce02624..dd4687b562393 100644
> --- a/include/linux/property.h
> +++ b/include/linux/property.h
> @@ -488,7 +488,7 @@ fwnode_create_software_node(const struct property_entry *properties,
>  			    const struct fwnode_handle *parent);
>  void fwnode_remove_software_node(struct fwnode_handle *fwnode);
>  
> -int device_add_software_node(struct device *dev, const struct software_node *swnode);
> +int device_add_software_node(struct device *dev, const struct software_node *node);
>  void device_remove_software_node(struct device *dev);
>  
>  int device_create_managed_software_node(struct device *dev,
> -- 
> 2.30.1
> 

-- 
With Best Regards,
Andy Shevchenko



  reply	other threads:[~2021-03-01 15:15 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-01 14:30 [PATCH 0/2] software node: Two fixes Heikki Krogerus
2021-03-01 14:30 ` [PATCH 1/2] software node: Fix node registration Heikki Krogerus
2021-03-01 15:10   ` Andy Shevchenko
2021-03-01 14:30 ` [PATCH 2/2] software node: Fix device_add_software_node() Heikki Krogerus
2021-03-01 15:11   ` Andy Shevchenko [this message]
2021-03-09 10:51 ` [PATCH 0/2] software node: Two fixes Andy Shevchenko
2021-03-09 13:51   ` Rafael J. Wysocki
2021-03-10  7:36     ` Heikki Krogerus
2021-03-10 14:16       ` Rafael J. Wysocki
2021-03-10 14:30         ` Rafael J. Wysocki
2021-03-11  8:23           ` Heikki Krogerus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YD0EEthlwXek9NFZ@smile.fi.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rafael@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.