[PATCH] pmdomain: mediatek: mt8183: Fix silent audio from premature sync_state
From: Nils Büchner
Date: Mon Oct 05 2026 - 09:39:17 EST
Commit 0e789b491ba0 ("pmdomain: core: Leave powered-on genpds on until
sync_state") made genpd trust that a power domain already on at probe
time is correctly, fully initialized, and stopped forcing a real
power-off/power-on cycle for it until the devicetree provider's
sync_state() callback fires.
On the Juniper board (Acer Chromebook Spin 311, MT8183), the firmware
leaves the audio power domain in exactly this misleading state: genpd
reports it as on, so this new behavior never runs the real hardware
sequencing in scpsys_power_on() that clears the domain's AXI bus
protection. Register access to the AFE block over APB keeps working
normally, giving no obvious sign anything is wrong, but the memif DMA
engine's own bus transactions silently never complete: its current-
position register stays frozen at the value it was reset to, the
period-elapsed interrupt is never raised, and ALSA playback fails with
-EIO. The net effect is silent internal speakers on every boot.
This is the same class of problem already fixed for the MFG/GPU
domains in commit 818d56ac1d ("pmdomain: mediatek: Fix mt8183 hang on
boot"), which does not cover the audio domain. Apply the identical,
already-reviewed fix here: MTK_SCPD_KEEP_DEFAULT_OFF makes genpd start
the domain in GENPD_STATE_OFF instead of trusting the bootloader's
"on" state, so the AFE driver's own first pm_runtime resume triggers a
genuine power-on transition and actually runs the bus-protection
clear.
Root-caused with a git bisect across released kernel versions on real
Juniper hardware (audio works on v6.6, fails from v6.16 onward),
narrowing the regression down to this exact commit, and confirmed
fixed with speaker-test playback after applying this change.
Fixes: 0e789b491ba0 ("pmdomain: core: Leave powered-on genpds on until sync_state")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Nils Büchner <nils@xxxxxxxxxxx>
---
drivers/pmdomain/mediatek/mt8183-pm-domains.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/pmdomain/mediatek/mt8183-pm-domains.h b/drivers/pmdomain/mediatek/mt8183-pm-domains.h
index 5e33b8628..8e29e5117 100644
--- a/drivers/pmdomain/mediatek/mt8183-pm-domains.h
+++ b/drivers/pmdomain/mediatek/mt8183-pm-domains.h
@@ -22,6 +22,15 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
.pwr_sta2nd_offs = 0x0184,
.sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12),
+ /*
+ * Depending on firmware, the audio domain may be left
+ * partially on at boot, with genpd detecting it as on when
+ * it isn't fully initialized. Force a real off/on cycle
+ * instead of trusting that state, same as the MFG domains
+ * in commit 818d56ac1d ("pmdomain: mediatek: Fix mt8183
+ * hang on boot").
+ */
+ .caps = MTK_SCPD_KEEP_DEFAULT_OFF,
},
[MT8183_POWER_DOMAIN_CONN] = {
.name = "conn",
--
2.53.0