From: Georgii Staroselskii <georgii.starosels...@emlid.com>

[ Upstream commit 1f2675f6655838aaf910f911fd0abc821e3ff3df ]

Allwinner DAC seems to have a delay in the Speaker audio routing. When
playing a sound for the first time, the sound gets chopped. On a second
play the sound is played correctly. After some time (~5s) the issue gets
back.

This commit seems to be fixing the same issue as bf14da7 but
for another codepath.

This is the DTS that was used to debug the problem.

&codec {
        allwinner,pa-gpios = <&r_pio 0 11 GPIO_ACTIVE_HIGH>; /* PL11 */
        allwinner,audio-routing =
                "Speaker", "LINEOUT";

        status = "okay";
}

Signed-off-by: Georgii Staroselskii <georgii.starosels...@emlid.com>
Reviewed-by: Chen-Yu Tsai <w...@csie.org>
Signed-off-by: Mark Brown <broo...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 sound/soc/sunxi/sun4i-codec.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
index 9a3cb7704810..73f242460afd 100644
--- a/sound/soc/sunxi/sun4i-codec.c
+++ b/sound/soc/sunxi/sun4i-codec.c
@@ -1210,6 +1210,15 @@ static int sun4i_codec_spk_event(struct 
snd_soc_dapm_widget *w,
        gpiod_set_value_cansleep(scodec->gpio_pa,
                                 !!SND_SOC_DAPM_EVENT_ON(event));
 
+       if (SND_SOC_DAPM_EVENT_ON(event)) {
+               /*
+                * Need a delay to wait for DAC to push the data. 700ms seems
+                * to be the best compromise not to feel this delay while
+                * playing a sound.
+                */
+               msleep(700);
+       }
+
        return 0;
 }
 
-- 
2.20.1

Reply via email to