[PATCH] pmdomain: rockchip: do not restore QoS that was never saved

From: Jiaxing Hu

Date: Sun Nov 01 2026 - 01:56:58 EST


rockchip_pmu_restore_qos() writes back what rockchip_pmu_save_qos() read
on the last power-off. A domain that was off when it was registered has
not been powered off by the driver yet, so on its first power-on the
restore writes the zeroed save array over the QoS reset values.

On RK3576 this is the GPU on every boot. Read back after the restore, its
QoS is all zeros; with this patch it keeps the values it powers up with,
priority 0x101, mode 3, bandwidth 0x80 and saturation 8.

Only restore after a save. Rockchip's own driver does the same with an
is_qos_saved flag.

Fixes: 074c6a422d86 ("soc: rockchip: power-domain: support qos save and restore")
Signed-off-by: Jiaxing Hu <gahing@xxxxxxxxxxxxx>
---
drivers/pmdomain/rockchip/pm-domains.c | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
index db3879846db6..d1c025bdaa08 100644
--- a/drivers/pmdomain/rockchip/pm-domains.c
+++ b/drivers/pmdomain/rockchip/pm-domains.c
@@ -97,6 +97,7 @@ struct rockchip_pm_domain {
int num_qos;
struct regmap **qos_regmap;
u32 *qos_save_regs[MAX_QOS_REGS_NUM];
+ bool qos_saved;
int num_clks;
struct clk_bulk_data *clks;
struct device_node *node;
@@ -474,6 +475,7 @@ static int rockchip_pmu_save_qos(struct rockchip_pm_domain *pd)
QOS_EXTCONTROL,
&pd->qos_save_regs[4][i]);
}
+ pd->qos_saved = true;
return 0;
}

@@ -481,6 +483,14 @@ static int rockchip_pmu_restore_qos(struct rockchip_pm_domain *pd)
{
int i;

+ /*
+ * A domain that was off when it was registered has nothing saved yet,
+ * and writing the zeroed array would replace the reset values the QoS
+ * registers came up with.
+ */
+ if (!pd->qos_saved)
+ return 0;
+
for (i = 0; i < pd->num_qos; i++) {
regmap_write(pd->qos_regmap[i],
QOS_PRIORITY,

base-commit: 7649ba73f9e7e1e04d0b46213e39c79ae09dd55c
--
2.43.0