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 <[email protected]> > Reviewed-by: Abel Vesa <[email protected]> > --- > 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
