2024/01/10 14:15
先获取audio clk:
ma35d1_audio->clk = of_clk_get(pdev->dev.of_node, 0);
if (IS_ERR(ma35d1_audio->clk)) {
dev_err(&pdev->dev, "clk_get error\n");
ret = PTR_ERR(ma35d1_audio->clk);
goto out2;
}
clk_prepare_enable(ma35d1_audio->clk);
然后通过下面的计算得到mclk:
static int ma35d1_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir)
{
struct ma35d1_audio *ma35d1_audio = dev_get_drvdata(cpu_dai->dev);
unsigned int i2s_clk, bitrate, mclkdiv, bclkdiv;
i2s_clk = clk_get_rate(ma35d1_audio->clk);
bitrate = freq * 2U * 16U;
bclkdiv = ((((i2s_clk * 10UL / bitrate) >> 1U) + 5UL) / 10UL) - 1U;
mclkdiv = (i2s_clk / 12000000) >> 1;
AUDIO_WRITE(ma35d1_audio->mmio + I2S_CLKDIV, (bclkdiv << 8) | mclkdiv);
return 0;
}