WSL2-Linux-Kernel/sound/soc
Paweł Anikiel ae3e3ac8b2 ASoC: ssm2602: Add workaround for playback distortions
[ Upstream commit f63550e2b1 ]

Apply a workaround for what appears to be a hardware quirk.

The problem seems to happen when enabling "whole chip power" (bit D7
register R6) for the very first time after the chip receives power. If
either "output" (D4) or "DAC" (D3) aren't powered on at that time,
playback becomes very distorted later on.

This happens on the Google Chameleon v3, as well as on a ZYBO Z7-10:
https://ez.analog.com/audio/f/q-a/543726/solved-ssm2603-right-output-offset-issue/480229
I suspect this happens only when using an external MCLK signal (which
is the case for both of these boards).

Here are some experiments run on a Google Chameleon v3. These were run
in userspace using a wrapper around the i2cset utility:
ssmset() {
        i2cset -y 0 0x1a $(($1*2)) $2
}

For each of the following sequences, we apply power to the ssm2603
chip, set the configuration registers R0-R5 and R7-R8, run the selected
sequence, and check for distortions on playback.

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x07 # chip, out, dac
  OK

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x87 # out, dac
  ssmset 0x06 0x07 # chip
  OK

  (disable MCLK)
  ssmset 0x09 0x01 # core
  ssmset 0x06 0x1f # chip
  ssmset 0x06 0x07 # out, dac
  (enable MCLK)
  OK

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x1f # chip
  ssmset 0x06 0x07 # out, dac
  NOT OK

  ssmset 0x06 0x1f # chip
  ssmset 0x09 0x01 # core
  ssmset 0x06 0x07 # out, dac
  NOT OK

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x0f # chip, out
  ssmset 0x06 0x07 # dac
  NOT OK

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x17 # chip, dac
  ssmset 0x06 0x07 # out
  NOT OK

For each of the following sequences, we apply power to the ssm2603
chip, run the selected sequence, issue a reset with R15, configure
R0-R5 and R7-R8, run one of the NOT OK sequences from above, and check
for distortions.

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x07 # chip, out, dac
  OK

  (disable MCLK)
  ssmset 0x09 0x01 # core
  ssmset 0x06 0x07 # chip, out, dac
  (enable MCLK after reset)
  NOT OK

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x17 # chip, dac
  NOT OK

  ssmset 0x09 0x01 # core
  ssmset 0x06 0x0f # chip, out
  NOT OK

  ssmset 0x06 0x07 # chip, out, dac
  NOT OK

Signed-off-by: Paweł Anikiel <pan@semihalf.com
Link: https://lore.kernel.org/r/20230508113037.137627-8-pan@semihalf.com
Signed-off-by: Mark Brown <broonie@kernel.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-06-09 10:32:22 +02:00
..
adi
amd
atmel ASoC: mchp-spdifrx: Fix uninitialized use of mr in mchp_spdifrx_hw_params() 2023-03-10 09:39:28 +01:00
au1x
bcm
cirrus
codecs ASoC: ssm2602: Add workaround for playback distortions 2023-06-09 10:32:22 +02:00
dwc ASoC: dwc: limit the number of overrun messages 2023-06-09 10:32:22 +02:00
fsl ASoC: fsl_micfil: Fix error handler with pm_runtime_enable 2023-05-24 17:36:49 +01:00
generic ASoC: audio-graph-card: fix refcount leak of cpu_ep in __graph_for_each_link() 2022-12-31 13:14:45 +01:00
hisilicon
img
intel ASoC: Intel: bytcr_rt5640: Add quirk for the Acer Iconia One 7 B1-750 2023-05-11 23:00:15 +09:00
jz4740 ASoC: jz4740-i2s: Handle independent FIFO flush bits 2023-01-12 11:58:57 +01:00
kirkwood ASoC: kirkwood: Iterate over array indexes instead of using pointer math 2023-03-10 09:39:53 +01:00
mediatek ASoC: mediatek: mt8195: add missing initialization 2023-03-11 13:57:32 +01:00
meson
mxs ASoC: mxs-saif: Fix refcount leak in mxs_saif_probe 2022-06-09 10:22:56 +02:00
pxa ASoC: pxa: fix null-pointer dereference in filter() 2022-12-31 13:14:09 +01:00
qcom ASoC: qcom: lpass-cpu: Fix fallback SD line index handling 2023-01-18 11:48:48 +01:00
rockchip ASoC: rockchip: spdif: Add missing clk_disable_unprepare() in rk_spdif_runtime_resume() 2022-12-31 13:14:45 +01:00
samsung ASoC: samsung: change gpiod_speaker_power and rx1950_audio from global to static variables 2022-08-17 14:24:04 +02:00
sh ASoC: rsnd: fixup #endif position 2023-03-10 09:39:27 +01:00
sof ASoC: SOF: Intel: hda-dai: fix possible stream_tag leak 2023-02-22 12:57:11 +01:00
spear
sprd
sti
stm ASoC: stm32: dfsdm: manage cb buffers cleanup 2022-12-02 17:41:10 +01:00
sunxi
tegra
ti ASoC: ti: j721e-evm: Fix refcount leak in j721e_soc_probe_* 2022-06-09 10:22:59 +02:00
uniphier
ux500
xilinx
xtensa
Kconfig
Makefile
soc-ac97.c
soc-acpi.c
soc-card.c
soc-component.c
soc-compress.c ASoC: soc-compress: Inherit atomicity from DAI link for Compress FE 2023-05-17 11:50:26 +02:00
soc-core.c ASoC: soc-pcm: Fix and cleanup DPCM locking 2023-05-17 11:50:15 +02:00
soc-dai.c
soc-dapm.c ASoC: dapm: Initialise kcontrol data for mux/demux controls 2022-07-21 21:24:39 +02:00
soc-devres.c
soc-generic-dmaengine-pcm.c
soc-jack.c
soc-link.c
soc-ops.c ASoC: ops: Correct bounds check for second channel on SX controls 2022-12-19 12:36:44 +01:00
soc-pcm.c ASoC: soc-pcm.c: call __soc_pcm_close() in soc_pcm_close() 2023-05-17 11:50:27 +02:00
soc-topology-test.c
soc-topology.c ASoC: topology: Return -ENOMEM on memory allocation failure 2023-02-14 19:18:01 +01:00
soc-utils.c ASoC: soc-utils: Remove __exit for snd_soc_util_exit() 2022-11-26 09:24:35 +01:00