mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
ASoC: fsl_xcvr: fix missing lock in fsl_xcvr_mode_put()
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>
This commit is contained in:
parent
85352e59de
commit
f514248727
|
|
@ -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]);
|
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,
|
fsl_xcvr_activate_ctl(dai, fsl_xcvr_arc_mode_kctl.name,
|
||||||
(xcvr->mode == FSL_XCVR_MODE_ARC));
|
(xcvr->mode == FSL_XCVR_MODE_ARC));
|
||||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_earc_capds_kctl.name,
|
fsl_xcvr_activate_ctl(dai, fsl_xcvr_earc_capds_kctl.name,
|
||||||
(xcvr->mode == FSL_XCVR_MODE_EARC));
|
(xcvr->mode == FSL_XCVR_MODE_EARC));
|
||||||
|
up_read(&card->snd_card->controls_rwsem);
|
||||||
|
|
||||||
/* Allow playback for SPDIF only */
|
/* Allow playback for SPDIF only */
|
||||||
rtd = snd_soc_get_pcm_runtime(card, card->dai_link);
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link);
|
||||||
rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count =
|
rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count =
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user