[PATCH v13 10/14] pmdomain: rockchip: cycle optional power-domain resets on power-on

Philipp Zabel p.zabel at pengutronix.de
Wed Sep 23 02:38:36 PDT 2026


On Di, 2026-09-15 at 22:43 +1200, Jiaxing Hu wrote:
> Some Rockchip domains come out of power-on with their bus interface in an
> undefined state. On the RK3576 NPU this shows up as a hang on the first
> register access after the domain is switched on, and pulsing the domain's
> resets at this point clears it.
> 
> Take the domain node's resets if it has any, and pulse them between

Why 'resets' plural? The binding specifies maxItems: 1.

> releasing idle and restoring QoS. The resets are optional, so domains that
> do not list any are unaffected.
> 
> The cycle goes before the settle delay 9/14 adds, not after it. A domain
> that asks for both is asking to settle before the QoS registers answer, and
> a reset deasserted after the delay would leave nothing between the deassert
> and rockchip_pmu_restore_qos(). On RK3576 PD_NPU0 and PD_NPU1 ask for both,
> and the reset they cycle is SRST_A_RKNN0/1_BIU, the bus interface those QoS
> writes go through.
> 
> It only runs when the domain actually changes state: rockchip_pd_power()
> returns early when the hardware already reads the state being asked for. A
> bootloader that leaves the NPU powered would therefore skip both this and
> the delay, which is why 9/14 gives RK3576_PD_NPU need_regulator and forces
> the domain off at probe.
> 
> No in-tree DTS puts resets in a power-domain node today, so every other
> Rockchip SoC takes the optional get's NULL and is unchanged.
> 
> Signed-off-by: Jiaxing Hu <gahing at gahingwoo.com>
> Reviewed-by: Abel Vesa <abel.vesa at oss.qualcomm.com>
> ---
>  drivers/pmdomain/rockchip/pm-domains.c | 27 ++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
> index 39988efd8..6cc8d6efd 100644
> --- a/drivers/pmdomain/rockchip/pm-domains.c
> +++ b/drivers/pmdomain/rockchip/pm-domains.c
[...]
> @@ -861,6 +878,14 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
>  	if (error)
>  		goto err_put_clocks;
>  
> +	pd->resets = of_reset_control_array_get_optional_exclusive(node);

This should be of_reset_control_get_optional_exclusive() if there is
only a single reset.

regards
Philipp



More information about the linux-arm-kernel mailing list