enum snd_soc_bias_level level)
 {
        struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        struct codec_priv *codec_priv = &priv->codec_priv;
        struct device *dev = card->dev;
        unsigned int pll_out;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
        if (dapm->dev != codec_dai->dev)
                return 0;
 
 
                                        struct snd_soc_dapm_context *dapm,
                                        enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        struct imx_priv *priv = &card_priv;
        struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
        struct device *dev = &priv->pdev->dev;
        unsigned int pll_out;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
        if (dapm->dev != codec_dai->dev)
                return 0;
 
 
 static int imx_wm8962_late_probe(struct snd_soc_card *card)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        struct imx_priv *priv = &card_priv;
        struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
        struct device *dev = &priv->pdev->dev;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
        ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
                        data->clk_frequency, SND_SOC_CLOCK_IN);
        if (ret < 0)
 
 static int rear_amp_event(struct snd_soc_dapm_widget *widget,
                          struct snd_kcontrol *kctl, int event)
 {
-       struct snd_soc_codec *codec = widget->dapm->card->rtd[0].codec;
+       struct snd_soc_card *card = widget->dapm->card;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_codec *codec;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec = rtd->codec;
        return rear_amp_power(codec, SND_SOC_DAPM_EVENT_ON(event));
 }
 
 
                                struct snd_soc_dapm_context *dapm,
                                enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
-       struct snd_soc_codec *codec = codec_dai->codec;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
+       struct snd_soc_codec *codec;
        struct bells_drvdata *bells = card->drvdata;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
+       codec_dai = rtd->codec_dai;
+       codec = codec_dai->codec;
+
        if (dapm->dev != codec_dai->dev)
                return 0;
 
                                     struct snd_soc_dapm_context *dapm,
                                     enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
-       struct snd_soc_codec *codec = codec_dai->codec;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
+       struct snd_soc_codec *codec;
        struct bells_drvdata *bells = card->drvdata;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
+       codec_dai = rtd->codec_dai;
+       codec = codec_dai->codec;
+
        if (dapm->dev != codec_dai->dev)
                return 0;
 
 static int bells_late_probe(struct snd_soc_card *card)
 {
        struct bells_drvdata *bells = card->drvdata;
-       struct snd_soc_codec *wm0010 = card->rtd[DAI_AP_DSP].codec;
-       struct snd_soc_codec *codec = card->rtd[DAI_DSP_CODEC].codec;
-       struct snd_soc_dai *aif1_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_codec *wm0010;
+       struct snd_soc_codec *codec;
+       struct snd_soc_dai *aif1_dai;
        struct snd_soc_dai *aif2_dai;
        struct snd_soc_dai *aif3_dai;
        struct snd_soc_dai *wm9081_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_AP_DSP].name);
+       wm0010 = rtd->codec;
+
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
+       codec = rtd->codec;
+       aif1_dai = rtd->codec_dai;
+
        ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK,
                                       ARIZONA_CLK_SRC_FLL1,
                                       bells->sysclk_rate,
                return ret;
        }
 
-       aif2_dai = card->rtd[DAI_CODEC_CP].cpu_dai;
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_CODEC_CP].name);
+       aif2_dai = rtd->cpu_dai;
 
        ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0);
        if (ret != 0) {
        if (card->num_rtd == DAI_CODEC_SUB)
                return 0;
 
-       aif3_dai = card->rtd[DAI_CODEC_SUB].cpu_dai;
-       wm9081_dai = card->rtd[DAI_CODEC_SUB].codec_dai;
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_CODEC_SUB].name);
+       aif3_dai = rtd->cpu_dai;
+       wm9081_dai = rtd->codec_dai;
 
        ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0);
        if (ret != 0) {
 
                                          struct snd_soc_dapm_context *dapm,
                                          enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *aif1_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       aif1_dai = rtd->codec_dai;
+
        if (dapm->dev != aif1_dai->dev)
                return 0;
 
                                               struct snd_soc_dapm_context *dapm,
                                               enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *aif1_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       aif1_dai = rtd->codec_dai;
+
        if (dapm->dev != aif1_dai->dev)
                return 0;
 
                    struct snd_kcontrol *kcontrol, int event)
 {
        struct snd_soc_card *card = w->dapm->card;
-       struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *aif2_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
+       aif2_dai = rtd->cpu_dai;
+
        switch (event) {
        case SND_SOC_DAPM_PRE_PMU:
                ret = snd_soc_dai_set_pll(aif2_dai, WM8994_FLL2,
 
 static int littlemill_late_probe(struct snd_soc_card *card)
 {
-       struct snd_soc_codec *codec = card->rtd[0].codec;
-       struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai;
-       struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_codec *codec;
+       struct snd_soc_dai *aif1_dai;
+       struct snd_soc_dai *aif2_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec = rtd->codec;
+       aif1_dai = rtd->codec_dai;
+
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
+       aif2_dai = rtd->cpu_dai;
+
        ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2,
                                     32768, SND_SOC_CLOCK_IN);
        if (ret < 0)
 
 
 static int odroidx2_late_probe(struct snd_soc_card *card)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
-       struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
+       struct snd_soc_dai *cpu_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
+       cpu_dai = rtd->cpu_dai;
+
        ret = snd_soc_dai_set_sysclk(codec_dai, 0, MAX98090_MCLK,
                                                SND_SOC_CLOCK_IN);
 
 
 
 static int snow_late_probe(struct snd_soc_card *card)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
-       struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
+       struct snd_soc_dai *cpu_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
+       cpu_dai = rtd->cpu_dai;
+
        /* Set the MCLK rate for the codec */
        ret = snd_soc_dai_set_sysclk(codec_dai, 0,
                                        FIN_PLL_RATE, SND_SOC_CLOCK_IN);
 
                                   struct snd_soc_dapm_context *dapm,
                                   enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[1].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
+       codec_dai = rtd->codec_dai;
+
        if (dapm->dev != codec_dai->dev)
                return 0;
 
                                        struct snd_soc_dapm_context *dapm,
                                        enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[1].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
+       codec_dai = rtd->codec_dai;
+
        if (dapm->dev != codec_dai->dev)
                return 0;
 
 
                                          struct snd_soc_dapm_context *dapm,
                                          enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
+
        if (dapm->dev != codec_dai->dev)
                return 0;
 
                                               struct snd_soc_dapm_context *dapm,
                                               enum snd_soc_bias_level level)
 {
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
+
        if (dapm->dev != codec_dai->dev)
                return 0;
 
 
 static int tobermory_late_probe(struct snd_soc_card *card)
 {
-       struct snd_soc_codec *codec = card->rtd[0].codec;
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_codec *codec;
+       struct snd_soc_dai *codec_dai;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec = rtd->codec;
+       codec_dai = rtd->codec_dai;
+
        ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
                                     32768, SND_SOC_CLOCK_IN);
        if (ret < 0)
 
 
 static int tegra_wm8903_remove(struct snd_soc_card *card)
 {
-       struct snd_soc_pcm_runtime *rtd = &(card->rtd[0]);
+       struct snd_soc_pcm_runtime *rtd =
+               snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct snd_soc_codec *codec = codec_dai->codec;
        struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);