snd_soc_register_card
-->遍歷dai link,創建 struct snd_soc_pcm_runtime 實例
-->snd_soc_instantiate_card
-->soc_bind_dai_link // 為每個dai link查找 相應的DAI實例(component_list)、codec DAI實例(component_list)、platform 實例(platform_list)、codec實例
-->snd_card_new // 向ALSA注冊sound card
-->snd_soc_dapm_new_controls // 注冊machine級別的 widgets
-->struct snd_soc_card->probe()函數
-->soc_probe_link_components // 遍歷每個pcm runtime實例
-->soc_probe_component // cpu dai和codec dai都是以component實例注冊。probe cpu dai component
-->snd_soc_dapm_new_controls // 注冊component widgets。
-->snd_soc_dapm_new_dai_widgets // 遍歷component上的每個dai實例,創建 dai widget實例
-->調用component的probe函數
-->snd_soc_add_component_controls // 注冊component 普通控件
-->snd_soc_dapm_add_routes // 注冊component 路由表
-->soc_probe_component // probe codec dai component
-->soc_probe_component // platform驅動注冊時,把驅動信息例如widget,controls,routes等賦值給了platform實例包含的 component 實例
-->soc_probe_link_dais // 遍歷每個dai link
-->cpu dai實例調用 probe()
-->codec dai實例調用 probe()
-->dai link實例調用 init()
-->soc_post_component_init // 為pcm runtime實例創建device對象
-->soc_new_pcm // 創建PCM 邏輯設備,分FE和BE
-->snd_soc_dapm_link_dai_widgets // dai widget 和 stream widget 建立連接
-->snd_soc_dapm_connect_dai_link_widgets // BE dai widget和 codec dai widget建立連接,codec dai widget和codec stream widget自動建立連接
-->snd_soc_add_card_controls // 注冊machine級別的 controls
-->snd_soc_dapm_add_routes // 注冊 machine級別的 routes
-->snd_soc_dai_set_fmt // 遍歷每個dai link,調用 codec dai->driver->ops->set_fmt(dai_link->dai_fmt)
-->snd_soc_dai_set_fmt // 遍歷每個dai link,調用 cpu dai->driver->ops->set_fmt(dai_link->dai_fmt)
-->struct snd_soc_card->late_probe()函數
-->snd_soc_dapm_new_widgets // 注冊 DAPM kcontrols
-->snd_card_register // 向ALSA 注冊 snd card