* [PATCH v2 2/2] pmdomain: rockchip: report domain errors once, with dev_err_probe()
@ 2026-11-12 8:23 ` Arun Iyengar
0 siblings, 0 replies; 13+ messages in thread
From: Arun Iyengar via B4 Relay @ 2026-11-12 8:23 UTC (permalink / raw)
To: Ulf Hansson, Heiko Stuebner, Shawn Lin, Sebastian Reichel,
Kevin Hilman, Caesar Wang, Elaine Zhang
Cc: linux-pm, linux-arm-kernel, linux-rockchip, linux-kernel, Yao Zi,
Igor Pecovnik, Arun Iyengar
From: Arun Iyengar <aiyengar1990@gmail.com>
When a power domain clock is not available yet,
rockchip_pm_add_one_domain() returns -EPROBE_DEFER, and both it and its
callers rockchip_pm_domain_probe() and rockchip_pm_add_subdomain() print
that with dev_err():
rockchip-pm-domain ...: power-domain: failed to get clk at index 1: -517
rockchip-pm-domain ...: failed to handle node power-domain: -517
once per probe attempt, and the second line twice for a nested domain.
On an RK3588 board whose NPU domain clock appears late this is more than
20 error lines before the domain finally probes, and the reason of the
deferral is not recorded. Other failures are reported twice (once where
they happen and once by the callers), or only by the callers, which name
the node but not what failed: a missing pm_qos phandle and a pm_qos node
without a regmap print nothing in rockchip_pm_add_one_domain(), and a
failed clk_bulk_prepare() only has the message of the clk core, which
names neither the device nor the domain.
Report every error once, where it happens, with dev_err_probe(), and
drop the "failed to handle (subdomain) node" messages from the callers.
A deferral is then quiet and keeps its specific reason in
/sys/kernel/debug/devices_deferred, such as "failed to get clk at index
1", and -ENOMEM, which the callers used to print, is quiet as well. The
return values are unchanged, except that a failed
syscon_node_to_regmap() for a pm_qos node now returns its own error
instead of -ENODEV: it can be -EPROBE_DEFER (a syscon regmap that is
not registered yet, or a syscon clock or hwlock that is not available
yet), which must not turn into a probe failure.
Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
Suggested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
---
drivers/pmdomain/rockchip/pm-domains.c | 98 +++++++++++++++-------------------
1 file changed, 43 insertions(+), 55 deletions(-)
diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
index 00c7e78f89b5..be077fb52f40 100644
--- a/drivers/pmdomain/rockchip/pm-domains.c
+++ b/drivers/pmdomain/rockchip/pm-domains.c
@@ -804,28 +804,22 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
int error;
error = of_property_read_u32(node, "reg", &id);
- if (error) {
- dev_err(pmu->dev,
- "%pOFn: failed to retrieve domain id (reg): %d\n",
- node, error);
- return -EINVAL;
- }
+ if (error)
+ return dev_err_probe(pmu->dev, -EINVAL,
+ "%pOFn: failed to retrieve domain id (reg)\n",
+ node);
- if (id >= pmu->info->num_domains) {
- dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
- node, id);
- return -EINVAL;
- }
+ if (id >= pmu->info->num_domains)
+ return dev_err_probe(pmu->dev, -EINVAL,
+ "%pOFn: invalid domain id %d\n", node, id);
/* RK3588 has domains with two parents (RKVDEC0/RKVDEC1) */
if (pmu->genpd_data.domains[id])
return 0;
pd_info = &pmu->info->domain_info[id];
- if (!pd_info->pwr_mask && !pd_info->req_mask) {
- dev_err(pmu->dev, "%pOFn: undefined domain id %d\n",
- node, id);
- return -EINVAL;
- }
+ if (!pd_info->pwr_mask && !pd_info->req_mask)
+ return dev_err_probe(pmu->dev, -EINVAL,
+ "%pOFn: undefined domain id %d\n", node, id);
pd = devm_kzalloc_obj(pmu->dev, *pd);
if (!pd)
@@ -849,17 +843,20 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
for (i = 0; i < pd->num_clks; i++) {
pd->clks[i].clk = of_clk_get(node, i);
if (IS_ERR(pd->clks[i].clk)) {
- error = PTR_ERR(pd->clks[i].clk);
- dev_err(pmu->dev,
- "%pOFn: failed to get clk at index %d: %d\n",
- node, i, error);
+ error = dev_err_probe(pmu->dev,
+ PTR_ERR(pd->clks[i].clk),
+ "%pOFn: failed to get clk at index %d\n",
+ node, i);
goto err_put_clocks;
}
}
error = clk_bulk_prepare(pd->num_clks, pd->clks);
- if (error)
+ if (error) {
+ dev_err_probe(pmu->dev, error,
+ "%pOFn: failed to prepare clocks\n", node);
goto err_put_clocks;
+ }
pd->num_qos = of_count_phandle_with_args(node, "pm_qos",
NULL);
@@ -884,13 +881,18 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
for (j = 0; j < pd->num_qos; j++) {
qos_node = of_parse_phandle(node, "pm_qos", j);
if (!qos_node) {
- error = -ENODEV;
+ error = dev_err_probe(pmu->dev, -ENODEV,
+ "%pOFn: failed to get pm_qos %d\n",
+ node, j);
goto err_unprepare_clocks;
}
pd->qos_regmap[j] = syscon_node_to_regmap(qos_node);
of_node_put(qos_node);
if (IS_ERR(pd->qos_regmap[j])) {
- error = -ENODEV;
+ error = dev_err_probe(pmu->dev,
+ PTR_ERR(pd->qos_regmap[j]),
+ "%pOFn: failed to get pm_qos %d regmap\n",
+ node, j);
goto err_unprepare_clocks;
}
}
@@ -1038,39 +1040,31 @@ static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu,
u32 idx;
error = of_property_read_u32(parent, "reg", &idx);
- if (error) {
- dev_err(pmu->dev,
- "%pOFn: failed to retrieve domain id (reg): %d\n",
- parent, error);
- return error;
- }
+ if (error)
+ return dev_err_probe(pmu->dev, error,
+ "%pOFn: failed to retrieve domain id (reg)\n",
+ parent);
parent_domain = pmu->genpd_data.domains[idx];
error = rockchip_pm_add_one_domain(pmu, np);
- if (error) {
- dev_err(pmu->dev, "failed to handle node %pOFn: %d\n",
- np, error);
+ if (error)
return error;
- }
error = of_property_read_u32(np, "reg", &idx);
- if (error) {
- dev_err(pmu->dev,
- "%pOFn: failed to retrieve domain id (reg): %d\n",
- np, error);
- return error;
- }
+ if (error)
+ return dev_err_probe(pmu->dev, error,
+ "%pOFn: failed to retrieve domain id (reg)\n",
+ np);
child_domain = pmu->genpd_data.domains[idx];
error = pm_genpd_add_subdomain(parent_domain, child_domain);
- if (error) {
- dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n",
- parent_domain->name, child_domain->name, error);
- return error;
- } else {
- dev_dbg(pmu->dev, "%s add subdomain: %s\n",
- parent_domain->name, child_domain->name);
- }
+ if (error)
+ return dev_err_probe(pmu->dev, error,
+ "%s failed to add subdomain %s\n",
+ parent_domain->name, child_domain->name);
+
+ dev_dbg(pmu->dev, "%s add subdomain: %s\n",
+ parent_domain->name, child_domain->name);
error = rockchip_pm_add_subdomain(pmu, np);
if (error)
@@ -1141,18 +1135,12 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev)
for_each_available_child_of_node_scoped(np, node) {
error = rockchip_pm_add_one_domain(pmu, node);
- if (error) {
- dev_err(dev, "failed to handle node %pOFn: %d\n",
- node, error);
+ if (error)
goto err_out;
- }
error = rockchip_pm_add_subdomain(pmu, node);
- if (error < 0) {
- dev_err(dev, "failed to handle subdomain node %pOFn: %d\n",
- node, error);
+ if (error < 0)
goto err_out;
- }
}
if (error) {
--
2.55.0
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v2 2/2] pmdomain: rockchip: report domain errors once, with dev_err_probe()
@ 2026-11-12 8:23 ` Arun Iyengar
0 siblings, 0 replies; 13+ messages in thread
From: Arun Iyengar @ 2026-11-12 8:23 UTC (permalink / raw)
To: Ulf Hansson, Heiko Stuebner, Shawn Lin, Sebastian Reichel,
Kevin Hilman, Caesar Wang, Elaine Zhang
Cc: linux-pm, linux-arm-kernel, linux-rockchip, linux-kernel, Yao Zi,
Igor Pecovnik, Arun Iyengar
When a power domain clock is not available yet,
rockchip_pm_add_one_domain() returns -EPROBE_DEFER, and both it and its
callers rockchip_pm_domain_probe() and rockchip_pm_add_subdomain() print
that with dev_err():
rockchip-pm-domain ...: power-domain: failed to get clk at index 1: -517
rockchip-pm-domain ...: failed to handle node power-domain: -517
once per probe attempt, and the second line twice for a nested domain.
On an RK3588 board whose NPU domain clock appears late this is more than
20 error lines before the domain finally probes, and the reason of the
deferral is not recorded. Other failures are reported twice (once where
they happen and once by the callers), or only by the callers, which name
the node but not what failed: a missing pm_qos phandle and a pm_qos node
without a regmap print nothing in rockchip_pm_add_one_domain(), and a
failed clk_bulk_prepare() only has the message of the clk core, which
names neither the device nor the domain.
Report every error once, where it happens, with dev_err_probe(), and
drop the "failed to handle (subdomain) node" messages from the callers.
A deferral is then quiet and keeps its specific reason in
/sys/kernel/debug/devices_deferred, such as "failed to get clk at index
1", and -ENOMEM, which the callers used to print, is quiet as well. The
return values are unchanged, except that a failed
syscon_node_to_regmap() for a pm_qos node now returns its own error
instead of -ENODEV: it can be -EPROBE_DEFER (a syscon regmap that is
not registered yet, or a syscon clock or hwlock that is not available
yet), which must not turn into a probe failure.
Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
Suggested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
---
drivers/pmdomain/rockchip/pm-domains.c | 98 +++++++++++++++-------------------
1 file changed, 43 insertions(+), 55 deletions(-)
diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
index 00c7e78f89b5..be077fb52f40 100644
--- a/drivers/pmdomain/rockchip/pm-domains.c
+++ b/drivers/pmdomain/rockchip/pm-domains.c
@@ -804,28 +804,22 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
int error;
error = of_property_read_u32(node, "reg", &id);
- if (error) {
- dev_err(pmu->dev,
- "%pOFn: failed to retrieve domain id (reg): %d\n",
- node, error);
- return -EINVAL;
- }
+ if (error)
+ return dev_err_probe(pmu->dev, -EINVAL,
+ "%pOFn: failed to retrieve domain id (reg)\n",
+ node);
- if (id >= pmu->info->num_domains) {
- dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
- node, id);
- return -EINVAL;
- }
+ if (id >= pmu->info->num_domains)
+ return dev_err_probe(pmu->dev, -EINVAL,
+ "%pOFn: invalid domain id %d\n", node, id);
/* RK3588 has domains with two parents (RKVDEC0/RKVDEC1) */
if (pmu->genpd_data.domains[id])
return 0;
pd_info = &pmu->info->domain_info[id];
- if (!pd_info->pwr_mask && !pd_info->req_mask) {
- dev_err(pmu->dev, "%pOFn: undefined domain id %d\n",
- node, id);
- return -EINVAL;
- }
+ if (!pd_info->pwr_mask && !pd_info->req_mask)
+ return dev_err_probe(pmu->dev, -EINVAL,
+ "%pOFn: undefined domain id %d\n", node, id);
pd = devm_kzalloc_obj(pmu->dev, *pd);
if (!pd)
@@ -849,17 +843,20 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
for (i = 0; i < pd->num_clks; i++) {
pd->clks[i].clk = of_clk_get(node, i);
if (IS_ERR(pd->clks[i].clk)) {
- error = PTR_ERR(pd->clks[i].clk);
- dev_err(pmu->dev,
- "%pOFn: failed to get clk at index %d: %d\n",
- node, i, error);
+ error = dev_err_probe(pmu->dev,
+ PTR_ERR(pd->clks[i].clk),
+ "%pOFn: failed to get clk at index %d\n",
+ node, i);
goto err_put_clocks;
}
}
error = clk_bulk_prepare(pd->num_clks, pd->clks);
- if (error)
+ if (error) {
+ dev_err_probe(pmu->dev, error,
+ "%pOFn: failed to prepare clocks\n", node);
goto err_put_clocks;
+ }
pd->num_qos = of_count_phandle_with_args(node, "pm_qos",
NULL);
@@ -884,13 +881,18 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
for (j = 0; j < pd->num_qos; j++) {
qos_node = of_parse_phandle(node, "pm_qos", j);
if (!qos_node) {
- error = -ENODEV;
+ error = dev_err_probe(pmu->dev, -ENODEV,
+ "%pOFn: failed to get pm_qos %d\n",
+ node, j);
goto err_unprepare_clocks;
}
pd->qos_regmap[j] = syscon_node_to_regmap(qos_node);
of_node_put(qos_node);
if (IS_ERR(pd->qos_regmap[j])) {
- error = -ENODEV;
+ error = dev_err_probe(pmu->dev,
+ PTR_ERR(pd->qos_regmap[j]),
+ "%pOFn: failed to get pm_qos %d regmap\n",
+ node, j);
goto err_unprepare_clocks;
}
}
@@ -1038,39 +1040,31 @@ static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu,
u32 idx;
error = of_property_read_u32(parent, "reg", &idx);
- if (error) {
- dev_err(pmu->dev,
- "%pOFn: failed to retrieve domain id (reg): %d\n",
- parent, error);
- return error;
- }
+ if (error)
+ return dev_err_probe(pmu->dev, error,
+ "%pOFn: failed to retrieve domain id (reg)\n",
+ parent);
parent_domain = pmu->genpd_data.domains[idx];
error = rockchip_pm_add_one_domain(pmu, np);
- if (error) {
- dev_err(pmu->dev, "failed to handle node %pOFn: %d\n",
- np, error);
+ if (error)
return error;
- }
error = of_property_read_u32(np, "reg", &idx);
- if (error) {
- dev_err(pmu->dev,
- "%pOFn: failed to retrieve domain id (reg): %d\n",
- np, error);
- return error;
- }
+ if (error)
+ return dev_err_probe(pmu->dev, error,
+ "%pOFn: failed to retrieve domain id (reg)\n",
+ np);
child_domain = pmu->genpd_data.domains[idx];
error = pm_genpd_add_subdomain(parent_domain, child_domain);
- if (error) {
- dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n",
- parent_domain->name, child_domain->name, error);
- return error;
- } else {
- dev_dbg(pmu->dev, "%s add subdomain: %s\n",
- parent_domain->name, child_domain->name);
- }
+ if (error)
+ return dev_err_probe(pmu->dev, error,
+ "%s failed to add subdomain %s\n",
+ parent_domain->name, child_domain->name);
+
+ dev_dbg(pmu->dev, "%s add subdomain: %s\n",
+ parent_domain->name, child_domain->name);
error = rockchip_pm_add_subdomain(pmu, np);
if (error)
@@ -1141,18 +1135,12 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev)
for_each_available_child_of_node_scoped(np, node) {
error = rockchip_pm_add_one_domain(pmu, node);
- if (error) {
- dev_err(dev, "failed to handle node %pOFn: %d\n",
- node, error);
+ if (error)
goto err_out;
- }
error = rockchip_pm_add_subdomain(pmu, node);
- if (error < 0) {
- dev_err(dev, "failed to handle subdomain node %pOFn: %d\n",
- node, error);
+ if (error < 0)
goto err_out;
- }
}
if (error) {
--
2.55.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 2/2] pmdomain: rockchip: report domain errors once, with dev_err_probe()
2026-11-12 8:23 ` Arun Iyengar
@ 2026-11-12 10:02 ` Heiko Stübner
-1 siblings, 0 replies; 13+ messages in thread
From: Heiko Stübner @ 2026-11-12 10:02 UTC (permalink / raw)
To: Ulf Hansson, Shawn Lin, Sebastian Reichel, Kevin Hilman,
Caesar Wang, Elaine Zhang, aiyengar1990
Cc: linux-pm, linux-arm-kernel, linux-rockchip, linux-kernel, Yao Zi,
Igor Pecovnik, Arun Iyengar
Am Donnerstag, 12. November 2026, 09:23:30 Mitteleuropäische Normalzeit schrieb Arun Iyengar via B4 Relay:
> From: Arun Iyengar <aiyengar1990@gmail.com>
>
> When a power domain clock is not available yet,
> rockchip_pm_add_one_domain() returns -EPROBE_DEFER, and both it and its
> callers rockchip_pm_domain_probe() and rockchip_pm_add_subdomain() print
> that with dev_err():
>
> rockchip-pm-domain ...: power-domain: failed to get clk at index 1: -517
> rockchip-pm-domain ...: failed to handle node power-domain: -517
>
> once per probe attempt, and the second line twice for a nested domain.
> On an RK3588 board whose NPU domain clock appears late this is more than
> 20 error lines before the domain finally probes, and the reason of the
> deferral is not recorded. Other failures are reported twice (once where
> they happen and once by the callers), or only by the callers, which name
> the node but not what failed: a missing pm_qos phandle and a pm_qos node
> without a regmap print nothing in rockchip_pm_add_one_domain(), and a
> failed clk_bulk_prepare() only has the message of the clk core, which
> names neither the device nor the domain.
>
> Report every error once, where it happens, with dev_err_probe(), and
> drop the "failed to handle (subdomain) node" messages from the callers.
> A deferral is then quiet and keeps its specific reason in
> /sys/kernel/debug/devices_deferred, such as "failed to get clk at index
> 1", and -ENOMEM, which the callers used to print, is quiet as well. The
> return values are unchanged, except that a failed
> syscon_node_to_regmap() for a pm_qos node now returns its own error
> instead of -ENODEV: it can be -EPROBE_DEFER (a syscon regmap that is
> not registered yet, or a syscon clock or hwlock that is not available
> yet), which must not turn into a probe failure.
>
> Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
> Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
> Suggested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
code change itself looks fine, but pretty please cut down the text length
in all your patches a lot.
You're simply converting to dev_err_probe here to not show defer messages.
This does definitly not need 3 quite long paragraphs of text.
This applys for all patches you sent recently :-) .
Same is true for the big'ish comment blocks you have in patch1 of this
series (and other series too). They should be short and to the point.
If needed people can get deeper information reading the actual code.
Thanks
Heiko
> ---
> drivers/pmdomain/rockchip/pm-domains.c | 98 +++++++++++++++-------------------
> 1 file changed, 43 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
> index 00c7e78f89b5..be077fb52f40 100644
> --- a/drivers/pmdomain/rockchip/pm-domains.c
> +++ b/drivers/pmdomain/rockchip/pm-domains.c
> @@ -804,28 +804,22 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> int error;
>
> error = of_property_read_u32(node, "reg", &id);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - node, error);
> - return -EINVAL;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + node);
>
> - if (id >= pmu->info->num_domains) {
> - dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
> - node, id);
> - return -EINVAL;
> - }
> + if (id >= pmu->info->num_domains)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: invalid domain id %d\n", node, id);
> /* RK3588 has domains with two parents (RKVDEC0/RKVDEC1) */
> if (pmu->genpd_data.domains[id])
> return 0;
>
> pd_info = &pmu->info->domain_info[id];
> - if (!pd_info->pwr_mask && !pd_info->req_mask) {
> - dev_err(pmu->dev, "%pOFn: undefined domain id %d\n",
> - node, id);
> - return -EINVAL;
> - }
> + if (!pd_info->pwr_mask && !pd_info->req_mask)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: undefined domain id %d\n", node, id);
>
> pd = devm_kzalloc_obj(pmu->dev, *pd);
> if (!pd)
> @@ -849,17 +843,20 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> for (i = 0; i < pd->num_clks; i++) {
> pd->clks[i].clk = of_clk_get(node, i);
> if (IS_ERR(pd->clks[i].clk)) {
> - error = PTR_ERR(pd->clks[i].clk);
> - dev_err(pmu->dev,
> - "%pOFn: failed to get clk at index %d: %d\n",
> - node, i, error);
> + error = dev_err_probe(pmu->dev,
> + PTR_ERR(pd->clks[i].clk),
> + "%pOFn: failed to get clk at index %d\n",
> + node, i);
> goto err_put_clocks;
> }
> }
>
> error = clk_bulk_prepare(pd->num_clks, pd->clks);
> - if (error)
> + if (error) {
> + dev_err_probe(pmu->dev, error,
> + "%pOFn: failed to prepare clocks\n", node);
> goto err_put_clocks;
> + }
>
> pd->num_qos = of_count_phandle_with_args(node, "pm_qos",
> NULL);
> @@ -884,13 +881,18 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> for (j = 0; j < pd->num_qos; j++) {
> qos_node = of_parse_phandle(node, "pm_qos", j);
> if (!qos_node) {
> - error = -ENODEV;
> + error = dev_err_probe(pmu->dev, -ENODEV,
> + "%pOFn: failed to get pm_qos %d\n",
> + node, j);
> goto err_unprepare_clocks;
> }
> pd->qos_regmap[j] = syscon_node_to_regmap(qos_node);
> of_node_put(qos_node);
> if (IS_ERR(pd->qos_regmap[j])) {
> - error = -ENODEV;
> + error = dev_err_probe(pmu->dev,
> + PTR_ERR(pd->qos_regmap[j]),
> + "%pOFn: failed to get pm_qos %d regmap\n",
> + node, j);
> goto err_unprepare_clocks;
> }
> }
> @@ -1038,39 +1040,31 @@ static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu,
> u32 idx;
>
> error = of_property_read_u32(parent, "reg", &idx);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - parent, error);
> - return error;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, error,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + parent);
> parent_domain = pmu->genpd_data.domains[idx];
>
> error = rockchip_pm_add_one_domain(pmu, np);
> - if (error) {
> - dev_err(pmu->dev, "failed to handle node %pOFn: %d\n",
> - np, error);
> + if (error)
> return error;
> - }
>
> error = of_property_read_u32(np, "reg", &idx);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - np, error);
> - return error;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, error,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + np);
> child_domain = pmu->genpd_data.domains[idx];
>
> error = pm_genpd_add_subdomain(parent_domain, child_domain);
> - if (error) {
> - dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n",
> - parent_domain->name, child_domain->name, error);
> - return error;
> - } else {
> - dev_dbg(pmu->dev, "%s add subdomain: %s\n",
> - parent_domain->name, child_domain->name);
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, error,
> + "%s failed to add subdomain %s\n",
> + parent_domain->name, child_domain->name);
> +
> + dev_dbg(pmu->dev, "%s add subdomain: %s\n",
> + parent_domain->name, child_domain->name);
>
> error = rockchip_pm_add_subdomain(pmu, np);
> if (error)
> @@ -1141,18 +1135,12 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev)
>
> for_each_available_child_of_node_scoped(np, node) {
> error = rockchip_pm_add_one_domain(pmu, node);
> - if (error) {
> - dev_err(dev, "failed to handle node %pOFn: %d\n",
> - node, error);
> + if (error)
> goto err_out;
> - }
>
> error = rockchip_pm_add_subdomain(pmu, node);
> - if (error < 0) {
> - dev_err(dev, "failed to handle subdomain node %pOFn: %d\n",
> - node, error);
> + if (error < 0)
> goto err_out;
> - }
> }
>
> if (error) {
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v2 2/2] pmdomain: rockchip: report domain errors once, with dev_err_probe()
@ 2026-11-12 10:02 ` Heiko Stübner
0 siblings, 0 replies; 13+ messages in thread
From: Heiko Stübner @ 2026-11-12 10:02 UTC (permalink / raw)
To: Ulf Hansson, Shawn Lin, Sebastian Reichel, Kevin Hilman,
Caesar Wang, Elaine Zhang, aiyengar1990
Cc: linux-pm, linux-arm-kernel, linux-rockchip, linux-kernel, Yao Zi,
Igor Pecovnik, Arun Iyengar
Am Donnerstag, 12. November 2026, 09:23:30 Mitteleuropäische Normalzeit schrieb Arun Iyengar via B4 Relay:
> From: Arun Iyengar <aiyengar1990@gmail.com>
>
> When a power domain clock is not available yet,
> rockchip_pm_add_one_domain() returns -EPROBE_DEFER, and both it and its
> callers rockchip_pm_domain_probe() and rockchip_pm_add_subdomain() print
> that with dev_err():
>
> rockchip-pm-domain ...: power-domain: failed to get clk at index 1: -517
> rockchip-pm-domain ...: failed to handle node power-domain: -517
>
> once per probe attempt, and the second line twice for a nested domain.
> On an RK3588 board whose NPU domain clock appears late this is more than
> 20 error lines before the domain finally probes, and the reason of the
> deferral is not recorded. Other failures are reported twice (once where
> they happen and once by the callers), or only by the callers, which name
> the node but not what failed: a missing pm_qos phandle and a pm_qos node
> without a regmap print nothing in rockchip_pm_add_one_domain(), and a
> failed clk_bulk_prepare() only has the message of the clk core, which
> names neither the device nor the domain.
>
> Report every error once, where it happens, with dev_err_probe(), and
> drop the "failed to handle (subdomain) node" messages from the callers.
> A deferral is then quiet and keeps its specific reason in
> /sys/kernel/debug/devices_deferred, such as "failed to get clk at index
> 1", and -ENOMEM, which the callers used to print, is quiet as well. The
> return values are unchanged, except that a failed
> syscon_node_to_regmap() for a pm_qos node now returns its own error
> instead of -ENODEV: it can be -EPROBE_DEFER (a syscon regmap that is
> not registered yet, or a syscon clock or hwlock that is not available
> yet), which must not turn into a probe failure.
>
> Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
> Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
> Suggested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
code change itself looks fine, but pretty please cut down the text length
in all your patches a lot.
You're simply converting to dev_err_probe here to not show defer messages.
This does definitly not need 3 quite long paragraphs of text.
This applys for all patches you sent recently :-) .
Same is true for the big'ish comment blocks you have in patch1 of this
series (and other series too). They should be short and to the point.
If needed people can get deeper information reading the actual code.
Thanks
Heiko
> ---
> drivers/pmdomain/rockchip/pm-domains.c | 98 +++++++++++++++-------------------
> 1 file changed, 43 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
> index 00c7e78f89b5..be077fb52f40 100644
> --- a/drivers/pmdomain/rockchip/pm-domains.c
> +++ b/drivers/pmdomain/rockchip/pm-domains.c
> @@ -804,28 +804,22 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> int error;
>
> error = of_property_read_u32(node, "reg", &id);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - node, error);
> - return -EINVAL;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + node);
>
> - if (id >= pmu->info->num_domains) {
> - dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
> - node, id);
> - return -EINVAL;
> - }
> + if (id >= pmu->info->num_domains)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: invalid domain id %d\n", node, id);
> /* RK3588 has domains with two parents (RKVDEC0/RKVDEC1) */
> if (pmu->genpd_data.domains[id])
> return 0;
>
> pd_info = &pmu->info->domain_info[id];
> - if (!pd_info->pwr_mask && !pd_info->req_mask) {
> - dev_err(pmu->dev, "%pOFn: undefined domain id %d\n",
> - node, id);
> - return -EINVAL;
> - }
> + if (!pd_info->pwr_mask && !pd_info->req_mask)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: undefined domain id %d\n", node, id);
>
> pd = devm_kzalloc_obj(pmu->dev, *pd);
> if (!pd)
> @@ -849,17 +843,20 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> for (i = 0; i < pd->num_clks; i++) {
> pd->clks[i].clk = of_clk_get(node, i);
> if (IS_ERR(pd->clks[i].clk)) {
> - error = PTR_ERR(pd->clks[i].clk);
> - dev_err(pmu->dev,
> - "%pOFn: failed to get clk at index %d: %d\n",
> - node, i, error);
> + error = dev_err_probe(pmu->dev,
> + PTR_ERR(pd->clks[i].clk),
> + "%pOFn: failed to get clk at index %d\n",
> + node, i);
> goto err_put_clocks;
> }
> }
>
> error = clk_bulk_prepare(pd->num_clks, pd->clks);
> - if (error)
> + if (error) {
> + dev_err_probe(pmu->dev, error,
> + "%pOFn: failed to prepare clocks\n", node);
> goto err_put_clocks;
> + }
>
> pd->num_qos = of_count_phandle_with_args(node, "pm_qos",
> NULL);
> @@ -884,13 +881,18 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> for (j = 0; j < pd->num_qos; j++) {
> qos_node = of_parse_phandle(node, "pm_qos", j);
> if (!qos_node) {
> - error = -ENODEV;
> + error = dev_err_probe(pmu->dev, -ENODEV,
> + "%pOFn: failed to get pm_qos %d\n",
> + node, j);
> goto err_unprepare_clocks;
> }
> pd->qos_regmap[j] = syscon_node_to_regmap(qos_node);
> of_node_put(qos_node);
> if (IS_ERR(pd->qos_regmap[j])) {
> - error = -ENODEV;
> + error = dev_err_probe(pmu->dev,
> + PTR_ERR(pd->qos_regmap[j]),
> + "%pOFn: failed to get pm_qos %d regmap\n",
> + node, j);
> goto err_unprepare_clocks;
> }
> }
> @@ -1038,39 +1040,31 @@ static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu,
> u32 idx;
>
> error = of_property_read_u32(parent, "reg", &idx);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - parent, error);
> - return error;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, error,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + parent);
> parent_domain = pmu->genpd_data.domains[idx];
>
> error = rockchip_pm_add_one_domain(pmu, np);
> - if (error) {
> - dev_err(pmu->dev, "failed to handle node %pOFn: %d\n",
> - np, error);
> + if (error)
> return error;
> - }
>
> error = of_property_read_u32(np, "reg", &idx);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - np, error);
> - return error;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, error,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + np);
> child_domain = pmu->genpd_data.domains[idx];
>
> error = pm_genpd_add_subdomain(parent_domain, child_domain);
> - if (error) {
> - dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n",
> - parent_domain->name, child_domain->name, error);
> - return error;
> - } else {
> - dev_dbg(pmu->dev, "%s add subdomain: %s\n",
> - parent_domain->name, child_domain->name);
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, error,
> + "%s failed to add subdomain %s\n",
> + parent_domain->name, child_domain->name);
> +
> + dev_dbg(pmu->dev, "%s add subdomain: %s\n",
> + parent_domain->name, child_domain->name);
>
> error = rockchip_pm_add_subdomain(pmu, np);
> if (error)
> @@ -1141,18 +1135,12 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev)
>
> for_each_available_child_of_node_scoped(np, node) {
> error = rockchip_pm_add_one_domain(pmu, node);
> - if (error) {
> - dev_err(dev, "failed to handle node %pOFn: %d\n",
> - node, error);
> + if (error)
> goto err_out;
> - }
>
> error = rockchip_pm_add_subdomain(pmu, node);
> - if (error < 0) {
> - dev_err(dev, "failed to handle subdomain node %pOFn: %d\n",
> - node, error);
> + if (error < 0)
> goto err_out;
> - }
> }
>
> if (error) {
>
>
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/2] pmdomain: rockchip: report domain errors once, with dev_err_probe()
2026-11-12 8:23 ` Arun Iyengar
@ 2026-11-12 10:52 ` Yao Zi
-1 siblings, 0 replies; 13+ messages in thread
From: Yao Zi @ 2026-11-12 10:52 UTC (permalink / raw)
To: aiyengar1990, Ulf Hansson, Heiko Stuebner, Shawn Lin,
Sebastian Reichel, Kevin Hilman, Caesar Wang, Elaine Zhang
Cc: linux-pm, linux-arm-kernel, linux-rockchip, linux-kernel, Yao Zi,
Igor Pecovnik
On Thu, Nov 12, 2026 at 08:23:30AM +0000, Arun Iyengar via B4 Relay wrote:
> From: Arun Iyengar <aiyengar1990@gmail.com>
>
> When a power domain clock is not available yet,
> rockchip_pm_add_one_domain() returns -EPROBE_DEFER, and both it and its
> callers rockchip_pm_domain_probe() and rockchip_pm_add_subdomain() print
> that with dev_err():
>
> rockchip-pm-domain ...: power-domain: failed to get clk at index 1: -517
> rockchip-pm-domain ...: failed to handle node power-domain: -517
>
> once per probe attempt, and the second line twice for a nested domain.
> On an RK3588 board whose NPU domain clock appears late this is more than
> 20 error lines before the domain finally probes, and the reason of the
> deferral is not recorded. Other failures are reported twice (once where
> they happen and once by the callers), or only by the callers, which name
> the node but not what failed: a missing pm_qos phandle and a pm_qos node
> without a regmap print nothing in rockchip_pm_add_one_domain(), and a
> failed clk_bulk_prepare() only has the message of the clk core, which
> names neither the device nor the domain.
>
> Report every error once, where it happens, with dev_err_probe(), and
> drop the "failed to handle (subdomain) node" messages from the callers.
> A deferral is then quiet and keeps its specific reason in
> /sys/kernel/debug/devices_deferred, such as "failed to get clk at index
> 1", and -ENOMEM, which the callers used to print, is quiet as well. The
> return values are unchanged, except that a failed
> syscon_node_to_regmap() for a pm_qos node now returns its own error
> instead of -ENODEV: it can be -EPROBE_DEFER (a syscon regmap that is
> not registered yet, or a syscon clock or hwlock that is not available
> yet), which must not turn into a probe failure.
>
> Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
> Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
> Suggested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
> ---
> drivers/pmdomain/rockchip/pm-domains.c | 98 +++++++++++++++-------------------
> 1 file changed, 43 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
> index 00c7e78f89b5..be077fb52f40 100644
> --- a/drivers/pmdomain/rockchip/pm-domains.c
> +++ b/drivers/pmdomain/rockchip/pm-domains.c
> @@ -804,28 +804,22 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> int error;
>
> error = of_property_read_u32(node, "reg", &id);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - node, error);
> - return -EINVAL;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + node);
>
> - if (id >= pmu->info->num_domains) {
> - dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
> - node, id);
> - return -EINVAL;
> - }
> + if (id >= pmu->info->num_domains)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: invalid domain id %d\n", node, id);
These look like code clean-up instead of fixes, thus should be split
into a separate patch, especially when we probably want to backport the
real fixes. This applies for many places below.
Aside these unnecessary code changes, this patch seems in a better shape
than the very first version[1] I submitted a week ago, which seems,
unfortunately, being ignored.
I'll drop the second patch in my series and use yours instead. But
please search before sending patches next time to avoid duplicated work.
--
Thanks,
Yao Zi
Meow-mrrp-mrow, I'm a cat.
[1]: https://lore.kernel.org/linux-rockchip/20261105001257.1368266-1-me@ziyao.cc/
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v2 2/2] pmdomain: rockchip: report domain errors once, with dev_err_probe()
@ 2026-11-12 10:52 ` Yao Zi
0 siblings, 0 replies; 13+ messages in thread
From: Yao Zi @ 2026-11-12 10:52 UTC (permalink / raw)
To: aiyengar1990, Ulf Hansson, Heiko Stuebner, Shawn Lin,
Sebastian Reichel, Kevin Hilman, Caesar Wang, Elaine Zhang
Cc: linux-pm, linux-arm-kernel, linux-rockchip, linux-kernel, Yao Zi,
Igor Pecovnik
On Thu, Nov 12, 2026 at 08:23:30AM +0000, Arun Iyengar via B4 Relay wrote:
> From: Arun Iyengar <aiyengar1990@gmail.com>
>
> When a power domain clock is not available yet,
> rockchip_pm_add_one_domain() returns -EPROBE_DEFER, and both it and its
> callers rockchip_pm_domain_probe() and rockchip_pm_add_subdomain() print
> that with dev_err():
>
> rockchip-pm-domain ...: power-domain: failed to get clk at index 1: -517
> rockchip-pm-domain ...: failed to handle node power-domain: -517
>
> once per probe attempt, and the second line twice for a nested domain.
> On an RK3588 board whose NPU domain clock appears late this is more than
> 20 error lines before the domain finally probes, and the reason of the
> deferral is not recorded. Other failures are reported twice (once where
> they happen and once by the callers), or only by the callers, which name
> the node but not what failed: a missing pm_qos phandle and a pm_qos node
> without a regmap print nothing in rockchip_pm_add_one_domain(), and a
> failed clk_bulk_prepare() only has the message of the clk core, which
> names neither the device nor the domain.
>
> Report every error once, where it happens, with dev_err_probe(), and
> drop the "failed to handle (subdomain) node" messages from the callers.
> A deferral is then quiet and keeps its specific reason in
> /sys/kernel/debug/devices_deferred, such as "failed to get clk at index
> 1", and -ENOMEM, which the callers used to print, is quiet as well. The
> return values are unchanged, except that a failed
> syscon_node_to_regmap() for a pm_qos node now returns its own error
> instead of -ENODEV: it can be -EPROBE_DEFER (a syscon regmap that is
> not registered yet, or a syscon clock or hwlock that is not available
> yet), which must not turn into a probe failure.
>
> Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
> Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
> Suggested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
> Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
> ---
> drivers/pmdomain/rockchip/pm-domains.c | 98 +++++++++++++++-------------------
> 1 file changed, 43 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
> index 00c7e78f89b5..be077fb52f40 100644
> --- a/drivers/pmdomain/rockchip/pm-domains.c
> +++ b/drivers/pmdomain/rockchip/pm-domains.c
> @@ -804,28 +804,22 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
> int error;
>
> error = of_property_read_u32(node, "reg", &id);
> - if (error) {
> - dev_err(pmu->dev,
> - "%pOFn: failed to retrieve domain id (reg): %d\n",
> - node, error);
> - return -EINVAL;
> - }
> + if (error)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: failed to retrieve domain id (reg)\n",
> + node);
>
> - if (id >= pmu->info->num_domains) {
> - dev_err(pmu->dev, "%pOFn: invalid domain id %d\n",
> - node, id);
> - return -EINVAL;
> - }
> + if (id >= pmu->info->num_domains)
> + return dev_err_probe(pmu->dev, -EINVAL,
> + "%pOFn: invalid domain id %d\n", node, id);
These look like code clean-up instead of fixes, thus should be split
into a separate patch, especially when we probably want to backport the
real fixes. This applies for many places below.
Aside these unnecessary code changes, this patch seems in a better shape
than the very first version[1] I submitted a week ago, which seems,
unfortunately, being ignored.
I'll drop the second patch in my series and use yours instead. But
please search before sending patches next time to avoid duplicated work.
--
Thanks,
Yao Zi
Meow-mrrp-mrow, I'm a cat.
[1]: https://lore.kernel.org/linux-rockchip/20261105001257.1368266-1-me@ziyao.cc/
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 13+ messages in thread