[PATCH v4 10/23] ASoC: simple-card: Wrong daifmt for CPU end of DPCM DAI link

From: Sameer Pujar
Date: Sat Jun 27 2020 - 00:55:13 EST


Consider following DPCM DAI link for example:

simple-audio-card,dai-link@xxx {
format = "i2s";
bitclock-master=<&cpu1>;
frame-master=<&cpu1>;

cpu1: cpu@0 {
...
};

codec@0 {
...
};

...
};

In above case CPU is expected to be configured as a master and Codec as
a slave device. But both CPU/Codec are being configured as slave devices.
This happens because asoc_simple_parse_daifmt() uses Codec reference and
sets up the 'dai_link->dai_fmt' accordingly while parsing both CPU and
Codec. Though populating 'non_legacy_dai_naming' flag as true for CPU
component can address above issue in simple cases, but with multiple
CPU/Codecs with DPCM DAI link it becomes tricky because right now the
first Codec in the DAI link is used as reference.

This is fixed by passing current DAI link child node reference to
asoc_simple_parse_daifmt(). It parses a CPU/Codec node independently and
sets daifmt as per 'bitcloclk/frame-master' property.

Signed-off-by: Sameer Pujar <spujar@xxxxxxxxxx>
---
sound/soc/generic/simple-card.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 0f443c0..39cdc71 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -228,7 +228,7 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
if (ret)
goto out_put_node;

- ret = asoc_simple_parse_daifmt(dev, node, codec,
+ ret = asoc_simple_parse_daifmt(dev, node, np,
prefix, &dai_link->dai_fmt);
if (ret < 0)
goto out_put_node;
--
2.7.4