[alsa-devel] Audio play problem with tlv320aic3106 in mainline.
Dear all,
Recently I sent some patches to add support for a new board based on AM335x processor [1]. The board has the TLV320AIC3106 audio codec, the MCLK signal is provided by an external oscillator of 12MHz. The problem is that when I play a wav file for example I heard the song a double speed. This is with v4.0 and current mainline.
In dts file I defined "ti,codec-clock-rate = <12000000>;" which is the correct value. Curiously when I changed the clock rate value to 24000000 I heard the song at normal speed. AFAIK the correct value for clock-rate is 12MHz so I suspect that something is wrong in the driver, maybe it sets a wrong clock divider/multiplier ? Anyone can point me in the right direction to fix the issue ? I see that am335x-evm and am335x-pepper boards also uses this audio codec, did anyone with those boards have the same problem?
[1] https://patchwork.kernel.org/patch/6480071/
Thanks in advance, Enric
On 05/28/2015 02:36 PM, Enric Balletbo Serra wrote:
Dear all,
Recently I sent some patches to add support for a new board based on AM335x processor [1]. The board has the TLV320AIC3106 audio codec, the MCLK signal is provided by an external oscillator of 12MHz. The problem is that when I play a wav file for example I heard the song a double speed. This is with v4.0 and current mainline.
In dts file I defined "ti,codec-clock-rate = <12000000>;" which is the correct value. Curiously when I changed the clock rate value to 24000000 I heard the song at normal speed. AFAIK the correct value for clock-rate is 12MHz so I suspect that something is wrong in the driver, maybe it sets a wrong clock divider/multiplier ? Anyone can point me in the right direction to fix the issue ? I see that am335x-evm and am335x-pepper boards also uses this audio codec, did anyone with those boards have the same problem?
It might be really 24MHz. If the MCLK in your board is wired like am335x-evmsk or how BeagleBone's audio capes are wired (MCLK is coming from AM335x's EVENT_INTR0/1 pin as CLKOUT1/2) then 24MHz is correct. On the am335x-evm there is a dedicated crystal providing the 12MHz.
[1] https://patchwork.kernel.org/patch/6480071/
Thanks in advance, Enric
Thanks for the answer Peter,
2015-05-29 9:20 GMT+02:00 Peter Ujfalusi peter.ujfalusi@ti.com:
On 05/28/2015 02:36 PM, Enric Balletbo Serra wrote:
Dear all,
Recently I sent some patches to add support for a new board based on AM335x processor [1]. The board has the TLV320AIC3106 audio codec, the MCLK signal is provided by an external oscillator of 12MHz. The problem is that when I play a wav file for example I heard the song a double speed. This is with v4.0 and current mainline.
In dts file I defined "ti,codec-clock-rate = <12000000>;" which is the correct value. Curiously when I changed the clock rate value to 24000000 I heard the song at normal speed. AFAIK the correct value for clock-rate is 12MHz so I suspect that something is wrong in the driver, maybe it sets a wrong clock divider/multiplier ? Anyone can point me in the right direction to fix the issue ? I see that am335x-evm and am335x-pepper boards also uses this audio codec, did anyone with those boards have the same problem?
It might be really 24MHz. If the MCLK in your board is wired like am335x-evmsk or how BeagleBone's audio capes are wired (MCLK is coming from AM335x's EVENT_INTR0/1 pin as CLKOUT1/2) then 24MHz is correct. On the am335x-evm there is a dedicated crystal providing the 12MHz.
Well, in my board there is also a dedicated crystal providing the 12MHz, so I expect that the correct value for clock-frequency is 12MHz not 24MHz.
clocks { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <0>;
/* audio external oscillator */ tlv320aic3x_mclk: oscillator@0 { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <12000000>; /* 12MHz */ }; };
sound { compatible = "ti,da830-evm-audio"; ti,model = "AM335x-SL50"; ti,audio-codec = <&audio_codec>; ti,mcasp-controller = <&mcasp0>;
clocks = <&tlv320aic3x_mclk>; clock-names = "mclk";
ti,audio-routing = "Headphone Jack", "HPLOUT", "Headphone Jack", "HPROUT", "LINE1R", "Line In", "LINE1L", "Line In"; };
For me it's really odd have to set the clock-frequency to 24MHz to make it work
clock-frequency = <24000000>;
For that reason I'm wondering if there is a bug in the driver, did anyone test with an am335x-evm board ?
[1] https://patchwork.kernel.org/patch/6480071/
Thanks in advance, Enric
-- Péter
Thanks, Enric
On 05/29/2015 12:24 PM, Enric Balletbo Serra wrote:
It might be really 24MHz. If the MCLK in your board is wired like am335x-evmsk or how BeagleBone's audio capes are wired (MCLK is coming from AM335x's EVENT_INTR0/1 pin as CLKOUT1/2) then 24MHz is correct. On the am335x-evm there is a dedicated crystal providing the 12MHz.
Well, in my board there is also a dedicated crystal providing the 12MHz, so I expect that the correct value for clock-frequency is 12MHz not 24MHz.
I was wrong with the BBW audio cape.. At least the RevA which I have does have 12MHz crystal connected to aic3106 MCLK, but there is a line to the SoC's CLKOUT2. By default the codec runs using the 12MHz. I have checked with a scope and yep, I have 12MHz for MCLK.
clocks { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <0>; /* audio external oscillator */ tlv320aic3x_mclk: oscillator@0 { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <12000000>; /* 12MHz */ }; }; sound { compatible = "ti,da830-evm-audio"; ti,model = "AM335x-SL50"; ti,audio-codec = <&audio_codec>; ti,mcasp-controller = <&mcasp0>; clocks = <&tlv320aic3x_mclk>; clock-names = "mclk"; ti,audio-routing = "Headphone Jack", "HPLOUT", "Headphone Jack", "HPROUT", "LINE1R", "Line In", "LINE1L", "Line In"; };
If I use this with my BBW+Audio cape: audio is fine.
For me it's really odd have to set the clock-frequency to 24MHz to make it work
clock-frequency = <24000000>;
If I change it to this, I will have slow motion playback, as expected.
For that reason I'm wondering if there is a bug in the driver, did anyone test with an am335x-evm board ?
I'm using linux-next. Not sure what could be the issue.
[1] https://patchwork.kernel.org/patch/6480071/
Thanks in advance, Enric
-- Péter
Thanks, Enric
Hi,
2015-05-29 14:16 GMT+02:00 Peter Ujfalusi peter.ujfalusi@ti.com:
On 05/29/2015 12:24 PM, Enric Balletbo Serra wrote:
It might be really 24MHz. If the MCLK in your board is wired like am335x-evmsk or how BeagleBone's audio capes are wired (MCLK is coming from AM335x's EVENT_INTR0/1 pin as CLKOUT1/2) then 24MHz is correct. On the am335x-evm there is a dedicated crystal providing the 12MHz.
Well, in my board there is also a dedicated crystal providing the 12MHz, so I expect that the correct value for clock-frequency is 12MHz not 24MHz.
I was wrong with the BBW audio cape.. At least the RevA which I have does have 12MHz crystal connected to aic3106 MCLK, but there is a line to the SoC's CLKOUT2. By default the codec runs using the 12MHz. I have checked with a scope and yep, I have 12MHz for MCLK.
clocks { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <0>; /* audio external oscillator */ tlv320aic3x_mclk: oscillator@0 { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <12000000>; /* 12MHz */ }; }; sound { compatible = "ti,da830-evm-audio"; ti,model = "AM335x-SL50"; ti,audio-codec = <&audio_codec>; ti,mcasp-controller = <&mcasp0>; clocks = <&tlv320aic3x_mclk>; clock-names = "mclk"; ti,audio-routing = "Headphone Jack", "HPLOUT", "Headphone Jack", "HPROUT", "LINE1R", "Line In", "LINE1L", "Line In"; };
If I use this with my BBW+Audio cape: audio is fine.
Tested with linux-next and same problem here, I also checked with a scope my clock and it's 12MHz but I need to apply this patch to make it work.
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index 731fb0d..8ce0d32 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c @@ -64,6 +64,11 @@ static int evm_hw_params(struct snd_pcm_substream *substream, unsigned sysclk = ((struct snd_soc_card_drvdata_davinci *) snd_soc_card_get_drvdata(soc_card))->sysclk;
+ ret = snd_soc_dai_set_clkdiv(cpu_dai, 0, 2); + if (ret < 0) + return ret; + /* set the codec system clock */ ret = snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_OUT); if (ret < 0)
Really odd, so we'll have something different, at the moment I don't know what could be the difference.
For me it's really odd have to set the clock-frequency to 24MHz to make it work
clock-frequency = <24000000>;
If I change it to this, I will have slow motion playback, as expected.
For that reason I'm wondering if there is a bug in the driver, did anyone test with an am335x-evm board ?
I'm using linux-next. Not sure what could be the issue.
[1] https://patchwork.kernel.org/patch/6480071/
Thanks in advance, Enric
-- Péter
Thanks, Enric
-- Péter
On 06/01/2015 12:16 PM, Enric Balletbo Serra wrote:
Hi,
2015-05-29 14:16 GMT+02:00 Peter Ujfalusi peter.ujfalusi@ti.com:
On 05/29/2015 12:24 PM, Enric Balletbo Serra wrote:
It might be really 24MHz. If the MCLK in your board is wired like am335x-evmsk or how BeagleBone's audio capes are wired (MCLK is coming from AM335x's EVENT_INTR0/1 pin as CLKOUT1/2) then 24MHz is correct. On the am335x-evm there is a dedicated crystal providing the 12MHz.
Well, in my board there is also a dedicated crystal providing the 12MHz, so I expect that the correct value for clock-frequency is 12MHz not 24MHz.
I was wrong with the BBW audio cape.. At least the RevA which I have does have 12MHz crystal connected to aic3106 MCLK, but there is a line to the SoC's CLKOUT2. By default the codec runs using the 12MHz. I have checked with a scope and yep, I have 12MHz for MCLK.
clocks { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <0>; /* audio external oscillator */ tlv320aic3x_mclk: oscillator@0 { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <12000000>; /* 12MHz */ }; }; sound { compatible = "ti,da830-evm-audio"; ti,model = "AM335x-SL50"; ti,audio-codec = <&audio_codec>; ti,mcasp-controller = <&mcasp0>; clocks = <&tlv320aic3x_mclk>; clock-names = "mclk"; ti,audio-routing = "Headphone Jack", "HPLOUT", "Headphone Jack", "HPROUT", "LINE1R", "Line In", "LINE1L", "Line In"; };
If I use this with my BBW+Audio cape: audio is fine.
Tested with linux-next and same problem here, I also checked with a scope my clock and it's 12MHz but I need to apply this patch to make it work.
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index 731fb0d..8ce0d32 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c @@ -64,6 +64,11 @@ static int evm_hw_params(struct snd_pcm_substream *substream, unsigned sysclk = ((struct snd_soc_card_drvdata_davinci *) snd_soc_card_get_drvdata(soc_card))->sysclk;
- ret = snd_soc_dai_set_clkdiv(cpu_dai, 0, 2);
- if (ret < 0)
return ret;
This does not make sense... McASP is supposed to be slave when used with compatible = "ti,da830-evm-audio" This means that the reference clock is coming from internal source and AHCLKX pin is output. Setting the divider for the high-frequency clock should not be needed since the McASP is not generating any of the clocks.
BTW: I see that in the DTS you are configuring the mcasp0.ahclkx pin. How this is used? While we are here, you can change the AXR2 pinmux to output.
I have 'cloned' your setup on my BBW+AudioCape where I also have 12MHz MCLK. I don't have any problem with the playback speed.
participants (2)
-
Enric Balletbo Serra
-
Peter Ujfalusi