Commit 08b54b5e authored by Shengjiu Wang's avatar Shengjiu Wang Committed by Mark Brown

ASoC: fsl-asoc-card: Support configuring dai fmt from DT

Support same propeties as simple card for configuring fmt
from DT.
In order to make this change compatible with old DT, these
properties are optional.
Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@nxp.com>
Acked-by: default avatarNicolin Chen <nicoleotsuka@gmail.com>
Link: https://lore.kernel.org/r/1595302910-19688-1-git-send-email-shengjiu.wang@nxp.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent c8361757
...@@ -531,11 +531,14 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) ...@@ -531,11 +531,14 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
struct device_node *cpu_np, *codec_np, *asrc_np; struct device_node *cpu_np, *codec_np, *asrc_np;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct platform_device *asrc_pdev = NULL; struct platform_device *asrc_pdev = NULL;
struct device_node *bitclkmaster = NULL;
struct device_node *framemaster = NULL;
struct platform_device *cpu_pdev; struct platform_device *cpu_pdev;
struct fsl_asoc_card_priv *priv; struct fsl_asoc_card_priv *priv;
struct device *codec_dev = NULL; struct device *codec_dev = NULL;
const char *codec_dai_name; const char *codec_dai_name;
const char *codec_dev_name; const char *codec_dev_name;
unsigned int daifmt;
u32 width; u32 width;
int ret; int ret;
...@@ -667,6 +670,31 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) ...@@ -667,6 +670,31 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
goto asrc_fail; goto asrc_fail;
} }
/* Format info from DT is optional. */
daifmt = snd_soc_of_parse_daifmt(np, NULL,
&bitclkmaster, &framemaster);
daifmt &= ~SND_SOC_DAIFMT_MASTER_MASK;
if (bitclkmaster || framemaster) {
if (codec_np == bitclkmaster)
daifmt |= (codec_np == framemaster) ?
SND_SOC_DAIFMT_CBM_CFM : SND_SOC_DAIFMT_CBM_CFS;
else
daifmt |= (codec_np == framemaster) ?
SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
/* Override dai_fmt with value from DT */
priv->dai_fmt = daifmt;
}
/* Change direction according to format */
if (priv->dai_fmt & SND_SOC_DAIFMT_CBM_CFM) {
priv->cpu_priv.sysclk_dir[TX] = SND_SOC_CLOCK_IN;
priv->cpu_priv.sysclk_dir[RX] = SND_SOC_CLOCK_IN;
}
of_node_put(bitclkmaster);
of_node_put(framemaster);
if (!fsl_asoc_card_is_ac97(priv) && !codec_dev) { if (!fsl_asoc_card_is_ac97(priv) && !codec_dev) {
dev_err(&pdev->dev, "failed to find codec device\n"); dev_err(&pdev->dev, "failed to find codec device\n");
ret = -EPROBE_DEFER; ret = -EPROBE_DEFER;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment