From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by yocto-www.yoctoproject.org (Postfix, from userid 118) id 150B3E00873; Tue, 20 Jan 2015 16:34:38 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on yocto-www.yoctoproject.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-HAM-Report: * -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no * trust * [193.201.172.117 listed in list.dnswl.org] * 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider * (picmaster[at]mail.bg) * -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% * [score: 0.0000] * -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's * domain * 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily * valid * -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature Received: from mx1.mail.bg (mx1.mail.bg [193.201.172.117]) by yocto-www.yoctoproject.org (Postfix) with ESMTP id 56DAEE00860 for ; Tue, 20 Jan 2015 16:34:34 -0800 (PST) Received: from [192.168.0.123] (unknown [93.152.132.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.mail.bg (Postfix) with ESMTPSA id 356426001106; Wed, 21 Jan 2015 02:34:33 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mail.bg; s=default; t=1421800473; bh=ok0zdIcwzRG6FDDiREN8dvwuXb4Xzzp2xPE0ctiG7jU=; h=Message-ID:Date:From:MIME-Version:To:CC:Subject:References: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=MaKrF5Qa/lPE0+xuvGdQboSykNeWnpe9kHTkxP5oFXn8UiunA1+d25EGm7eQqqCGu GjN7uuXduVzhmnhziLXDFMuFWUcCGemBvQy+KpdvMm2Y9hr02dY554uBwbHQC5AjKs vn4JD08eFjzEOXGgmGKYGpTc+s3bGXidSUKOBqS8= Message-ID: <54BEF411.9080503@mail.bg> Date: Wed, 21 Jan 2015 02:34:25 +0200 From: Nikolay Dimitrov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.3.0 MIME-Version: 1.0 To: Fabio Estevam References: <54BED2E8.70901@mail.bg> In-Reply-To: Cc: "meta-freescale@yoctoproject.org" Subject: Re: Audio glitch with SGTL5000 X-BeenThere: meta-freescale@yoctoproject.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Usage and development list for the meta-fsl-* layers List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Jan 2015 00:34:38 -0000 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi Fabio, On 01/21/2015 12:23 AM, Fabio Estevam wrote: > On Tue, Jan 20, 2015 at 8:12 PM, Nikolay Dimitrov wrote: >> Hi guys, >> >> I'm observing a specific issue with SGTL5000 - after I stop the audio >> playback, after several seconds there's a single strong audio glitch >> (thump, pulse). In my case the audio codec is directly connected to the >> product speaker amps (without any attenuators) and the experience can >> be hardly described as pleasant... > > Does this patch help? > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/sound/soc/codecs/sgtl5000.c?id=c251ea7bd7a04f1f2575467e0de76e803cf59149 Thanks for your fast answer! Just tried the patch, but unfortunately it doesn't solve my issue - the pop is still observed on line-out. I tried to reproduce the issue also with the integrated headphone amp, just to find out that my board design has an issue (oops!) - the headphones' ground is connected to the power supply ground instead of the virtual ground, so I can't test the VAG ramp fix this way. So I can only speculate that you tested your fix on a properly wired headphone output, and that's where it worked OK. Btw, I verified with a protocol analyzer whether the kernel actually sends the proper I2C commands to the audio codec, and I can confirm that all commands are sent and acknowledged as expected (including the SMALL_POP bit setting). My quick-fix for this was to remove almost all DAPM widgets and configure the registers only once at start, and this avoid the pop/click on line-out: diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index ea47938..1223fb7 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -142,32 +142,6 @@ static int mic_bias_event(struct snd_soc_dapm_widget *w, return 0; } -/* - * As manual described, ADC/DAC only works when VAG powerup, - * So enabled VAG before ADC/DAC up. - * In power down case, we need wait 400ms when vag fully ramped down. - */ -static int power_vag_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - switch (event) { - case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(w->codec, SGTL5000_CHIP_ANA_POWER, - SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP); - break; - - case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(w->codec, SGTL5000_CHIP_ANA_POWER, - SGTL5000_VAG_POWERUP, 0); - msleep(400); - break; - default: - break; - } - - return 0; -} - /* input sources for ADC */ static const char *adc_mux_text[] = { "MIC_IN", "LINE_IN" @@ -201,50 +175,15 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = { mic_bias_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_PGA("HP", SGTL5000_CHIP_ANA_POWER, 4, 0, NULL, 0), - SND_SOC_DAPM_PGA("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0), - SND_SOC_DAPM_MUX("Capture Mux", SND_SOC_NOPM, 0, 0, &adc_mux), SND_SOC_DAPM_MUX("Headphone Mux", SND_SOC_NOPM, 0, 0, &dac_mux), - - /* aif for i2s input */ - SND_SOC_DAPM_AIF_IN("AIFIN", "Playback", - 0, SGTL5000_CHIP_DIG_POWER, - 0, 0), - - /* aif for i2s output */ - SND_SOC_DAPM_AIF_OUT("AIFOUT", "Capture", - 0, SGTL5000_CHIP_DIG_POWER, - 1, 0), - - SND_SOC_DAPM_SUPPLY("VAG_POWER", SGTL5000_CHIP_ANA_POWER, 7, 0, - power_vag_event, - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - - SND_SOC_DAPM_ADC("ADC", "Capture", SGTL5000_CHIP_ANA_POWER, 1, 0), - SND_SOC_DAPM_DAC("DAC", "Playback", SGTL5000_CHIP_ANA_POWER, 3, 0), }; /* routes for sgtl5000 */ static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = { {"Capture Mux", "LINE_IN", "LINE_IN"}, /* line_in --> adc_mux */ {"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */ - - {"ADC", NULL, "VAG_POWER"}, - {"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */ - {"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */ - - {"DAC", NULL, "VAG_POWER"}, - {"DAC", NULL, "AIFIN"}, /* i2s-->dac,skip audio mux */ - {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */ - {"LO", NULL, "DAC"}, /* dac --> line_out */ - - {"LINE_IN", NULL, "VAG_POWER"}, {"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */ - {"HP", NULL, "Headphone Mux"}, /* hp_mux --> hp */ - - {"LINE_OUT", NULL, "LO"}, - {"HP_OUT", NULL, "HP"}, }; /* custom function to fetch info of PCM playback volume */ @@ -1100,7 +1039,13 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) ana_pwr = snd_soc_read(codec, SGTL5000_CHIP_ANA_POWER); ana_pwr |= SGTL5000_DAC_STEREO | SGTL5000_ADC_STEREO | - SGTL5000_REFTOP_POWERUP; + SGTL5000_VAG_POWERUP | + SGTL5000_REFTOP_POWERUP | + SGTL5000_DAC_POWERUP | + SGTL5000_CAPLESS_HP_POWERUP | + SGTL5000_ADC_POWERUP | + SGTL5000_LINE_OUT_POWERUP; + lreg_ctrl = snd_soc_read(codec, SGTL5000_CHIP_LINREG_CTRL); if (vddio < 3100 && vdda < 3100) { @@ -1330,7 +1275,10 @@ static int sgtl5000_probe(struct snd_soc_codec *codec) snd_soc_write(codec, SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAC_SEL_I2S_IN << SGTL5000_DAC_SEL_SHIFT); snd_soc_write(codec, SGTL5000_CHIP_DIG_POWER, - SGTL5000_ADC_EN | SGTL5000_DAC_EN); + SGTL5000_ADC_EN | + SGTL5000_DAC_EN | + SGTL5000_I2S_OUT_POWERUP | + SGTL5000_I2S_IN_POWERUP); /* enable dac volume ramp by default */ snd_soc_write(codec, SGTL5000_CHIP_ADCDAC_CTRL, Well, I don't like this brute-force approach and that's why I'm looking for a more intelligent one. Kind regards, Nikolay