linux/sound/soc
Richard Fitzgerald 2d066c6a78
ASoC: cs42l42: Avoid stale SoundWire ATTACH after hard reset
In SoundWire mode leave hard RESET asserted when exiting probe,
and wait for an UNATTACHED notification before deasserting RESET.

If the boot state of the reset GPIO was deasserted it is possible
that the SoundWire core had already enumerated the CS42L42 before
cs42l42_sdw_probe() is called. When cs42l42_common_probe() hard
resets the CS42L42 it triggers a race condition:

1) After cs42l42_sdw_probe() returns the thread that called it
   will call cs42l42_sdw_update_status() to report the last
   status recorded by the SoundWire core.

2) The SoundWire bus master will see a PING with the CS42L42
   now reporting as unenumerated and will trigger the core
   SoundWire code to start enumerating CS42L42.

These two threads are racing against each other. If (1)
happens before (2) a stale ATTACHED notification will be
reported to the cs42l42 driver when in fact the status of
cs42l42 is now unattached.

To avoid this race condition:

- Leave RESET asserted on exit from cs42l42_sdw_probe().
  This ensures that an UNATTACHED notification must be
  sent to the cs42l42 driver. If cs42l42 was already
  enumerated it will be seen to drop off the bus, causing
  an UNATTACH notification. If it was never enumerated the
  status is already UNATTACHED and this will be reported
  by thread (1).

- When the UNATTACH notification is received, release RESET.
  This will cause CS42L42 to be enumerated and eventually
  report an ATTACHED notification.

- The ATTACHED notification is now valid.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230913150012.604775-4-sbinding@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
2023-09-13 16:03:21 +01:00
..
adi ASoC: adi: merge DAI call back functions into ops 2023-08-14 13:10:03 +01:00
amd ASoC: amd: yc: Fix non-functional mic on Lenovo 82QF and 82UG 2023-09-12 13:16:30 +01:00
apple ASoC: apple: mca: Convert to platform remove callback returning void 2023-03-20 13:07:18 +00:00
atmel ASoC: dmaengine: Drop unused iov_iter for process callback 2023-09-01 15:38:29 +02:00
au1x ASoC: au1x: merge DAI call back functions into ops 2023-08-14 13:10:15 +01:00
bcm ASoC: bcm: merge DAI call back functions into ops 2023-08-14 13:10:06 +01:00
cirrus ASoC: cirrus: merge DAI call back functions into ops 2023-08-14 13:10:22 +01:00
codecs ASoC: cs42l42: Avoid stale SoundWire ATTACH after hard reset 2023-09-13 16:03:21 +01:00
dwc ASoC: dwc: i2s: Fix unused functions 2023-08-28 16:55:11 +02:00
fsl ASoC: fsl: imx-pcm-rpmsg: Add SNDRV_PCM_INFO_BATCH flag 2023-09-11 16:09:01 +01:00
generic ASoC: audio-graph-card.c: move audio_graph_parse_of() 2023-08-24 18:22:01 +01:00
google ASoC: Add Google Chameleon v3 i2s driver 2023-05-17 10:37:07 +09:00
hisilicon ASoC: hisilicon: merge DAI call back functions into ops 2023-08-14 13:10:30 +01:00
img ASoC: img: merge DAI call back functions into ops 2023-08-14 13:10:08 +01:00
intel ASoC: Intel: avs: Provide support for fallback topology 2023-09-05 17:28:07 +01:00
jz4740 ASoC: jz4740: merge DAI call back functions into ops 2023-08-14 13:10:21 +01:00
kirkwood ASoC: kirkwood: kirkwood-i2s: Convert to platform remove callback returning void 2023-03-20 13:08:35 +00:00
loongson ASoC: loongson: merge DAI call back functions into ops 2023-08-14 13:10:28 +01:00
mediatek ASoC: Updates for v6.6 2023-08-28 16:13:03 +02:00
meson ASoC: meson: spdifin: start hw on dai probe 2023-09-11 01:23:53 +01:00
mxs ASoC: mxs: mxs-sgtl5000: Convert to platform remove callback returning void 2023-03-20 13:08:44 +00:00
pxa ASoC: pxa: merge DAI call back functions into ops 2023-08-22 12:48:31 +01:00
qcom ASoC: Updates for v6.6 2023-08-28 16:13:03 +02:00
rockchip ASoC: rockchip: Fix Wvoid-pointer-to-enum-cast warning 2023-08-15 19:23:00 +01:00
samsung ASoC: samsung: tm2_wm5110: parse audio-routing 2023-08-16 14:47:20 +01:00
sh ASoC: rsnd: add missing of_node_put 2023-09-11 01:23:54 +01:00
sof Merge branch 'for-linus' into for-next 2023-08-24 09:27:21 +02:00
spear ASoC: spear: use helper function 2023-01-31 11:04:59 +00:00
sprd ASoC: sprd: sprd-mcdt: Convert to platform remove callback returning void 2023-03-20 13:09:02 +00:00
starfive ASoC: starfive: merge DAI call back functions into ops 2023-08-14 13:10:29 +01:00
sti ASoC: sti: merge DAI call back functions into ops 2023-08-14 13:10:10 +01:00
stm ASoC: dmaengine: Drop unused iov_iter for process callback 2023-09-01 15:38:29 +02:00
sunxi ASoC: sunxi: merge DAI call back functions into ops 2023-08-14 13:10:17 +01:00
tegra ASoC: tegra: Fix redundant PLLA and PLLA_OUT0 updates 2023-09-11 01:23:51 +01:00
ti TTY/Serial driver changes for 6.6-rc1 2023-09-01 09:38:00 -07:00
uniphier ASoC: uniphier: merge DAI call back functions into ops 2023-08-14 13:10:27 +01:00
ux500 ASoC: ux500: merge DAI call back functions into ops 2023-08-14 13:10:16 +01:00
xilinx ASoC: xilinx: xlnx_spdif: Convert to platform remove callback returning void 2023-03-20 13:09:34 +00:00
xtensa ASoC: xtensa: xtfpga-i2s: Convert to platform remove callback returning void 2023-03-20 13:09:35 +00:00
Kconfig ASoC: topology: Add explicit build option 2023-07-18 15:19:03 +01:00
Makefile ASoC: Add support for Loongson I2S controller 2023-06-15 13:53:24 +01:00
soc-ac97.c ASoC: soc-ac97: Return correct error codes 2023-02-15 16:09:07 +00:00
soc-acpi.c ASoC: soc-acpi: improve log messagesin link_slaves_found() 2023-07-31 23:24:01 +01:00
soc-card.c
soc-component.c ASoC: Name iov_iter argument as iterator instead of buffer 2023-09-01 15:38:49 +02:00
soc-compress.c ASoC: Fixes that got left after v6.4 2023-08-28 16:56:54 +02:00
soc-core.c ASoC: soc-core.c: Do not error if a DAI link component is not found 2023-08-24 21:10:45 +01:00
soc-dai.c ASoC: soc-dai.h: merge DAI call back functions into ops 2023-08-14 13:10:00 +01:00
soc-dapm.c ASoC: dapm: Add a flag for not having widget name in kcontrol name 2023-08-15 13:25:55 +01:00
soc-devres.c
soc-generic-dmaengine-pcm.c ASoC: Name iov_iter argument as iterator instead of buffer 2023-09-01 15:38:49 +02:00
soc-jack.c ASoC: soc-jack: calling snd_soc_jack_report causes a null pointer access 2023-08-14 22:10:35 +01:00
soc-link.c
soc-ops.c ASoC: ops: Correct bounds check for second channel on SX controls 2022-11-25 16:29:33 +00:00
soc-pcm.c ASoC: soc-pcm: Shrink stack frame for __soc_pcm_hw_params 2023-09-11 01:23:56 +01:00
soc-topology-test.c
soc-topology.c ASoC: Updates for v6.6 2023-08-28 16:13:03 +02:00
soc-utils-test.c ASoC: soc-utils-test: Add test for snd_soc_params_to_bclk() 2022-08-17 15:19:14 +01:00
soc-utils.c ASoC: soc-utils: Export snd_soc_dai_is_dummy() symbol 2023-09-11 01:23:50 +01:00