Hi ASoC Cc Mark, Pierre-Louis, Cezary
I have very interesting to clean up ASoC. I think it is still very complex, thus, non flexible. I'm thinking that we want to cleanup...
- Component with multi Card connection - fixed playback vs capture - fixed CPU vs Codec - DPCM connection vs normal connection
About first topic, I guess the biggest reason why we have limitation is its connections. Text based image is a little bit difficult, but if my understanding was correct, current connections are...
card <-> rtd <-> rtd <-> rtd <-> ... | | +--------|-----+---------------+-----------+ (A) | | | | +-> component -> component -> component -> ... | (CPU) (Codec) (Platform) | | | | | +-> dai -> dai -> dai -> dai -> ...
Card has "component list", and Component has pointer to Card (A). This makes the limitation which blocking multiple Card connections, I think.
One note here is that "Platform" doesn't have "DAI".
So if rtd have something other connector list, let's say "ep" list here for now, instead of "dai", and remove Card <-> Component connection, I think the connection can be simple, and the issue can be gone, but what do you think ?
card <-> rtd <-> rtd <-> rtd <-> ... | | dai dai dai dai | | | | | +--> ep --> ep --> ep -> ep -> ep -> ... | | | | | component component component (CPU) (Codec) (Platform)
Here, ep is like this
struct rtd_entry_point { struct list_head list; // list for rtd struct struct snd_soc_pcm_runtime *rtd; struct snd_soc_component *component; struct snd_soc_dai *dai; };
Current for_each_xxx() can be like this
for_each_rtd_components() = for_each_rtd_ep() + ep_to_component() for_each_rtd_dais() = for_each_rtd_ep() + ep_to_dai() for_each_card_components() = for_each_card_rtds() + for_each_rtd_components()
I guess Component can have multiple Card connection on this idea, but what do you think ?
Maybe I'm misunderstanding and/or missing something, because ASoC is complex enough :) Please let me know if I was misunderstanding or missing.
Thank you for your help !!
Best regards --- Kuninori Morimoto