Re: [PATCH v4 12/23] ASoC: simple-card: Support DPCM DAI link with multiple Codecs

From: Sameer Pujar
Date: Mon Jun 29 2020 - 15:27:19 EST




On 6/29/2020 6:54 AM, Kuninori Morimoto wrote:
External email: Use caution opening links or attachments


Hi Sameer

The simple-card driver supports multiple CPU and single Codec entries
for DPCM DAI links. In some cases it is required to have multiple
CPU/Codecs. Currently parsing logic for DPCM link loops over all
children of DAI link but assumes that there is a single Codec entry.
When DAI link has multiple Codecs it considers only the first Codec
entry and remaining Codecs are wrongly treated as CPU. This happens
because first Codec is used as reference for parsing all other child
nodes.
(snip)
@@ -137,8 +136,13 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
* Codec |return|Pass
* np
*/
- if (li->cpu == (np == codec))
- return 0;
+ if (li->cpu) {
+ if (!strcmp(np->name, "codec"))
+ return 0;
+ } else {
+ if (!strcmp(np->name, "cpu"))
+ return 0;
+ }
Checking node name is maybe nice idea,
but please consider "prefix" here.

Sorry I missed that example where DAI is defined at sound level. I will update.

Maybe base issue for multiple codec support
is that simple_for_each_link() is caring first codec only ?

Yes that is true.

simple_for_each_link(...)
{
...
do {
=> /* get codec */
=> codec = of_get_child_by_name(...);
...
}
}

Remove above and having simple_node_is_codec(np, xxx) function
or something can help it ?

Ideally I wanted to remove above two lines and allow empty codec list. But some users may expect the parsing to fail if no 'Codec' is found in the DAI link, hence did not remove above. If it is fine to remove above two lines it would be simpler. The loop inside simple_for_each_link() would anyway loop for each child node of DAI link and simple_dai_link_of_dpcm() can parse each 'np'.


Thank you for your help !!

Best regards
---
Kuninori Morimoto