diff options
author | Viorel Suman <viorel.suman@nxp.com> | 2017-08-07 16:56:06 +0300 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2019-02-12 10:27:59 +0800 |
commit | 3cfe13f204e8a6235dd693e03a71346fc2845871 (patch) | |
tree | 13b378e3664e3a83327bb038a2fb1f0acdbb5407 /sound/soc | |
parent | da8624b704fa1cf4deb01cc1a2dc9baa8afaec1c (diff) |
MLK-13975: ASoC: fsl: amix: eliminate unsupported rates
Eliminate unsupported rates for SAI MCLK frequency = 24576000.
Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/fsl/imx-amix.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sound/soc/fsl/imx-amix.c b/sound/soc/fsl/imx-amix.c index 6cd2edcd4ceb..dba6f2c2bdeb 100644 --- a/sound/soc/fsl/imx-amix.c +++ b/sound/soc/fsl/imx-amix.c @@ -23,6 +23,7 @@ struct imx_amix { struct snd_soc_card card; struct platform_device *amix_pdev; struct platform_device *out_pdev; + unsigned int mclk_freq; int num_dai; struct snd_soc_dai_link *dai; int num_dai_conf; @@ -47,6 +48,31 @@ static void imx_amix_be_shutdown(struct snd_pcm_substream *substream) pm_runtime_put_sync(&priv->out_pdev->dev); } +static const u32 imx_amix_rates[] = { + 8000, 12000, 16000, 24000, 32000, 48000, 64000, 96000, +}; + +static const struct snd_pcm_hw_constraint_list imx_amix_rate_constraints = { + .count = ARRAY_SIZE(imx_amix_rates), + .list = imx_amix_rates, +}; + +static int imx_amix_fe_startup(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct imx_amix *priv = snd_soc_card_get_drvdata(rtd->card); + struct snd_pcm_runtime *runtime = substream->runtime; + struct device *dev = rtd->card->dev; + + if (priv->mclk_freq == 24576000) { + return snd_pcm_hw_constraint_list(runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, &imx_amix_rate_constraints); + } else + dev_warn(dev, "mclk may be not supported %d\n", priv->mclk_freq); + + return 0; +} + static int imx_amix_fe_prepare(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *be_rtd; @@ -137,6 +163,7 @@ static const struct snd_soc_pcm_stream amix_params = { }; static struct snd_soc_ops imx_amix_fe_ops = { + .startup = imx_amix_fe_startup, .prepare = imx_amix_fe_prepare, .shutdown = imx_amix_fe_shutdown, .hw_params = imx_amix_fe_hw_params, @@ -159,6 +186,7 @@ static int imx_amix_probe(struct platform_device *pdev) int i, num_dai, ret; const char *fe_name_pref = "HiFi-AMIX-FE-"; char *dai_name; + struct clk *cpu_mclk; num_dai = of_count_phandle_with_args(np, "dais", NULL); if (num_dai != FSL_AMIX_MAX_DAIS) { @@ -265,6 +293,13 @@ static int imx_amix_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to find SAI platform device\n"); return -EINVAL; } + cpu_mclk = devm_clk_get(&cpu_pdev->dev, "mclk1"); + if (IS_ERR(cpu_mclk)) { + ret = PTR_ERR(cpu_mclk); + dev_err(&cpu_pdev->dev, "failed to get DAI mclk1: %d\n", ret); + return -EINVAL; + } + priv->mclk_freq = clk_get_rate(cpu_mclk); /* Add AMIX Backend */ priv->dai[num_dai].name = "HiFi-AMIX-BE"; |