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,
},
};