summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/imx-wm8962.c
diff options
context:
space:
mode:
authorShengjiu Wang <shengjiu.wang@freescale.com>2017-09-01 13:46:47 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:50:15 +0800
commit2f0990fdeeb0f5487aca0017dc67e5d9f20e5dda (patch)
treef772f2a79950893bd5035eec9532dd57e3707366 /sound/soc/fsl/imx-wm8962.c
parent4b5fcca4a15c86e485b61fcd01bab21c5c53cad5 (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.c15
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");