
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