tree c09e3327a087a05162714bf50c1b4846c911b7fc
parent a7d44f78063d642406132c2ed1dc6033d0d03cfe
author Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 1567556112 +0900
committer Mark Brown <broonie@kernel.org> 1568023377 +0100
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl12I1ETHGJyb29uaWVA
 a2VybmVsLm9yZwAKCRAk1otyXVSH0KhUB/0csdyqlNBsF6aF+DjZ2Qv9x4LqlY7p
 uJgLxI8xW+OvHcwFXdBY1pPJ3U2iL8ejqnk7PDmy5IdCKAA2Uu9rpRXZcgkMwuMI
 RyrzS5dbOWQoaGplNlxfocp0M3Hsd9SQf8kCzjfuR55qdg8SIa1i/cL+vTgzoFRN
 59utRLSWdhZ2ytKGeyCwnVI9U+cCCLr3uSrFO30TcuscSY5ABIbhJLY+HGT5K903
 y5VA4fVCHei6GwqTFGfGP6tklAMxSsd7bggjCSb4Y3eSbSppVsTbX6KVElKtAuZD
 cRu8Pk/S4aVVFhJ+J6t9MbMFVMvbL+YYv6oCSCZK8LgJcLqx6+8NnbHv
 =/2Bg
 -----END PGP SIGNATURE-----

ASoC: soc-core: add new soc_link_init()

Current soc_probe_link_dais() (1) is called under probe_order (2),
and it will initialize dai_link related settings at *Last* turn (3)(B).
It is very complex code.

	static int soc_probe_link_dais(..., order)
	{
(A)		/* probe DAIs here */
		...

(3)		if (order != SND_SOC_COMP_ORDER_LAST)
			return 0;

(B)		/* initialize dai_link related settings */
		...
	}

	static int snd_soc_instantiate_card(...)
	{
		...
(2)		for_each_comp_order(order) {
			for_each_card_rtds(...) {
(1)				ret = soc_probe_link_dais(..., order);
			}
		}
	}

This patch separes soc_probe_link_dais() into "DAI probe" portion (A),
and dai_link settings portion (B).
The later is named as soc_link_init() by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87y2z4or1r.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
