[PATCH 1/3] power: domain: add pm_genpd_uninit
Kevin Hilman
khilman at kernel.org
Mon Nov 30 15:19:09 PST 2015
Alexander Aring <alex.aring at gmail.com> writes:
> This patch adds function pm_genpd_uninit for undo a pm_genpd_init. This
> is useful for multiple power domains while probing. If the probing fails
> after one pm_genpd_init was called we need to undo all previous
> registrations of generic pm domains inside the gpd_list list.
>
> There is a check on IS_ERR_OR_NULL(genpd) which is useful to check again
> registered power domains and not registered domains, the driver can use
> this mechanism to have an array with registered and non-registered power
> domains, where non-registered power domains are NULL.
>
> Cc: Rafael J. Wysocki <rjw at rjwysocki.net>
> Cc: Kevin Hilman <khilman at kernel.org>
> Cc: Ulf Hansson <ulf.hansson at linaro.org>
> Cc: Pavel Machek <pavel at ucw.cz>
> Cc: Len Brown <len.brown at intel.com>
> Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> Signed-off-by: Alexander Aring <alex.aring at gmail.com>
> ---
> drivers/base/power/domain.c | 22 ++++++++++++++++++++++
> include/linux/pm_domain.h | 4 ++++
> 2 files changed, 26 insertions(+)
>
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> index e03b1ad..24f54b8 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -1509,6 +1509,28 @@ void pm_genpd_init(struct generic_pm_domain *genpd,
> }
> EXPORT_SYMBOL_GPL(pm_genpd_init);
>
> +/**
> + * pm_genpd_uninit - Uninitialize a generic I/O PM domain object.
> + * @genpd: PM domain object to initialize.
> + */
> +void pm_genpd_uninit(struct generic_pm_domain *genpd)
> +{
> + if (IS_ERR_OR_NULL(genpd))
> + return;
> +
> + /* check if domain is still in registered inside the pm subsystem */
> + WARN_ON_ONCE(!list_empty(&genpd->master_links) ||
> + !list_empty(&genpd->slave_links) ||
> + !list_empty(&genpd->dev_list));
So we WARN if there are parents/children/devices, but shouldn't this
return an error instead of continuing to remove/uninit the genpd?
The caller of _uninit should probably also be removing any
parents/children and removing devices before calling _uninit, no?
> + mutex_lock(&gpd_list_lock);
> + list_del(&genpd->gpd_list_node);
> + mutex_unlock(&gpd_list_lock);
> +
> + mutex_destroy(&genpd->lock);
> +}
> +EXPORT_SYMBOL_GPL(pm_genpd_uninit);
Kevin
More information about the linux-rpi-kernel
mailing list