This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335X: WM8960 codec

hi,

I want play the audio file with wm8960 codec chip.

But, MCLK & BCLK are not set to the desired value.

                 current value                    desired value

    MCLk = 24.576Mhz                        12.288Mhz

    BCLK = 2.738Mhz                            3.072Mhz

 

if reducing the MCLK using the below function:

snd_soc_dai_set_clkdiv(cpu_dai, 0, 2);

                 current value                    desired value

    MCLk = 12.288Mhz                        12.288Mhz

    BCLK = 1.369Mhz                            3.072Mhz

 

How can I get the desired value?

 

Here is my environment:

    linux-3.14.26-g2489c02

    MCASP0

    wm8960

Here is my device tree:

&am33xx_pinmux { 

 mcasp0_pins: mcasp0_pins {
  pinctrl-single,pins = <
   0x1ac (PIN_INPUT_PULLUP | MUX_MODE0) /* mcasp0_ahclkx.mcasp0_ahclkx */
   0x190 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_aclkx.mcasp0_aclkx */
   0x194 (PIN_OUTPUT_PULLUP | MUX_MODE0) /* mcasp0_fsx.mcasp0_fsx */
   0x198 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_axr0.mcasp0_axr0 */
  >;
 };

 mcasp0_pins_sleep: mcasp0_pins_sleep {
  pinctrl-single,pins = <
   0x1ac (PIN_INPUT_PULLDOWN | MUX_MODE7) /* mcasp0_ahclkx.mcasp0_ahclkx */
   0x190 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* mcasp0_aclkx.mcasp0_aclkx */
   0x194 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* mcasp0_fsx.mcasp0_fsx */
   0x198 (PIN_INPUT_PULLDOWN | MUX_MODE7) /* mcasp0_axr0.mcasp0_axr0 */
  >;
 };

};

&mcasp0 {
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <&mcasp0_pins>;
 pinctrl-1 = <&mcasp0_pins_sleep>;
 status = "okay";
 op-mode = <0>; /* MCASP_IIS_MODE */
 tdm-slots = <2>;
 serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */
   1 0 0 0
  >;
 tx-num-evt = <1>;
 rx-num-evt = <1>;
};

&i2c0 {
 wm8960:wm8960@1a {
  compatible = "wlf,wm8960";
  reg = <0x1a>;
  status = "okay";
  wlf,shared-lrclk;
 };
};

/ {
 sound {
  compatible = "ti,wm8960-evm-audio";
  ti,model = "WM8960";
  ti,audio-codec = <&wm8960>;
  ti,mcasp-controller = <&mcasp0>;
  ti,codec-clock-rate = <12288000>;
 };
};

Here is my davinci-evm.c added code:

 static int evm_wm8960_hw_params(struct snd_pcm_substream *substream,
              struct snd_pcm_hw_params *params)
 {
     struct snd_soc_pcm_runtime *rtd = substream->private_data;
     struct snd_soc_dai *codec_dai = rtd->codec_dai;
     struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
     struct snd_soc_card *soc_card = rtd->card;
     int ret = 0;
     unsigned sysclk = ((struct snd_soc_card_drvdata_davinci *)
                snd_soc_card_get_drvdata(soc_card))->sysclk;
 
     /* set the codec system clock */
     ret = snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_IN);
     if (ret < 0)
     {
         printk("[%s] codec_dai snd_soc_dai_set_sysclk err(0x%x)\n", __func__, ret);
         return ret;
     }
 
     /* set the CPU system clock */
     ret = snd_soc_dai_set_sysclk(cpu_dai, 0, sysclk, SND_SOC_CLOCK_OUT);
     if (ret < 0)
     {
         printk("[%s] cpu_dai snd_soc_dai_set_sysclk err\n", __func__);
         return ret;
     }
 
     return 0; 
 } 

 static int evm_wm8960_init(struct snd_soc_pcm_runtime *rtd)
 {
 
     return 0;
 }

 static struct snd_soc_dai_link evm_dai_wm8960 = {
     .name       = "wm8960",
     .stream_name    = "Playback",
     .codec_dai_name = "wm8960-hifi",
     .ops            = &evm_wm8960_ops,
     .init           = evm_wm8960_init,
     .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS |
          SND_SOC_DAIFMT_IB_NF,
 };
 
 static const struct of_device_id davinci_evm_dt_ids[] = {
 
  {
   .compatible = "ti,wm8960-evm-audio",
   .data = &evm_dai_wm8960,
  },
 };