• Kuninori Morimoto's avatar
    ASoC: soc-core: call soc_bind_dai_link() under snd_soc_add_dai_link() · 6b1dff02
    Kuninori Morimoto authored
    If we focus to soc_bind_dai_link() at snd_soc_instantiate_card(),
    we will notice very complex operation.
    
    static int snd_soc_instantiate_card(...)
    {
    	...
    	/*
    	 * (1) Bind dai_link via card pre-linked dai_link
    	 *
    	 * Bind dai_link via card pre-linked.
    	 * 1 dai_link will be 1 rtd, and connected to card.
    	 * for_each_card_prelinks() is for card pre-linked dai_link.
    	 *
    	 * Image
    	 *
    	 * card
    	 * - rtd(A)
    	 * - rtd(A)
    	 */
    	for_each_card_prelinks(card, i, dai_link) {
    		ret = soc_bind_dai_link(card, dai_link);
    		...
    	}
    	...
    	/*
    	 * (2) Connect card pre-linked dai_link to card list
    	 *
    	 * Connect all card pre-linked dai_link to *card list*.
    	 * Here, (A) means from card pre-linked.
    	 *
    	 * Image
    	 *
    	 * card		card list
    	 *  - rtd(A)	 - dai_link(A)
    	 *  - rtd(A)	 - dai_link(A)
    	 *  - ...	 - ...
    	 */
    	for_each_card_prelinks(card, i, dai_link) {
    		ret = snd_soc_add_dai_link(card, dai_link);
    		...
    	}
    	...
    	/*
    	 * (3) Probe binded component
    	 *
    	 * Each rtd has many components.
    	 * Here probes each rtd connected components.
    	 * rtd(A) in Image is the probe target.
    	 *
    	 * During this component probe, topology may add new dai_link to
    	 * *card list* by using snd_soc_add_dai_link() which is
    	 * used at (2).
    	 * Here, (B) means from topology
    	 *
    	 * Image
    	 *
    	 * card		card list
    	 *  - rtd(A)	 - dai_link(A)
    	 *  - rtd(A)	 - dai_link(A)
    	 *  - ...	 - ...
    	 *		 - dai_link(B)
    	 *		 - dai_link(B)
    	 */
    	ret = soc_probe_link_components(card);
    	...
    
    	/*
    	 * (4) Bind dai_link again
    	 *
    	 * Bind dai_link again for topology.
    	 * Note, (1) used for_each_card_prelinks(),
    	 * here is using  for_each_card_links()
    	 *
    	 * This means from card list.
    	 * As Image indicating, it has dai_link(A) (from card pre-link)
    	 * and dai_link(B) (from topology).
    	 * main target here is dai_link(B).
    	 * soc_bind_dai_link() ignores already used
    	 * dai_link (= dai_link(A))
    	 *
    	 * Image
    	 *
    	 * card		card list
    	 *  - rtd(A)	 - dai_link(A)
    	 *  - rtd(A)	 - dai_link(A)
    	 *  - ...	 - ...
    	 *  - rtd(B)	 - dai_link(B)
    	 *  - rtd(B)	 - dai_link(B)
    	 */
    	for_each_card_links(card, dai_link) {
    		ret = soc_bind_dai_link(card, dai_link);
    		...
    	}
    	...
    }
    
    As you see above, it is doing very complex method.
    The problem is binding dai_link via "card pre-linked" (= (1)) and
    "topology added dai_link" (= (3)) are separated.
    The code can be simple if we can bind dai_link when dai_link
    is connected to *card list*.
    This patch do it.
    Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
    Link: https://lore.kernel.org/r/878sou3jnn.wl-kuninori.morimoto.gx@renesas.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    6b1dff02
soc-core.c 83.1 KB