Thread (20 messages) 20 messages, 3 authors, 2026-03-20

Re: [PATCH 4/9] pmdomain: core: Add initial fine grained sync_state support

From: Ulf Hansson <hidden>
Date: 2026-03-20 10:12:05
Also in: linux-pm, lkml

On Fri, 20 Mar 2026 at 10:29, Geert Uytterhoeven [off-list ref] wrote:
Hi Ulf,

Thanks for your patch!

On Tue, 3 Mar 2026 at 14:23, Ulf Hansson [off-list ref] wrote:
quoted
A onecell (#power-domain-cells = <1 or 2>; in DT) power domain provider
typically provides multiple independent power domains, each with their own
corresponding consumers. In these cases we have to wait for all consumers
for all the provided power domains before the ->sync_state() callback gets
called for the supplier.

In a first step to improve this, let's implement support for fine grained
sync_state support a per genpd basis by using the ->queue_sync_state()
... support on a ...
quoted
callback. To take step by step, let's initially limit the improvement to
the internal genpd provider driver and to its corresponding genpd devices
for onecell providers.

Signed-off-by: Ulf Hansson <redacted>
quoted
--- a/drivers/pmdomain/core.c
+++ b/drivers/pmdomain/core.c
quoted
+static void genpd_queue_sync_state(struct device *dev)
+{
+       struct device_node *np = dev->of_node;
+       struct device_link *link;
+
+       if (!genpd_should_wait_for_consumer(np))
+               return;
+
+       list_for_each_entry(link, &dev->links.consumers, s_node) {
+               struct device *consumer = link->consumer;
+
+               pr_info("%s:%s con=%s\n", __func__, dev_name(dev),
+                       dev_name(consumer));
pr_debug? Or better, dev_dbg(), so you don't have to add dev_name(dev)
explicitly.

However, the printed provider name is again the name of the first
domain.  This is incorrect for all but the first domain of a onecell
genpd provider, and thus confusing.
I agree, I think we should drop the print. In fact, this is a
left-over from my debugging, I didn't intend for it to be part of the
submission.

Although, perhaps there is a need for pr_debug/dev_dbg somewhere, but
I think we can better add those in separate patches on top instead.
quoted
+
+               if (!device_link_test(link, DL_FLAG_MANAGED))
+                       continue;
+
+               if (link->status == DL_STATE_ACTIVE)
+                       continue;
+
+               if (!consumer->of_node)
+                       continue;
+
+               /*
+                * A consumer device has not been probed yet. Let's parse its
+                * device node for the power-domains property, to find out the
+                * genpds it may belong to and then prevent sync state for them.
+                */
+               genpd_parse_for_consumer(np, consumer->of_node);
+       }
+
+       _genpd_queue_sync_state(np);
+}
+
 static void genpd_sync_state(struct device *dev)
 {
        return of_genpd_sync_state(dev->of_node);
Thanks for reviewing!

Kind regards
Uffe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help