Message ID | 20230126234013.3638425-1-abel.vesa@linaro.org |
---|---|
State | New |
Headers | show |
Series | [RFC] PM: domains: Skip disabling unused domains if provider has sync_state | expand |
On 23-01-27 01:40:13, Abel Vesa wrote: > Currently, there are cases when a domain needs to remain enabled until > the consumer driver probes. Sometimes such consumer drivers may be built > as modules. Since the genpd_power_off_unused is called too early for > such consumer driver modules to get a chance to probe, the domain, since > it is unused, will get disabled. On the other hand, the best time for > an unused domain to be disabled is on the provider's sync_state > callback. So, if the provider has registered a sync_state callback, > assume the unused domains for that provider will be disabled on its > sync_state callback. > > Signed-off-by: Abel Vesa <abel.vesa@linaro.org> Please ignore this version as it is only part of the solution. Have a look at v2 here: https://lore.kernel.org/lkml/20230127104054.895129-1-abel.vesa@linaro.org/ > --- > > This approach has been applied for unused clocks as well. > With this patch merged in, all the providers that have sync_state > callback registered will leave the domains enabled unless the provider's > sync_state callback explicitly disables them. So those providers will > need to add the disabling part to their sync_state callback. On the > other hand, the platforms that have cases where domains need to remain > enabled (even if unused) until the consumer driver probes, will be able, > with this patch in, to run without the pd_ignore_unused kernel argument, > which seems to be the case for most Qualcomm platforms, at this moment. > > drivers/base/power/domain.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c > index 84662d338188..8e72e8e38c77 100644 > --- a/drivers/base/power/domain.c > +++ b/drivers/base/power/domain.c > @@ -1099,7 +1099,8 @@ static int __init genpd_power_off_unused(void) > mutex_lock(&gpd_list_lock); > > list_for_each_entry(genpd, &gpd_list, gpd_list_node) > - genpd_queue_power_off_work(genpd); > + if (!dev_has_sync_state(genpd->provider->dev)) > + genpd_queue_power_off_work(genpd); > > mutex_unlock(&gpd_list_lock); > > -- > 2.34.1 >
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 84662d338188..8e72e8e38c77 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -1099,7 +1099,8 @@ static int __init genpd_power_off_unused(void) mutex_lock(&gpd_list_lock); list_for_each_entry(genpd, &gpd_list, gpd_list_node) - genpd_queue_power_off_work(genpd); + if (!dev_has_sync_state(genpd->provider->dev)) + genpd_queue_power_off_work(genpd); mutex_unlock(&gpd_list_lock);
Currently, there are cases when a domain needs to remain enabled until the consumer driver probes. Sometimes such consumer drivers may be built as modules. Since the genpd_power_off_unused is called too early for such consumer driver modules to get a chance to probe, the domain, since it is unused, will get disabled. On the other hand, the best time for an unused domain to be disabled is on the provider's sync_state callback. So, if the provider has registered a sync_state callback, assume the unused domains for that provider will be disabled on its sync_state callback. Signed-off-by: Abel Vesa <abel.vesa@linaro.org> --- This approach has been applied for unused clocks as well. With this patch merged in, all the providers that have sync_state callback registered will leave the domains enabled unless the provider's sync_state callback explicitly disables them. So those providers will need to add the disabling part to their sync_state callback. On the other hand, the platforms that have cases where domains need to remain enabled (even if unused) until the consumer driver probes, will be able, with this patch in, to run without the pd_ignore_unused kernel argument, which seems to be the case for most Qualcomm platforms, at this moment. drivers/base/power/domain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)