[PATCH 04/28] ASoC: apple: mca: Fix PD link double-frees
From: James Calligeros
Date: Sun Sep 20 2026 - 00:57:11 EST
From: Hector Martin <marcan@xxxxxxxxx>
Add additional checks to ensure MCA PD links are not double freed.
Fixes: 3df5d0d97289 ("ASoC: apple: mca: Start new platform driver")
Signed-off-by: Hector Martin <marcan@xxxxxxxxx>
Signed-off-by: James Calligeros <jcalligeros99@xxxxxxxxx>
---
sound/soc/apple/mca.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c
index be702b2942a5..66196c6a9273 100644
--- a/sound/soc/apple/mca.c
+++ b/sound/soc/apple/mca.c
@@ -303,6 +303,7 @@ static int mca_fe_enable_clocks(struct mca_cluster *cl)
* the power state driver would error out on seeing the device
* as clock-gated.
*/
+ WARN_ON(cl->pd_link);
cl->pd_link = device_link_add(mca->dev, cl->pd_dev,
DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME |
DL_FLAG_RPM_ACTIVE);
@@ -326,7 +327,11 @@ static void mca_fe_disable_clocks(struct mca_cluster *cl)
mca_modify(cl, REG_SYNCGEN_STATUS, SYNCGEN_STATUS_EN, 0);
mca_modify(cl, REG_STATUS, STATUS_MCLK_EN, 0);
- device_link_del(cl->pd_link);
+ if (cl->pd_link) {
+ device_link_del(cl->pd_link);
+ cl->pd_link = NULL;
+ }
+
clk_disable_unprepare(cl->clk_parent);
}
@@ -392,6 +397,7 @@ static int mca_fe_prepare(struct snd_pcm_substream *substream,
if (!cl->syncgen_in_use) {
int port = ffs(mca_fe_get_portmask(substream));
+ WARN_ON(cl->pd_link);
cl->pd_link = device_link_add(mca->dev, cl->pd_dev,
DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME |
DL_FLAG_RPM_ACTIVE);
@@ -423,8 +429,10 @@ static int mca_fe_hw_free(struct snd_pcm_substream *substream,
return 0;
mca_modify(cl, REG_SYNCGEN_STATUS, SYNCGEN_STATUS_EN, 0);
- if (cl->pd_link)
+ if (cl->pd_link) {
device_link_del(cl->pd_link);
+ cl->pd_link = NULL;
+ }
return 0;
}
@@ -1145,8 +1153,10 @@ static void apple_mca_release(struct mca_data *mca)
dev_pm_domain_detach(cl->pd_dev, true);
}
- if (mca->pd_link)
+ if (mca->pd_link) {
device_link_del(mca->pd_link);
+ mca->pd_link = NULL;
+ }
if (!IS_ERR_OR_NULL(mca->pd_dev))
dev_pm_domain_detach(mca->pd_dev, true);
--
2.55.0