linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Lee Jones <lee.jones@linaro.org>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Vinod Koul <vinod.koul@intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Jarkko Nikula <jarkko.nikula@linux.intel.com>,
	"Wysocki, Rafael J" <rafael.j.wysocki@intel.com>,
	mturquette@baylibre.com, sboyd@codeaurora.org
Subject: Re: [PATCH v6 5/8] driver core: implement device_for_each_child_reverse()
Date: Tue, 28 Jul 2015 08:48:06 +0100	[thread overview]
Message-ID: <20150728074806.GS21114@x1> (raw)
In-Reply-To: <1438009443-55317-6-git-send-email-andriy.shevchenko@linux.intel.com>

On Mon, 27 Jul 2015, Andy Shevchenko wrote:

> The new function device_for_each_child_reverse() is helpful to traverse the
> registered devices in a reversed order, e.g. in the case when an operation on
> each device should be done first on the last added device, then on one before
> last and so on.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
>  drivers/base/core.c    | 43 +++++++++++++++++++++++++++++++++++++++++++
>  include/linux/device.h |  2 ++
>  2 files changed, 45 insertions(+)

Applied, thanks.  Pull request to follow.

> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index dafae6d..7d62795 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -1252,6 +1252,19 @@ void device_unregister(struct device *dev)
>  }
>  EXPORT_SYMBOL_GPL(device_unregister);
>  
> +static struct device *prev_device(struct klist_iter *i)
> +{
> +	struct klist_node *n = klist_prev(i);
> +	struct device *dev = NULL;
> +	struct device_private *p;
> +
> +	if (n) {
> +		p = to_device_private_parent(n);
> +		dev = p->device;
> +	}
> +	return dev;
> +}
> +
>  static struct device *next_device(struct klist_iter *i)
>  {
>  	struct klist_node *n = klist_next(i);
> @@ -1341,6 +1354,36 @@ int device_for_each_child(struct device *parent, void *data,
>  EXPORT_SYMBOL_GPL(device_for_each_child);
>  
>  /**
> + * device_for_each_child_reverse - device child iterator in reversed order.
> + * @parent: parent struct device.
> + * @fn: function to be called for each device.
> + * @data: data for the callback.
> + *
> + * Iterate over @parent's child devices, and call @fn for each,
> + * passing it @data.
> + *
> + * We check the return of @fn each time. If it returns anything
> + * other than 0, we break out and return that value.
> + */
> +int device_for_each_child_reverse(struct device *parent, void *data,
> +				  int (*fn)(struct device *dev, void *data))
> +{
> +	struct klist_iter i;
> +	struct device *child;
> +	int error = 0;
> +
> +	if (!parent->p)
> +		return 0;
> +
> +	klist_iter_init(&parent->p->klist_children, &i);
> +	while ((child = prev_device(&i)) && !error)
> +		error = fn(child, data);
> +	klist_iter_exit(&i);
> +	return error;
> +}
> +EXPORT_SYMBOL_GPL(device_for_each_child_reverse);
> +
> +/**
>   * device_find_child - device iterator for locating a particular device.
>   * @parent: parent struct device
>   * @match: Callback function to check device
> diff --git a/include/linux/device.h b/include/linux/device.h
> index a2b4ea7..9d212fe 100644
> --- a/include/linux/device.h
> +++ b/include/linux/device.h
> @@ -959,6 +959,8 @@ extern int __must_check device_add(struct device *dev);
>  extern void device_del(struct device *dev);
>  extern int device_for_each_child(struct device *dev, void *data,
>  		     int (*fn)(struct device *dev, void *data));
> +extern int device_for_each_child_reverse(struct device *dev, void *data,
> +		     int (*fn)(struct device *dev, void *data));
>  extern struct device *device_find_child(struct device *dev, void *data,
>  				int (*match)(struct device *dev, void *data));
>  extern int device_rename(struct device *dev, const char *new_name);

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

  reply	other threads:[~2015-07-28  7:48 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-27 15:03 [PATCH v6 0/8] mfd: introduce a driver for LPSS devices on SPT Andy Shevchenko
2015-07-27 15:03 ` [PATCH v6 1/8] PM / QoS: Make it possible to expose device latency tolerance to userspace Andy Shevchenko
2015-07-28  7:47   ` Lee Jones
2015-07-27 15:03 ` [PATCH v6 2/8] ACPI / PM: Attach ACPI power domain only once Andy Shevchenko
2015-07-28  7:47   ` Lee Jones
2015-07-27 15:03 ` [PATCH v6 3/8] Driver core: wakeup the parent device before trying probe Andy Shevchenko
2015-07-28  7:47   ` Lee Jones
2015-07-27 15:03 ` [PATCH v6 4/8] klist: implement klist_prev() Andy Shevchenko
2015-07-28  7:47   ` Lee Jones
2015-07-27 15:04 ` [PATCH v6 5/8] driver core: implement device_for_each_child_reverse() Andy Shevchenko
2015-07-28  7:48   ` Lee Jones [this message]
2015-07-27 15:04 ` [PATCH v6 6/8] mfd: make mfd_remove_devices() iterate in reverse order Andy Shevchenko
2015-07-28  7:48   ` Lee Jones
2015-07-27 15:04 ` [PATCH v6 7/8] dmaengine: add a driver for Intel integrated DMA 64-bit Andy Shevchenko
2015-07-28  7:48   ` Lee Jones
2015-07-28  7:53     ` Lee Jones
2015-07-28  8:14       ` Andy Shevchenko
2015-07-28  8:43   ` Vinod Koul
2015-07-27 15:04 ` [PATCH v6 8/8] mfd: Add support for Intel Sunrisepoint LPSS devices Andy Shevchenko
2015-07-28  7:48   ` Lee Jones
2015-07-29 22:44   ` Michael Turquette
2015-07-29 23:30     ` Rafael J. Wysocki
2015-07-30 10:19     ` Andy Shevchenko
2015-07-27 15:27 ` [PATCH v6 0/8] mfd: introduce a driver for LPSS devices on SPT Lee Jones
2015-07-27 16:04   ` Mika Westerberg
2015-07-27 16:24     ` Lee Jones
2015-07-27 21:48       ` Rafael J. Wysocki
2015-07-27 21:27         ` Lee Jones
2015-07-27 21:29           ` Lee Jones
2015-07-27 22:03             ` Rafael J. Wysocki
2015-07-28  7:46               ` Lee Jones
2015-07-28  8:59 ` Lee Jones
2015-07-28  9:00   ` [GIT PULL] mfd: Immutable branch between MFD, Base, ACPI and DMA Lee Jones
2015-07-28  9:02   ` [PATCH v6 0/8] mfd: introduce a driver for LPSS devices on SPT Mika Westerberg
2015-07-29  0:30   ` Rafael J. Wysocki

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=20150728074806.GS21114@x1 \
    --to=lee.jones@linaro.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=dmaengine@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=jarkko.nikula@linux.intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=mturquette@baylibre.com \
    --cc=rafael.j.wysocki@intel.com \
    --cc=sboyd@codeaurora.org \
    --cc=vinod.koul@intel.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).