summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
authorViorel Suman <viorel.suman@nxp.com>2017-08-07 16:56:06 +0300
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:27:59 +0800
commit3cfe13f204e8a6235dd693e03a71346fc2845871 (patch)
tree13b378e3664e3a83327bb038a2fb1f0acdbb5407 /sound/soc
parentda8624b704fa1cf4deb01cc1a2dc9baa8afaec1c (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.c35
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";