linux/sound/soc
Pierre-Louis Bossart d2bf75f4f6
ASoC: rt711-sdca-sdw: fix race condition on system suspend
In the initial driver we cancelled deferred work, but there is still a
window of time where a new interrupt could result in new deferred work
executed after the link is disabled, leading to an IO error. While we
did not see this IO error on RT711-sdca-based platforms, the code pattern
is similar to the RT700 case where the IO error was noted, so the fix
is added for consistency.

This patch uses an 'disable_irq_lock' mutex to prevent new interrupts
from happening after the start of the system suspend. The choice of a
mutex v. a spinlock is mainly due to the time required to clear
interrupts, which requires a command to be transmitted by the
SoundWire host IP and acknowledged with an interrupt. The
'interrupt_callback' routine is also not meant to be called from an
interrupt context.

An additional 'disable_irq' flag prevents race conditions where the
status changes before the interrupts are disabled, but the workqueue
handling status changes is scheduled after the completion of the
system suspend. On resume the interrupts are re-enabled already by the
io_init routine so we only clear the flag.

The code is slightly different from the other codecs since the
interrupt callback deals with the SDCA interrupts, leading to a much
larger section that's protected by the mutex. The SoundWire interrupt
scheme requires a read after clearing a status, it's not clear from
the specifications what would happen if SDCA interrupts are disabled
in the middle of the sequence, so the entire interrupt status
read/write is kept as is, even if in the end we discard the
information.

BugLink: https://github.com/thesofproject/linux/issues/2943
Fixes: 7ad4d237e7 ('ASoC: rt711-sdca: Add RT711 SDCA vendor-specific driver')
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <bard.liao@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20210614180815.153711-6-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-06-21 13:00:45 +01:00
..
adi ASoC: adi: sync parameter naming (rate/sample_bits) 2021-01-21 12:37:44 +00:00
amd Linux 5.13-rc3 2021-06-09 11:52:35 +01:00
atmel ASoC: atmel: atmel-i2s: remove useless initialization 2021-03-31 18:03:16 +01:00
au1x ASoC: au1x: sync parameter naming (rate/sample_bits) 2021-01-21 12:37:46 +00:00
bcm Merge remote-tracking branch 'asoc/for-5.13' into asoc-next 2021-04-23 19:01:02 +01:00
cirrus ASoC: cirrus: sync parameter naming (rate/sample_bits) 2021-01-21 12:37:48 +00:00
codecs ASoC: rt711-sdca-sdw: fix race condition on system suspend 2021-06-21 13:00:45 +01:00
dwc ASoC: dwc: Fix -Wmissing-prototypes warnings 2021-03-29 17:28:13 +01:00
fsl ASoC: fsl_spdif: Fix error handler with pm_runtime_enable 2021-06-14 15:01:55 +01:00
generic ASoC: audio-graph: tidyup graph_parse_node() 2021-05-11 15:46:51 +01:00
hisilicon
img
intel Linux 5.13-rc3 2021-06-09 11:52:35 +01:00
jz4740 ASoC: jz4740: sync parameter naming (rate/sample_bits) 2021-01-21 12:38:08 +00:00
kirkwood ASoC: kirkwood: Use managed DMA buffer allocation 2021-01-13 11:36:16 +00:00
mediatek ALSA: control - add generic LED API 2021-03-31 17:16:14 +01:00
meson Merge remote-tracking branch 'asoc/for-5.13' into asoc-next 2021-04-23 19:01:02 +01:00
mxs ASoC: mxs-saif: drop unneeded snd_soc_dai_set_drvdata 2021-03-10 13:07:06 +00:00
pxa ASoC: pxa: remove useless assignment 2021-03-31 18:03:19 +01:00
qcom ASoC: qcom: lpass-cpu: Fix pop noise during audio capture begin 2021-06-07 15:54:08 +01:00
rockchip ASoC: rockchip: sync parameter naming (rate/sample_bits) 2021-01-21 12:37:50 +00:00
samsung ASoC: samsung: tm2_wm5110: remove shadowed variable 2021-03-12 20:45:41 +00:00
sh ASoC: rsnd: add usage for SRC 2021-04-14 15:24:14 +01:00
sof Linux 5.13-rc3 2021-06-09 11:52:35 +01:00
spear
sprd ASoC: sprd: Switch to use list_entry_is_head() helper 2020-12-28 12:24:45 +00:00
sti ASoC: sti: sti_uniperif: add missing MODULE_DEVICE_TABLE 2021-04-13 12:33:45 +01:00
stm ASoC: stm32: do not request a new clock consummer reference 2021-04-28 16:34:53 +01:00
sunxi Merge remote-tracking branch 'asoc/for-5.13' into asoc-next 2021-04-23 19:01:02 +01:00
tegra ASoC: tegra: mark runtime-pm functions as __maybe_unused 2021-04-22 16:27:37 +01:00
ti sound updates for 5.13 2021-04-30 12:48:14 -07:00
uniphier ASoC: uniphier: Simplify the return expression of uniphier_aio_startup 2021-03-10 13:07:15 +00:00
ux500 ASoC: ux500: mop500: align function prototype 2021-03-31 18:03:28 +01:00
xilinx
xtensa
Kconfig ASoC: topology: adhere to KUNIT formatting standard 2021-04-14 15:26:24 +01:00
Makefile ASoC: topology: adhere to KUNIT formatting standard 2021-04-14 15:26:24 +01:00
soc-ac97.c
soc-acpi.c ASoC: soc-acpi: remove useless initialization 2021-04-19 14:03:29 +01:00
soc-card.c
soc-component.c ASoC: soc-component: Add snd_soc_pcm_component_ack 2021-03-25 13:58:06 +00:00
soc-compress.c ASoC: soc-compress: lock pcm_mutex to resolve lockdep error 2021-04-09 13:39:44 +01:00
soc-core.c ASoC: core: Fix Null-point-dereference in fmt_single_name() 2021-05-24 09:49:28 +01:00
soc-dai.c ASoC: soc-dai: fix kernel-doc 2021-03-10 13:08:46 +00:00
soc-dapm.c ASoC: don't indicate error message for snd_soc_[pcm_]dai_xxx() 2021-03-19 12:24:04 +00:00
soc-devres.c
soc-generic-dmaengine-pcm.c
soc-jack.c
soc-link.c ASoC: soc-pcm: care trigger rollback 2020-12-09 12:13:38 +00:00
soc-ops.c ASoC: soc-ops: remove useless assignment 2021-03-10 13:06:53 +00:00
soc-pcm.c ASoC: soc-pcm: ignore dummy-DAI at soc_pcm_params_symmetry() 2021-04-16 14:34:13 +01:00
soc-topology-test.c ASoC: topology: KUnit: Convert from cpu to data format 2021-02-02 17:08:21 +00:00
soc-topology.c ASoC: topology: Fix spelling mistake "vesion" -> "version" 2021-06-01 14:02:59 +01:00
soc-utils.c ASoC: soc-utils: add snd_soc_component_is_dummy() 2021-04-16 14:34:12 +01:00