Patch "ASoC: codecs: wcd937x: relax the AUX PDM watchdog" has been added to the 6.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ASoC: codecs: wcd937x: relax the AUX PDM watchdog

to the 6.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     asoc-codecs-wcd937x-relax-the-aux-pdm-watchdog.patch
and it can be found in the queue-6.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2787a1d652f65a3c7d1836aedf29116fa42ad557
Author: Alexey Klimov <alexey.klimov@xxxxxxxxxx>
Date:   Tue Oct 22 04:31:31 2024 +0100

    ASoC: codecs: wcd937x: relax the AUX PDM watchdog
    
    [ Upstream commit 107a5c853eef5336a9846e7dd2f9184b6e3c07c7 ]
    
    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@xxxxxxxxx>
    Cc: Mohammad Rafi Shaik <quic_mohs@xxxxxxxxxxx>
    Cc: Prasad Kumpatla <quic_pkumpatl@xxxxxxxxxxx>
    Cc: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
    Signed-off-by: Alexey Klimov <alexey.klimov@xxxxxxxxxx>
    Link: https://patch.msgid.link/20241022033132.787416-3-alexey.klimov@xxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/sound/soc/codecs/wcd937x.c b/sound/soc/codecs/wcd937x.c
index 63b25c321a03d..3c1224d8f2dff 100644
--- a/sound/soc/codecs/wcd937x.c
+++ b/sound/soc/codecs/wcd937x.c
@@ -715,12 +715,17 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
 	struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
 	int hph_mode = wcd937x->hph_mode;
+	u8 val;
 
 	switch (event) {
 	case SND_SOC_DAPM_PRE_PMU:
+		val = WCD937X_DIGITAL_PDM_WD_CTL2_EN |
+		      WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL |
+		      WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF;
 		snd_soc_component_update_bits(component,
 					      WCD937X_DIGITAL_PDM_WD_CTL2,
-					      BIT(0), BIT(0));
+					      WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
+					      val);
 		break;
 	case SND_SOC_DAPM_POST_PMU:
 		usleep_range(1000, 1010);
@@ -741,7 +746,8 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
 					hph_mode);
 		snd_soc_component_update_bits(component,
 					      WCD937X_DIGITAL_PDM_WD_CTL2,
-					      BIT(0), 0x00);
+					      WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
+					      0x00);
 		break;
 	}
 
diff --git a/sound/soc/codecs/wcd937x.h b/sound/soc/codecs/wcd937x.h
index 37bff16e88ddd..a2bd47a93e507 100644
--- a/sound/soc/codecs/wcd937x.h
+++ b/sound/soc/codecs/wcd937x.h
@@ -391,6 +391,10 @@
 #define WCD937X_DIGITAL_PDM_WD_CTL0		0x3465
 #define WCD937X_DIGITAL_PDM_WD_CTL1		0x3466
 #define WCD937X_DIGITAL_PDM_WD_CTL2		0x3467
+#define WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF	BIT(2)
+#define WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL	BIT(1)
+#define WCD937X_DIGITAL_PDM_WD_CTL2_EN		BIT(0)
+#define WCD937X_DIGITAL_PDM_WD_CTL2_MASK	GENMASK(2, 0)
 #define WCD937X_DIGITAL_INTR_MODE		0x346A
 #define WCD937X_DIGITAL_INTR_MASK_0		0x346B
 #define WCD937X_DIGITAL_INTR_MASK_1		0x346C




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux