linux/include/sound
Richard Fitzgerald eba2eb2495
ASoC: soc-card: Fix missing locking in snd_soc_card_get_kcontrol()
snd_soc_card_get_kcontrol() must be holding a read lock on
card->controls_rwsem while walking the controls list.

Compare with snd_ctl_find_numid().

The existing function is renamed snd_soc_card_get_kcontrol_locked()
so that it can be called from contexts that are already holding
card->controls_rwsem (for example, control get/put functions).

There are few direct or indirect callers of
snd_soc_card_get_kcontrol(), and most are safe. Three require
changes, which have been included in this patch:

codecs/cs35l45.c:
  cs35l45_activate_ctl() is called from a control put() function so
  is changed to call snd_soc_card_get_kcontrol_locked().

codecs/cs35l56.c:
  cs35l56_sync_asp1_mixer_widgets_with_firmware() is called from
  control get()/put() functions so is changed to call
  snd_soc_card_get_kcontrol_locked().

fsl/fsl_xcvr.c:
  fsl_xcvr_activate_ctl() is called from three places, one of which
  already holds card->controls_rwsem:
  1. fsl_xcvr_mode_put(), a control put function, which will
     already be holding card->controls_rwsem.
  2. fsl_xcvr_startup(), a DAI startup function.
  3. fsl_xcvr_shutdown(), a DAI shutdown function.

  To fix this, fsl_xcvr_activate_ctl() has been changed to call
  snd_soc_card_get_kcontrol_locked() so that it is safe to call
  directly from fsl_xcvr_mode_put().
  The fsl_xcvr_startup() and fsl_xcvr_shutdown() functions have been
  changed to take a read lock on card->controls_rsem() around calls
  to fsl_xcvr_activate_ctl(). While this is not very elegant, it
  keeps the change small, to avoid this patch creating a large
  collateral churn in fsl/fsl_xcvr.c.

Analysis of other callers of snd_soc_card_get_kcontrol() is that
they do not need any changes, they are not holding card->controls_rwsem
when they call snd_soc_card_get_kcontrol().

Direct callers of snd_soc_card_get_kcontrol():
  fsl/fsl_spdif.c: fsl_spdif_dai_probe() - DAI probe function
  fsl/fsl_micfil.c: voice_detected_fn() - IRQ handler

Indirect callers via soc_component_notify_control():
  codecs/cs42l43: cs42l43_mic_shutter() - IRQ handler
  codecs/cs42l43: cs42l43_spk_shutter() - IRQ handler
  codecs/ak4118.c: ak4118_irq_handler() - IRQ handler
  codecs/wm_adsp.c: wm_adsp_write_ctl() - not currently used

Indirect callers via snd_soc_limit_volume():
  qcom/sc8280xp.c: sc8280xp_snd_init() - DAIlink init function
  ti/rx51.c: rx51_aic34_init() - DAI init function

I don't have hardware to test the fsl/*, qcom/sc828xp.c, ti/rx51.c
and ak4118.c changes.

Backport note:
The fsl/, qcom/, cs35l45, cs35l56 and cs42l43 callers were added
since the Fixes commit so won't all be present on older kernels.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Fixes: 209c6cdfd2 ("ASoC: soc-card: move snd_soc_card_get_kcontrol() to soc-card")
Link: https://lore.kernel.org/r/20240221123710.690224-1-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2024-02-23 13:40:06 +00:00
..
ac97 ALSA: ac97: make remove callback of ac97 driver void returned 2023-01-25 09:34:20 +01:00
sof ASoC: SOF: IPC4: synchronize fw_config_params with fw definitions 2023-12-15 12:57:56 +00:00
ac97_codec.h ALSA: mark all struct bus_type as const 2023-12-30 10:10:41 +01:00
aci.h
acp63_chip_offset_byte.h ASoC: amd: update ps platform acp header file 2023-02-03 12:04:02 +00:00
ad1816a.h
ad1843.h
adau1373.h
ak4xxx-adda.h
ak4113.h
ak4114.h
ak4117.h
ak4531_codec.h
ak4641.h
alc5623.h
asequencer.h ALSA: seq: Add UMP support 2023-05-23 12:11:21 +02:00
asound.h
asoundef.h
compress_driver.h ALSA: compress: Don't embed device 2023-08-17 09:24:15 +02:00
control.h ALSA: vmaster: Add snd_ctl_add_followers() helper 2023-07-21 09:37:47 +02:00
core.h ALSA: core: Drop snd_device_initialize() 2023-08-17 09:24:33 +02:00
cs35l33.h
cs35l34.h
cs35l35.h
cs35l36.h
cs35l41.h ALSA: cs35l41: Fix for old systems which do not support command 2023-11-20 12:37:01 +01:00
cs35l56.h ASoC: cs35l56: Allow more time for firmware to boot 2024-02-01 12:57:26 +00:00
cs42l42.h ASoC: cs42l42: Add SOFT_RESET_REBOOT register 2023-01-31 12:10:46 +00:00
cs42l43.h ASoC: cs42l43: Add support for the cs42l43 2023-08-18 23:41:54 +01:00
cs42l52.h
cs42l56.h
cs42l73.h
cs4231-regs.h
cs4271.h ASoC: cs4271: Convert to GPIO descriptors 2023-12-01 16:59:21 +00:00
cs8403.h
cs8427.h
da7213.h
da7218.h
da7219-aad.h ASoC: da7219: Add Jack insertion detection polarity 2023-05-23 18:49:36 +01:00
da7219.h
da9055.h
designware_i2s.h ASoC: dwc: i2s: Add StarFive JH7110 SoC support 2023-08-23 13:56:40 +01:00
dmaengine_pcm.h ASoC: dmaengine: Drop unused iov_iter for process callback 2023-09-01 15:38:29 +02:00
emu10k1.h ALSA: emu10k1: set the "no filtering" bits on PCM voices on Audigy 2023-07-17 09:29:07 +02:00
emu10k1_synth.h
emu8000.h
emu8000_reg.h
emux_legacy.h
emux_synth.h ALSA: emu10k1: fix synthesizer pitch for E-MU cards at 44.1 kHz 2023-06-13 07:42:08 +02:00
es1688.h
graph_card.h ASoC: simple_card_utils.h: convert not to use asoc_xxx() 2023-09-25 14:16:14 +02:00
gus.h
hda-mlink.h ASoC: SOF: Intel: hda-mlink: add helper to get sublink LSDIID register 2023-08-07 23:09:46 +01:00
hda_chmap.h
hda_codec.h ALSA: hda: Honor subformat when querying PCMs 2023-11-27 17:24:27 +01:00
hda_component.h
hda_hwdep.h
hda_i915.h ALSA: hda: i915: Remove extra argument from snd_hdac_i915_init 2023-10-19 14:56:25 +02:00
hda_register.h ALSA: hda: Poll SDxFIFOS after programming SDxFMT 2023-10-06 11:11:39 +02:00
hda_regmap.h
hda_verbs.h
hdaudio.h ALSA: mark all struct bus_type as const 2023-12-30 10:10:41 +01:00
hdaudio_ext.h ALSA: hda: Add code_loading parameter to stream setup 2023-10-06 14:30:39 +02:00
hdmi-codec.h ASoC: hdmi-codec: Allow playback and capture to be disabled 2022-12-02 14:07:12 +00:00
hwdep.h ALSA: hwdep: Don't embed device 2023-08-17 09:24:01 +02:00
i2c.h
info.h ALSA: info: Remove unused function declarations 2023-08-08 14:45:45 +02:00
initval.h
intel-dsp-config.h
intel-nhlt.h ALSA: hda: intel-nhlt: add intel_nhlt_ssp_mclk_mask() 2022-09-20 12:25:03 +01:00
jack.h
madera-pdata.h
max9768.h ASoC: max9768: Convert to use GPIO descriptors 2023-09-11 12:50:05 +01:00
max98088.h
max98090.h
max98095.h
memalloc.h
minors.h
mixer_oss.h
mpu401.h
omap-hdmi-audio.h
opl3.h ALSA: opl3: Replace with __packed attribute 2023-10-26 09:43:15 +02:00
opl4.h
pcm-indirect.h ALSA: pcm: Improved XRUN handling for indirect PCM helpers 2023-03-24 14:52:58 +01:00
pcm.h ALSA: pcm: Introduce MSBITS subformat interface 2023-11-27 17:24:26 +01:00
pcm_drm_eld.h
pcm_iec958.h
pcm_oss.h
pcm_params.h ALSA: hda: Upgrade stream-format infrastructure 2023-11-27 17:27:41 +01:00
pt2258.h
pxa2xx-lib.h
rawmidi.h ALSA: rawmidi: Don't embed device 2023-08-17 09:24:08 +02:00
rt286.h
rt298.h
rt1015.h
rt5514.h
rt5659.h
rt5660.h
rt5663.h
rt5665.h ASoC: rt5665: Convert to use GPIO descriptors 2023-08-17 15:10:11 +01:00
rt5668.h ASoC: rt5668: Convert to use GPIO descriptors 2023-08-17 15:10:12 +01:00
rt5682.h ASoC: rt5682: Convert to use GPIO descriptors 2023-08-17 15:10:13 +01:00
rt5682s.h ASoC: rt5682s: Add LDO output selection for dacref 2023-11-14 17:39:27 +00:00
sb.h
sb16_csp.h
sdw.h sound: sdw: Add hw_params to SoundWire config helper function 2022-11-28 13:04:24 +00:00
seq_device.h ALSA: seq: Bind UMP device 2023-05-23 12:11:33 +02:00
seq_kernel.h ALSA: seq: Add UMP support 2023-05-23 12:11:21 +02:00
seq_midi_emul.h
seq_midi_event.h
seq_oss.h
seq_oss_legacy.h
seq_virmidi.h
sh_dac_audio.h
sh_fsi.h
simple_card.h ASoC: remove asoc_xxx() compatible macro 2023-09-26 17:18:45 +02:00
simple_card_utils.h ASoC: audio-graph-card2: Introduce playback-only/capture-only DAI link flags 2023-12-14 10:56:47 +00:00
snd_wavefront.h
soc-acpi-intel-match.h ASoC: Intel: common: add ACPI matching tables for Arrow Lake 2023-09-16 00:05:56 +01:00
soc-acpi.h ASoC: SOF: Pass PCI SSID to machine driver 2023-09-12 18:53:48 +01:00
soc-card.h ASoC: soc-card: Fix missing locking in snd_soc_card_get_kcontrol() 2024-02-23 13:40:06 +00:00
soc-component.h ASoC: Name iov_iter argument as iterator instead of buffer 2023-09-01 15:38:49 +02:00
soc-dai.h ASoC: soc-dai: add flag to mute and unmute stream during trigger 2023-10-27 17:44:04 +01:00
soc-dapm.h ASoC: Merge fixes for consistent cs42l43 schema 2023-10-10 17:07:17 +01:00
soc-dpcm.h ASoC: soc-pcm: test if a BE can be prepared 2023-05-19 02:31:14 +09:00
soc-jack.h
soc-link.h
soc-topology.h ASoC: topology: Use unload() op directly 2023-01-30 16:56:41 +00:00
soc.h ASoC: Updates for v6.8 2024-01-08 08:18:02 +01:00
sof.h ASoC: SOF: Add placeholder for platform IPC type and path overrides 2023-11-29 13:25:06 +00:00
soundfont.h
spear_dma.h
spear_spdif.h
sta32x.h
sta350.h
tas2552-plat.h
tas2781-dsp.h ASoC: tas2781: fixed compiling issue in m68k 2023-10-02 14:06:27 +01:00
tas2781-tlv.h ASoC: tas2781: Add Header file for tas2781 driver 2023-06-19 12:59:29 +01:00
tas2781.h ASoC: tas2781: add module parameter to tascodec_init() 2024-02-05 14:31:37 +00:00
tas5086.h
tea6330t.h
timer.h
tlv.h
tlv320aic32x4.h
tlv320dac33-plat.h
tpa6130a2-plat.h
uda1380.h
ump.h ALSA: ump: Don't create unused substreams for static blocks 2023-08-24 10:03:17 +02:00
ump_convert.h ALSA: ump: Export MIDI1 / UMP conversion helpers 2023-06-23 09:56:11 +02:00
ump_msg.h ALSA: ump: Support UMP Endpoint and Function Block parsing 2023-06-12 18:22:26 +02:00
util_mem.h
vx_core.h
wavefront.h ALSA: wavefront: Drop obsoleted comments and definitions 2023-10-26 09:43:24 +02:00
wm0010.h ASoC: wm0010: Convert to GPIO descriptors 2023-12-08 14:31:57 +00:00
wm2000.h
wm2200.h ASoC: wm2200: Convert to GPIO descriptors 2023-12-08 14:31:59 +00:00
wm5100.h ASoC: wm5100: Convert to GPIO descriptors 2023-12-08 14:31:59 +00:00
wm8903.h
wm8904.h
wm8955.h
wm8960.h
wm8962.h
wm8993.h
wm8996.h ASoC: wm8996: Convert to GPIO descriptors 2023-12-08 14:32:00 +00:00
wm9081.h
wm9090.h
wss.h