diff options
author | Shengjiu Wang <shengjiu.wang@freescale.com> | 2017-09-01 13:46:47 +0800 |
---|---|---|
committer | Dong Aisheng <aisheng.dong@nxp.com> | 2019-11-25 15:50:15 +0800 |
commit | 2f0990fdeeb0f5487aca0017dc67e5d9f20e5dda (patch) | |
tree | f772f2a79950893bd5035eec9532dd57e3707366 /sound/soc/fsl/imx-wm8962.c | |
parent | 4b5fcca4a15c86e485b61fcd01bab21c5c53cad5 (diff) |
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 <shengjiu.wang@freescale.com>
Diffstat (limited to 'sound/soc/fsl/imx-wm8962.c')
-rw-r--r-- | sound/soc/fsl/imx-wm8962.c | 15 |
1 files changed, 9 insertions, 6 deletions
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"); |