Re: [RFC PATCH v5 v5 5/8] pmdomain/rockchip: cycle optional power-domain resets on power-on
Philipp Zabel <[email protected]> Wed, 05 Aug 2026 14:13:40 +0200
| Newsgroups | dev.linux.lists.iommu,org.freedesktop.lists.dri-devel,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-rockchip,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[email protected]> |
On Mi, 2026-08-05 at 18:38 +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 access after a cold power-on; the vendor kernel cycles the > domain's resets at this point and that clears it. > > Take the domain node's resets if it has any, and pulse them between > releasing idle and restoring QoS. The resets are optional, so domains > that do not declare any behave exactly as before. > > Signed-off-by: Jiaxing Hu <[email protected]> > --- > drivers/pmdomain/rockchip/pm-domains.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c > index e1857f878..82051f600 100644 > --- a/drivers/pmdomain/rockchip/pm-domains.c > +++ b/drivers/pmdomain/rockchip/pm-domains.c > @@ -19,6 +19,7 @@ > #include <linux/of_clk.h> > #include <linux/clk.h> > #include <linux/delay.h> > +#include <linux/reset.h> > #include <linux/regmap.h> > #include <linux/regulator/consumer.h> > #include <linux/mfd/syscon.h> > @@ -103,6 +104,7 @@ struct rockchip_pm_domain { > struct clk_bulk_data *clks; > struct device_node *node; > struct regulator *supply; > + struct reset_control *resets; > }; > > struct rockchip_pmu { > @@ -688,6 +690,13 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) > if (pd->info->delay_us) > udelay(pd->info->delay_us); > > + /* Optional: some domains need their resets cycled after power-on. */ > + if (pd->resets) { > + reset_control_assert(pd->resets); > + udelay(10); > + reset_control_deassert(pd->resets); > + } > + > rockchip_pmu_restore_qos(pd); > } > > @@ -857,6 +866,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); Why is this using of_reset_control_array_get_optional_exclusive() instead of devm_reset_control_array_get_optional_exclusive() when pd is allocated with devm_kzalloc()? > + if (IS_ERR(pd->resets)) { > + error = PTR_ERR(pd->resets); > + dev_err(pmu->dev, "%pOFn: failed to get resets: %d\n", node, error); dev_err_probe() to avoid printing on -EPROBE_DEFER. regards Philipp