linux/sound/soc
Paweł Anikiel f63550e2b1
ASoC: ssm2602: Add workaround for playback distortions
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
2023-05-12 10:26:47 +09:00
..
adi ASoC: adi: axi-spdif: Convert to platform remove callback returning void 2023-03-20 13:07:10 +00:00
amd ASoC: amd: yc: Add DMI entry to support System76 Pangolin 12 2023-05-08 09:07:42 +09:00
apple ASoC: apple: mca: Convert to platform remove callback returning void 2023-03-20 13:07:18 +00:00
atmel ASoC: atmel: remove unnecessary dai_link->platform 2023-03-24 12:15:18 +00:00
au1x ASoC: au1x: psc-i2s: Convert to platform remove callback returning void 2023-03-20 13:07:31 +00:00
bcm ASoC: bcm: cygnus-ssp: Convert to platform remove callback returning void 2023-03-20 13:07:33 +00:00
cirrus ASoC: ep93xx: Add OF support 2023-04-12 12:54:23 +01:00
codecs ASoC: ssm2602: Add workaround for playback distortions 2023-05-12 10:26:47 +09:00
dwc ASoC: dwc: limit the number of overrun messages 2023-05-08 09:07:43 +09:00
fsl ASoC: fsl_micfil: Fix error handler with pm_runtime_enable 2023-05-08 22:35:10 +09:00
generic ASoC: audio-graph-card2: switch to use c2c_params instead of params 2023-04-05 12:16:37 +01:00
hisilicon
img ASoC: img: pistachio-internal-dac: Convert to platform remove callback returning void 2023-03-20 13:08:22 +00:00
intel ASoC: Intel: soc-acpi-cht: Add quirk for Nextbook Ares 8A tablet 2023-05-04 10:14:31 +09:00
jz4740 ASoC: jz4740-i2s: Make I2S divider calculations more robust 2023-05-11 10:17:58 +09:00
kirkwood ASoC: kirkwood: kirkwood-i2s: Convert to platform remove callback returning void 2023-03-20 13:08:35 +00:00
mediatek ASoC: mediatek: common: Fix refcount leak in parse_dai_link_info 2023-04-11 12:40:07 +01:00
meson ASoC: meson: switch to use c2c_params instead of params 2023-04-05 12:16:37 +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: pxa2xx-ac97: Convert to platform remove callback returning void 2023-03-20 13:08:46 +00:00
qcom ASoC: qcom: sdw: do not restart soundwire ports for every prepare 2023-04-06 14:45:12 +01:00
rockchip ALSA/ASoC: Convert to platform remove callback 2023-03-21 16:29:48 +00:00
samsung ASoC: samsung: switch to use c2c_params instead of params 2023-04-05 12:16:38 +01:00
sh ASoC: sh: siu_dai: Convert to platform remove callback returning void 2023-03-20 13:09:01 +00:00
sof ASoC: SOF: amd: Fix NULL pointer crash in acp_sof_ipc_msg_data function 2023-05-09 14:43:33 +09: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
sti
stm ASoC: stm: stm32_spdifrx: Convert to platform remove callback returning void 2023-03-20 13:09:05 +00:00
sunxi ASoC: sunxi: sun8i-codec: Convert to platform remove callback returning void 2023-03-20 13:09:10 +00:00
tegra ASoC: tegra20_ac97: Add missing unwind goto in tegra20_ac97_platform_probe() 2023-04-04 12:46:42 +01:00
ti ASoC: ti: remove unnecessary dai_link->platform 2023-03-24 12:15:19 +00:00
uniphier ASoC: uniphier: evea: Convert to platform remove callback returning void 2023-03-20 13:09:31 +00:00
ux500 ASoC: ux500: ux500_msp_dai: Convert to platform remove callback returning void 2023-03-20 13:09:32 +00: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
Makefile
soc-ac97.c ASoC: soc-ac97: Return correct error codes 2023-02-15 16:09:07 +00:00
soc-acpi.c
soc-card.c
soc-component.c ASoC: expand snd_soc_dpcm_mutex_lock/unlock() 2023-04-17 12:57:25 +01:00
soc-compress.c ASoC: add snd_soc_card_mutex_lock/unlock() 2023-04-17 12:57:26 +01:00
soc-core.c ASoC: add snd_soc_card_mutex_lock/unlock() 2023-04-17 12:57:26 +01:00
soc-dai.c ASoC: soc-dai.c: add missing flag check at snd_soc_pcm_dai_probe() 2023-03-14 13:58:56 +00:00
soc-dapm.c ASoC: expand snd_soc_dapm_mutex_lock/unlock() 2023-04-17 12:57:24 +01:00
soc-devres.c
soc-generic-dmaengine-pcm.c
soc-jack.c ASoC: jack: allow multiple interrupt per gpio 2023-03-05 23:38:38 +00:00
soc-link.c
soc-ops.c
soc-pcm.c ASoC: expand snd_soc_dpcm_mutex_lock/unlock() 2023-04-17 12:57:25 +01:00
soc-topology-test.c
soc-topology.c ASoC: soc-topology.c: dai_link->platform again 2023-03-29 17:43:23 +01:00
soc-utils-test.c
soc-utils.c