From 2f0990fdeeb0f5487aca0017dc67e5d9f20e5dda Mon Sep 17 00:00:00 2001 From: Shengjiu Wang Date: Fri, 1 Sep 2017 13:46:47 +0800 Subject: MLK-16350-5: ASoC: imx-wm8962: fix clock rate issue The rate returned by clk_get_rate in probe function is not correct, for the power domain in that time may be closed, kernel get 0 rate from scfw, so move the clk_get_rate to hw_params, in that time, the power domain should be enabled Signed-off-by: Shengjiu Wang --- sound/soc/fsl/imx-wm8962.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'sound/soc/fsl/imx-wm8962.c') diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c index d408fd359c75..b532b46a55e0 100644 --- a/sound/soc/fsl/imx-wm8962.c +++ b/sound/soc/fsl/imx-wm8962.c @@ -38,6 +38,7 @@ struct imx_wm8962_data { struct snd_soc_card card; char codec_dai_name[DAI_NAME_SIZE]; char platform_name[DAI_NAME_SIZE]; + struct clk *codec_clk; unsigned int clk_frequency; bool is_codec_master; }; @@ -261,6 +262,8 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card, if (dapm->dev != codec_dai->dev) return 0; + data->clk_frequency = clk_get_rate(data->codec_clk); + switch (level) { case SND_SOC_BIAS_PREPARE: if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { @@ -341,6 +344,8 @@ static int imx_hifi_hw_params(struct snd_pcm_substream *substream, return 0; } + data->clk_frequency = clk_get_rate(data->codec_clk); + if (data->is_codec_master) dai_format = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM; @@ -529,6 +534,7 @@ static int imx_wm8962_late_probe(struct snd_soc_card *card) struct device *dev = &priv->pdev->dev; int ret; + data->clk_frequency = clk_get_rate(data->codec_clk); rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name); codec_dai = rtd->codec_dai; ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK, @@ -667,16 +673,13 @@ audmux_bypass: priv->first_stream = NULL; priv->second_stream = NULL; - codec_clk = clk_get(&codec_dev->dev, NULL); - if (IS_ERR(codec_clk)) { - ret = PTR_ERR(codec_clk); + data->codec_clk = clk_get(&codec_dev->dev, NULL); + if (IS_ERR(data->codec_clk)) { + ret = PTR_ERR(data->codec_clk); dev_err(&codec_dev->dev, "failed to get codec clk: %d\n", ret); goto fail; } - data->clk_frequency = clk_get_rate(codec_clk); - clk_put(codec_clk); - priv->amic_mono = of_property_read_bool(codec_np, "amic-mono"); priv->dmic_mono = of_property_read_bool(codec_np, "dmic-mono"); -- cgit v1.2.3