]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: fsl_xcvr: fix missing lock in fsl_xcvr_mode_put()
authorZiyi Guo <n7l8m4@u.northwestern.edu>
Mon, 2 Feb 2026 17:41:12 +0000 (17:41 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 4 Feb 2026 11:29:58 +0000 (11:29 +0000)
fsl_xcvr_activate_ctl() has
lockdep_assert_held(&card->snd_card->controls_rwsem),
but fsl_xcvr_mode_put() calls it without acquiring this lock.

Other callers of fsl_xcvr_activate_ctl() in fsl_xcvr_startup() and
fsl_xcvr_shutdown() properly acquire the lock with down_read()/up_read().

Add the missing down_read()/up_read() calls around fsl_xcvr_activate_ctl()
in fsl_xcvr_mode_put() to fix the lockdep assertion and prevent potential
race conditions when multiple userspace threads access the control.

Signed-off-by: Ziyi Guo <n7l8m4@u.northwestern.edu>
Link: https://patch.msgid.link/20260202174112.2018402-1-n7l8m4@u.northwestern.edu
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_xcvr.c

index a268fb81a2f86855daa035e306ea67c2c87e6f59..5de93f458b569d0d73ed68f83110c096b58baf37 100644 (file)
@@ -223,10 +223,13 @@ static int fsl_xcvr_mode_put(struct snd_kcontrol *kcontrol,
 
        xcvr->mode = snd_soc_enum_item_to_val(e, item[0]);
 
+       down_read(&card->snd_card->controls_rwsem);
        fsl_xcvr_activate_ctl(dai, fsl_xcvr_arc_mode_kctl.name,
                              (xcvr->mode == FSL_XCVR_MODE_ARC));
        fsl_xcvr_activate_ctl(dai, fsl_xcvr_earc_capds_kctl.name,
                              (xcvr->mode == FSL_XCVR_MODE_EARC));
+       up_read(&card->snd_card->controls_rwsem);
+
        /* Allow playback for SPDIF only */
        rtd = snd_soc_get_pcm_runtime(card, card->dai_link);
        rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count =