[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150728074806.GS21114@x1>
Date: Tue, 28 Jul 2015 08:48:06 +0100
From: Lee Jones <lee.jones@...aro.org>
To: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
Cc: linux-acpi@...r.kernel.org, linux-pm@...r.kernel.org,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Vinod Koul <vinod.koul@...el.com>,
Mika Westerberg <mika.westerberg@...ux.intel.com>,
linux-kernel@...r.kernel.org, dmaengine@...r.kernel.org,
Heikki Krogerus <heikki.krogerus@...ux.intel.com>,
Jarkko Nikula <jarkko.nikula@...ux.intel.com>,
"Wysocki, Rafael J" <rafael.j.wysocki@...el.com>,
mturquette@...libre.com, sboyd@...eaurora.org
Subject: Re: [PATCH v6 5/8] driver core: implement
device_for_each_child_reverse()
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@...ux.intel.com>
> Acked-by: Greg Kroah-Hartman <gregkh@...uxfoundation.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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists