Skip to content

Commit 107a5c8

Browse files
laklimovbroonie
authored andcommitted
ASoC: codecs: wcd937x: relax the AUX PDM watchdog
On a system with wcd937x, rxmacro and Qualcomm audio DSP, which is pretty common set of devices on Qualcomm platforms, and due to the order of how DAPM widgets are powered on (they are sorted), there is a small time window when wcd937x chip is online and expects the flow of incoming data but rxmacro is not yet online. When wcd937x is programmed to receive data via AUX port then its AUX PDM watchdog is enabled in wcd937x_codec_enable_aux_pa(). If due to some reasons the rxmacro and soundwire machinery are delayed to start streaming data, then there is a chance for this AUX PDM watchdog to reset the wcd937x codec. Such event is not logged as a message and only wcd937x IRQ counter is increased however there could be a lot of other reasons for that IRQ. There is a similar opportunity for such delay during DAPM widgets power down sequence. If wcd937x codec reset happens on the start of the playback, then there will be no sound and if such reset happens at the end of a playback then it may generate additional clicks and pops noises. On qrb4210 RB2 board without any debugging bits the wcd937x resets are sometimes observed at the end of a playback though not always. With some debugging messages or with some tracing enabled the AUX PDM watchdog resets the wcd937x codec at the start of a playback and there is no sound output at all. In this patch: - TIMEOUT_SEL bit in PDM_WD_CTL2 register is set to increase the watchdog reset delay to 100ms which eliminates the AUX PDM watchdog IRQs on qrb4210 RB2 board completely and decreases the number of unwanted clicks noises; - HOLD_OFF bit postpones triggering such watchdog IRQ till wcd937x codec reset which usually happens at the end of a playback. This allows to actually output some sound in case of debugging. Cc: Adam Skladowski <a39.skl@gmail.com> Cc: Mohammad Rafi Shaik <quic_mohs@quicinc.com> Cc: Prasad Kumpatla <quic_pkumpatl@quicinc.com> Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Signed-off-by: Alexey Klimov <alexey.klimov@linaro.org> Link: https://patch.msgid.link/20241022033132.787416-3-alexey.klimov@linaro.org Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 041db4b commit 107a5c8

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

sound/soc/codecs/wcd937x.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,12 +715,17 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
715715
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
716716
struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
717717
int hph_mode = wcd937x->hph_mode;
718+
u8 val;
718719

719720
switch (event) {
720721
case SND_SOC_DAPM_PRE_PMU:
722+
val = WCD937X_DIGITAL_PDM_WD_CTL2_EN |
723+
WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL |
724+
WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF;
721725
snd_soc_component_update_bits(component,
722726
WCD937X_DIGITAL_PDM_WD_CTL2,
723-
BIT(0), BIT(0));
727+
WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
728+
val);
724729
break;
725730
case SND_SOC_DAPM_POST_PMU:
726731
usleep_range(1000, 1010);
@@ -741,7 +746,8 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
741746
hph_mode);
742747
snd_soc_component_update_bits(component,
743748
WCD937X_DIGITAL_PDM_WD_CTL2,
744-
BIT(0), 0x00);
749+
WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
750+
0x00);
745751
break;
746752
}
747753

sound/soc/codecs/wcd937x.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,10 @@
391391
#define WCD937X_DIGITAL_PDM_WD_CTL0 0x3465
392392
#define WCD937X_DIGITAL_PDM_WD_CTL1 0x3466
393393
#define WCD937X_DIGITAL_PDM_WD_CTL2 0x3467
394+
#define WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF BIT(2)
395+
#define WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL BIT(1)
396+
#define WCD937X_DIGITAL_PDM_WD_CTL2_EN BIT(0)
397+
#define WCD937X_DIGITAL_PDM_WD_CTL2_MASK GENMASK(2, 0)
394398
#define WCD937X_DIGITAL_INTR_MODE 0x346A
395399
#define WCD937X_DIGITAL_INTR_MASK_0 0x346B
396400
#define WCD937X_DIGITAL_INTR_MASK_1 0x346C

0 commit comments

Comments
 (0)