From: Jon Hunter <jonathanh@nvidia.com>
To: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com>,
Kevin Hilman <khilman@kernel.org>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Alexander Aring <alex.aring@gmail.com>,
Eric Anholt <eric@anholt.net>,
Thierry Reding <thierry.reding@gmail.com>,
Kukjin Kim <kgene@kernel.org>,
"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [RFC PATCH 8/8] PM / Domains: Add support for removing PM domains
Date: Tue, 21 Jun 2016 15:08:50 +0100 [thread overview]
Message-ID: <57694A72.6090202@nvidia.com> (raw)
In-Reply-To: <CAPDyKFrKCB00hHhpSaJZ57wThPFRjnp+3xMz_YW9k+zqafppHg@mail.gmail.com>
On 15/06/16 15:33, Ulf Hansson wrote:
> On 4 March 2016 at 12:23, Jon Hunter <jonathanh@nvidia.com> wrote:
>> The genpd framework allows users to add PM domains via the pm_genpd_init()
>> function, however, there is no corresponding function to remove a PM
>> domain. For most devices this may be fine as the PM domains are never
>> removed, however, for devices that wish to populate the PM domains from
>> within a driver, having the ability to remove a PM domain if the probing
>> of the device fails or the driver is unloaded is necessary.
>>
>> Add the function pm_genpd_remove() to remove a PM domain by referencing
>> it's generic_pm_domain structure.
>>
>> If a device supports nested or subdomains, then the PM domains
>> should be removed in reverse order to ensure that the subdomains are
>> removed first. Hence, add the function pm_genpd_remove_tail() to remove
>> the last PM domain added by a given provider and return the
>> generic_pm_domain structure for the PM domain that was removed.
>
> Perhaps split this up, so the pm_genpd_remove_tail() gets added in a
> separate patch on top.
OK.
>>
>> PM domains can only be removed if they are not a parent domain to
>> another PM domain and have no devices associated with them.
>>
>> When removing PM domains, the PM domain will also be removed from the
>> list of providers, if it was registered.
>>
>> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
>> ---
>> drivers/base/power/domain.c | 96 +++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/pm_domain.h | 12 ++++++
>> 2 files changed, 108 insertions(+)
>>
>> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
>> index 9b33377bf01b..17090e1c91d6 100644
>> --- a/drivers/base/power/domain.c
>> +++ b/drivers/base/power/domain.c
>> @@ -1556,6 +1556,102 @@ void pm_genpd_init(struct generic_pm_domain *genpd,
>> }
>> EXPORT_SYMBOL_GPL(pm_genpd_init);
>>
>> +/**
>> + * __pm_genpd_remove - Remove a generic I/O PM domain
>> + * @genpd: Pointer to PM domain that is to be removed.
>> + *
>> + * To remove the PM domain, this function:
>> + * - Removes the PM domain from the list of providers, if registered.
>> + * - Removes the PM domain as a subdomain to any parent domains,
>> + * if it was added.
>> + * - Removes the PM domain from the list of registered PM domains.
>> + *
>> + * The PM domain will only be removed, if it is not a parent to any
>> + * other PM domain and has no devices associated with it. Must be called
>> + * with the gpd_list_lock held.
>> + */
>> +static int __pm_genpd_remove(struct generic_pm_domain *genpd)
>
> Please rename to genpd_remove() as it's a static function.
OK.
>> +{
>> + struct gpd_link *l, *link;
>> + int ret = 0;
>> +
>> + if (IS_ERR_OR_NULL(genpd))
>> + return -EINVAL;
>> +
>> + if (genpd->provider_data)
>> + of_genpd_del_provider_by_data(genpd->provider_data);
>> +
>> + mutex_lock(&genpd->lock);
>> +
>> + if (!list_empty(&genpd->master_links) || genpd->device_count) {
>> + mutex_unlock(&genpd->lock);
>> + pr_err("%s: unable to remove %s\n", __func__, genpd->name);
>> + return -EBUSY;
>> + }
>> +
>> + list_for_each_entry_safe(link, l, &genpd->slave_links, slave_node) {
>> + list_del(&link->master_node);
>> + list_del(&link->slave_node);
>> + kfree(link);
>> + }
>> +
>> + list_del(&genpd->gpd_list_node);
>> + mutex_unlock(&genpd->lock);
>> + cancel_work_sync(&genpd->power_off_work);
>> + pr_debug("%s: removed %s\n", __func__, genpd->name);
>> +
>> + return ret;
>> +}
>> +
>> +/**
>> + * pm_genpd_remove - Remove a generic I/O PM domain
>> + * @genpd: Pointer to PM domain that is to be removed.
>> + */
>> +int pm_genpd_remove(struct generic_pm_domain *genpd)
>> +{
>> + int ret;
>> +
>> + mutex_lock(&gpd_list_lock);
>> + ret = __pm_genpd_remove(genpd);
>> + mutex_unlock(&gpd_list_lock);
>> +
>> + return ret;
>> +}
>> +
>> +/**
>> + * pm_genpd_remove_tail - Remove the last PM domain registered for a provider
>> + * @provider: Pointer to device structure associated with provider
>> + *
>> + * Find the last PM domain that was added by the provider whose 'provider'
>> + * device structure matches the device structure given. The 'provider'
>> + * device structure for a given PM domain should be initialised by the
>> + * device that is creating the PM domains and hence, calling
>> + * pm_genpd_init().
>
> Maybe make this a bigger "Important note" as what is needed to
> actually benefit from using this function.
Yes, good point. Will update.
Cheers
Jon
--
nvpublic
WARNING: multiple messages have this Message-ID (diff)
From: jonathanh@nvidia.com (Jon Hunter)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 8/8] PM / Domains: Add support for removing PM domains
Date: Tue, 21 Jun 2016 15:08:50 +0100 [thread overview]
Message-ID: <57694A72.6090202@nvidia.com> (raw)
In-Reply-To: <CAPDyKFrKCB00hHhpSaJZ57wThPFRjnp+3xMz_YW9k+zqafppHg@mail.gmail.com>
On 15/06/16 15:33, Ulf Hansson wrote:
> On 4 March 2016 at 12:23, Jon Hunter <jonathanh@nvidia.com> wrote:
>> The genpd framework allows users to add PM domains via the pm_genpd_init()
>> function, however, there is no corresponding function to remove a PM
>> domain. For most devices this may be fine as the PM domains are never
>> removed, however, for devices that wish to populate the PM domains from
>> within a driver, having the ability to remove a PM domain if the probing
>> of the device fails or the driver is unloaded is necessary.
>>
>> Add the function pm_genpd_remove() to remove a PM domain by referencing
>> it's generic_pm_domain structure.
>>
>> If a device supports nested or subdomains, then the PM domains
>> should be removed in reverse order to ensure that the subdomains are
>> removed first. Hence, add the function pm_genpd_remove_tail() to remove
>> the last PM domain added by a given provider and return the
>> generic_pm_domain structure for the PM domain that was removed.
>
> Perhaps split this up, so the pm_genpd_remove_tail() gets added in a
> separate patch on top.
OK.
>>
>> PM domains can only be removed if they are not a parent domain to
>> another PM domain and have no devices associated with them.
>>
>> When removing PM domains, the PM domain will also be removed from the
>> list of providers, if it was registered.
>>
>> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
>> ---
>> drivers/base/power/domain.c | 96 +++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/pm_domain.h | 12 ++++++
>> 2 files changed, 108 insertions(+)
>>
>> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
>> index 9b33377bf01b..17090e1c91d6 100644
>> --- a/drivers/base/power/domain.c
>> +++ b/drivers/base/power/domain.c
>> @@ -1556,6 +1556,102 @@ void pm_genpd_init(struct generic_pm_domain *genpd,
>> }
>> EXPORT_SYMBOL_GPL(pm_genpd_init);
>>
>> +/**
>> + * __pm_genpd_remove - Remove a generic I/O PM domain
>> + * @genpd: Pointer to PM domain that is to be removed.
>> + *
>> + * To remove the PM domain, this function:
>> + * - Removes the PM domain from the list of providers, if registered.
>> + * - Removes the PM domain as a subdomain to any parent domains,
>> + * if it was added.
>> + * - Removes the PM domain from the list of registered PM domains.
>> + *
>> + * The PM domain will only be removed, if it is not a parent to any
>> + * other PM domain and has no devices associated with it. Must be called
>> + * with the gpd_list_lock held.
>> + */
>> +static int __pm_genpd_remove(struct generic_pm_domain *genpd)
>
> Please rename to genpd_remove() as it's a static function.
OK.
>> +{
>> + struct gpd_link *l, *link;
>> + int ret = 0;
>> +
>> + if (IS_ERR_OR_NULL(genpd))
>> + return -EINVAL;
>> +
>> + if (genpd->provider_data)
>> + of_genpd_del_provider_by_data(genpd->provider_data);
>> +
>> + mutex_lock(&genpd->lock);
>> +
>> + if (!list_empty(&genpd->master_links) || genpd->device_count) {
>> + mutex_unlock(&genpd->lock);
>> + pr_err("%s: unable to remove %s\n", __func__, genpd->name);
>> + return -EBUSY;
>> + }
>> +
>> + list_for_each_entry_safe(link, l, &genpd->slave_links, slave_node) {
>> + list_del(&link->master_node);
>> + list_del(&link->slave_node);
>> + kfree(link);
>> + }
>> +
>> + list_del(&genpd->gpd_list_node);
>> + mutex_unlock(&genpd->lock);
>> + cancel_work_sync(&genpd->power_off_work);
>> + pr_debug("%s: removed %s\n", __func__, genpd->name);
>> +
>> + return ret;
>> +}
>> +
>> +/**
>> + * pm_genpd_remove - Remove a generic I/O PM domain
>> + * @genpd: Pointer to PM domain that is to be removed.
>> + */
>> +int pm_genpd_remove(struct generic_pm_domain *genpd)
>> +{
>> + int ret;
>> +
>> + mutex_lock(&gpd_list_lock);
>> + ret = __pm_genpd_remove(genpd);
>> + mutex_unlock(&gpd_list_lock);
>> +
>> + return ret;
>> +}
>> +
>> +/**
>> + * pm_genpd_remove_tail - Remove the last PM domain registered for a provider
>> + * @provider: Pointer to device structure associated with provider
>> + *
>> + * Find the last PM domain that was added by the provider whose 'provider'
>> + * device structure matches the device structure given. The 'provider'
>> + * device structure for a given PM domain should be initialised by the
>> + * device that is creating the PM domains and hence, calling
>> + * pm_genpd_init().
>
> Maybe make this a bigger "Important note" as what is needed to
> actually benefit from using this function.
Yes, good point. Will update.
Cheers
Jon
--
nvpublic
next prev parent reply other threads:[~2016-06-21 14:08 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-04 11:23 [RFC PATCH 0/8] PM / Domains: Add support for removing PM domains Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-03-04 11:23 ` [RFC PATCH 3/8] staging: board: Remove calls to of_genpd_get_from_provider() Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-03-04 11:23 ` [RFC PATCH 4/8] PM / Domains: Don't expose generic_pm_domain structure Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-08-05 11:55 ` Ulf Hansson
2016-08-05 11:55 ` Ulf Hansson
2016-03-04 11:23 ` [RFC PATCH 6/8] PM / Domains: Remove a provider by referencing the data pointer Jon Hunter
2016-03-04 11:23 ` Jon Hunter
[not found] ` <1457090634-14785-7-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-06-15 14:38 ` Ulf Hansson
2016-06-15 14:38 ` Ulf Hansson
2016-06-21 13:47 ` Jon Hunter
2016-06-21 13:47 ` Jon Hunter
[not found] ` <5769455C.9010809-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-07-11 13:14 ` Jon Hunter
2016-07-11 13:14 ` Jon Hunter
2016-08-05 11:55 ` Ulf Hansson
2016-08-05 11:55 ` Ulf Hansson
[not found] ` <CAPDyKFovC07Z9y-4RQ4MKGtjJx5w1D8er3Fv-8HF2qyTKgVViQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-08-11 16:39 ` Jon Hunter
2016-08-11 16:39 ` Jon Hunter
[not found] ` <18ad702c-83fe-fd6d-89ae-57e6f2715860-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-08-12 0:24 ` Rafael J. Wysocki
2016-08-12 0:24 ` Rafael J. Wysocki
2016-06-21 14:45 ` Jon Hunter
2016-06-21 14:45 ` Jon Hunter
2016-03-04 11:23 ` [RFC PATCH 8/8] PM / Domains: Add support for removing PM domains Jon Hunter
2016-03-04 11:23 ` Jon Hunter
[not found] ` <1457090634-14785-9-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-06-15 14:33 ` Ulf Hansson
2016-06-15 14:33 ` Ulf Hansson
2016-06-21 14:08 ` Jon Hunter [this message]
2016-06-21 14:08 ` Jon Hunter
[not found] ` <1457090634-14785-1-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-03-04 11:23 ` [RFC PATCH 1/8] PM / Domains: Add new helper functions for device-tree Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-06-22 11:00 ` Jon Hunter
2016-06-22 11:00 ` Jon Hunter
2016-06-22 14:58 ` Jon Hunter
2016-06-22 14:58 ` Jon Hunter
2016-06-22 15:08 ` Ulf Hansson
2016-06-22 15:08 ` Ulf Hansson
2016-06-22 15:22 ` Jon Hunter
2016-06-22 15:22 ` Jon Hunter
2016-06-22 15:36 ` Ulf Hansson
2016-06-22 15:36 ` Ulf Hansson
2016-03-04 11:23 ` [RFC PATCH 2/8] ARM: EXYNOS: Remove calls to of_genpd_get_from_provider() Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-03-04 11:23 ` [RFC PATCH 5/8] PM / Domains: Verify the PM domain is present when adding a provider Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-08-05 11:57 ` Ulf Hansson
2016-08-05 11:57 ` Ulf Hansson
2016-03-04 11:23 ` [RFC PATCH 7/8] PM / Domains: Prepare for adding support to remove PM domains Jon Hunter
2016-03-04 11:23 ` Jon Hunter
2016-03-04 12:33 ` [RFC PATCH 0/8] PM / Domains: Add support for removing " Ulf Hansson
2016-03-04 12:33 ` Ulf Hansson
[not found] ` <CAPDyKFq3hNARzjSOoP+-NmcgfSWzG6GDmh7qVX6yx6QPgN9Arw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-03-28 12:38 ` Jon Hunter
2016-03-28 12:38 ` Jon Hunter
[not found] ` <56F925D9.3080703-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-06-06 13:19 ` Jon Hunter
2016-06-06 13:19 ` Jon Hunter
2016-06-15 14:46 ` Ulf Hansson
2016-06-15 14:46 ` Ulf Hansson
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=57694A72.6090202@nvidia.com \
--to=jonathanh@nvidia.com \
--cc=alex.aring@gmail.com \
--cc=eric@anholt.net \
--cc=k.kozlowski@samsung.com \
--cc=kgene@kernel.org \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=thierry.reding@gmail.com \
--cc=ulf.hansson@linaro.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.