summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/imx-cs42888.c
diff options
context:
space:
mode:
authorShengjiu Wang <shengjiu.wang@freescale.com>2016-04-08 14:52:03 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:50:04 +0800
commit65c3a6b2291266a908cc6a46154396540a9390fd (patch)
tree8dba8f5d9936cb72cacc94c3b07735142dbf7977 /sound/soc/fsl/imx-cs42888.c
parent5cf8ad51eebaede2a9ac3dc0dc5cd07a83822f20 (diff)
MLK-12745-1: ASoC: imx-cs42888: add codec master mode support
Add codec master mode support, the default is slave mode. Signed-off-by: Shengjiu Wang <shengjiu.wang@freescale.com>
Diffstat (limited to 'sound/soc/fsl/imx-cs42888.c')
-rw-r--r--sound/soc/fsl/imx-cs42888.c61
1 files changed, 44 insertions, 17 deletions
diff --git a/sound/soc/fsl/imx-cs42888.c b/sound/soc/fsl/imx-cs42888.c
index 51fa05b7df7b..f0f2bf461672 100644
--- a/sound/soc/fsl/imx-cs42888.c
+++ b/sound/soc/fsl/imx-cs42888.c
@@ -37,6 +37,7 @@ struct imx_priv {
struct platform_device *asrc_pdev;
u32 asrc_rate;
u32 asrc_format;
+ bool is_codec_master;
};
static struct imx_priv card_priv;
@@ -52,24 +53,47 @@ static int imx_cs42888_surround_hw_params(struct snd_pcm_substream *substream,
u32 dai_format = 0;
int ret = 0;
- dai_format = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
- SND_SOC_DAIFMT_CBS_CFS;
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- ret = snd_soc_dai_set_sysclk(cpu_dai, ESAI_HCKT_EXTAL,
- priv->mclk_freq, SND_SOC_CLOCK_OUT);
- else
- ret = snd_soc_dai_set_sysclk(cpu_dai, ESAI_HCKR_EXTAL,
- priv->mclk_freq, SND_SOC_CLOCK_OUT);
- if (ret) {
- dev_err(dev, "failed to set cpu sysclk: %d\n", ret);
- return ret;
- }
+ if (priv->is_codec_master) {
+ dai_format = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
+ SND_SOC_DAIFMT_CBM_CFM;
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ ret = snd_soc_dai_set_sysclk(cpu_dai, ESAI_HCKT_EXTAL,
+ priv->mclk_freq, SND_SOC_CLOCK_IN);
+ else
+ ret = snd_soc_dai_set_sysclk(cpu_dai, ESAI_HCKR_EXTAL,
+ priv->mclk_freq, SND_SOC_CLOCK_IN);
+ if (ret) {
+ dev_err(dev, "failed to set cpu sysclk: %d\n", ret);
+ return ret;
+ }
- ret = snd_soc_dai_set_sysclk(codec_dai, 0,
- priv->mclk_freq, SND_SOC_CLOCK_IN);
- if (ret) {
- dev_err(dev, "failed to set codec sysclk: %d\n", ret);
- return ret;
+ ret = snd_soc_dai_set_sysclk(codec_dai, 0,
+ priv->mclk_freq, SND_SOC_CLOCK_OUT);
+ if (ret) {
+ dev_err(dev, "failed to set codec sysclk: %d\n", ret);
+ return ret;
+ }
+
+ } else {
+ dai_format = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
+ SND_SOC_DAIFMT_CBS_CFS;
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ ret = snd_soc_dai_set_sysclk(cpu_dai, ESAI_HCKT_EXTAL,
+ priv->mclk_freq, SND_SOC_CLOCK_OUT);
+ else
+ ret = snd_soc_dai_set_sysclk(cpu_dai, ESAI_HCKR_EXTAL,
+ priv->mclk_freq, SND_SOC_CLOCK_OUT);
+ if (ret) {
+ dev_err(dev, "failed to set cpu sysclk: %d\n", ret);
+ return ret;
+ }
+
+ ret = snd_soc_dai_set_sysclk(codec_dai, 0,
+ priv->mclk_freq, SND_SOC_CLOCK_IN);
+ if (ret) {
+ dev_err(dev, "failed to set codec sysclk: %d\n", ret);
+ return ret;
+ }
}
/* set cpu DAI configuration */
@@ -308,6 +332,9 @@ static int imx_cs42888_probe(struct platform_device *pdev)
}
priv->mclk_freq = clk_get_rate(codec_clk);
+ if (of_property_read_bool(pdev->dev.of_node, "codec-master"))
+ priv->is_codec_master = true;
+
snd_soc_card_imx_cs42888.dev = &pdev->dev;
platform_set_drvdata(pdev, &snd_soc_card_imx_cs42888);