Hi ALSA ML
I'm checking ALSA SoC framework. Now, many Components are connected to Card. When we want to do something to all Components, we have 2 type of loops
1) for_each_card_components(card, component) { ... }
2) for_each_card_rtds(card, rtd) { for_each_rtd_components(rtd, i, component) { ... } }
But, I noticed that these 1) and 2) are not same.
Please double check it. We have 3 ways to connect Component to Card.
a) via Card pre-linked Aux (= card->aux_dev) b) via Card pre-linked link (= card->dai_link) c) via Topology dai_link
static int snd_soc_bind_card(struct snd_soc_card *card) { ... a) ret = soc_bind_aux_dev(card); ...
for_each_card_prelinks(card, i, dai_link) { b) ret = snd_soc_add_pcm_runtime(card, dai_link); ... } ...
c) ret = snd_soc_card_probe(card); ...
X) ret = soc_probe_link_components(card); ...
Y) ret = soc_probe_aux_devices(card); ...
Here, b) and c) has dai_link / rtd. And, connected Component are probed at X) (= b) + c)) Y) (= a)). Then, probed Component are connected to card->component_dev_list. Above 1) loop is based on it.
In total, 1) and 2) loop difference are
1) loop is for a) + b) + c) 2) loop is for b) + c)
Now, ALSA SoC suspend/resume checks below, but a) doesn't have it.
rtd->dai_link->ignore_suspend.
Thus, "suspend" is using 2) loop, but, "resume" is using 1) loop.
My question here is that can AUX suspend/resume ? I think we need/want to use 1) loop for it.
Thank you for your help !! Best regards --- Kuninori Morimoto