struct snd_pcm_hw_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+       struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
        int ret;
 
        ret = snd_soc_dai_set_sysclk(codec_dai, 0,
 
                return 0;
 
        /* Specific configurations of DAIs starts from here */
-       ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, cpu_priv->sysclk_id[tx],
+       ret = snd_soc_dai_set_sysclk(asoc_rtd_to_cpu(rtd, 0), cpu_priv->sysclk_id[tx],
                                     cpu_priv->sysclk_freq[tx],
                                     cpu_priv->sysclk_dir[tx]);
        if (ret && ret != -ENOTSUPP) {
        }
 
        if (cpu_priv->slot_width) {
-               ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2,
+               ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_cpu(rtd, 0), 0x3, 0x3, 2,
                                               cpu_priv->slot_width);
                if (ret && ret != -ENOTSUPP) {
                        dev_err(dev, "failed to set TDM slot for cpu dai\n");
        int ret;
 
        rtd = snd_soc_get_pcm_runtime(card, &card->dai_link[0]);
-       codec_dai = rtd->codec_dai;
+       codec_dai = asoc_rtd_to_codec(rtd, 0);
        if (dapm->dev != codec_dai->dev)
                return 0;
 
        struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
        struct snd_soc_pcm_runtime *rtd = list_first_entry(
                        &card->rtd_list, struct snd_soc_pcm_runtime, list);
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
        struct codec_priv *codec_priv = &priv->codec_priv;
        struct device *dev = card->dev;
        int ret;
 
        if (fsl_asoc_card_is_ac97(priv)) {
 #if IS_ENABLED(CONFIG_SND_AC97_CODEC)
-               struct snd_soc_component *component = rtd->codec_dai->component;
+               struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
                struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component);
 
                /*
 
        for_each_dpcm_be(rtd, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *substream_be;
-               struct snd_soc_dai *dai = be->cpu_dai;
+               struct snd_soc_dai *dai = asoc_rtd_to_cpu(be, 0);
 
                if (dpcm->fe != rtd)
                        continue;
        }
 
        /* Override dma_data of the Front-End and config its dmaengine */
-       dma_params_fe = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
+       dma_params_fe = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
        dma_params_fe->addr = asrc_priv->paddr + REG_ASRDx(!dir, index);
        dma_params_fe->maxburst = dma_params_be->maxburst;
 
                goto dma_chan_err;
        }
 
-       dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
+       dma_data = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
 
        /* Refine the snd_imx_hardware according to caps of DMA. */
        ret = snd_dmaengine_pcm_refine_runtime_hwparams(substream,
 
                                int sample_rate)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control;
        struct regmap *regmap = spdif_priv->regmap;
        struct platform_device *pdev = spdif_priv->pdev;
                             struct snd_soc_dai *cpu_dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct platform_device *pdev = spdif_priv->pdev;
        struct regmap *regmap = spdif_priv->regmap;
        u32 scr, mask;
                                struct snd_soc_dai *cpu_dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct regmap *regmap = spdif_priv->regmap;
        u32 scr, mask, i;
 
                                struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control;
        struct platform_device *pdev = spdif_priv->pdev;
        u32 sample_rate = params_rate(params);
                                int cmd, struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct regmap *regmap = spdif_priv->regmap;
        bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
        u32 intr = SIE_INTR_FOR(tx);
 
                           struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        int ret;
 
        ret = clk_prepare_enable(ssi->clk);
                             struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
 
        clk_disable_unprepare(ssi->clk);
 }
                           struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
 
        if (fsl_ssi_is_i2s_master(ssi) &&
            ssi->baudclk_streams & BIT(substream->stream)) {
                           struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
 
        switch (cmd) {
 
        dir  = tx ? SND_SOC_CLOCK_OUT : SND_SOC_CLOCK_IN;
 
        /* set DAI configuration */
-       ret = snd_soc_dai_set_fmt(rtd->cpu_dai, fmt);
+       ret = snd_soc_dai_set_fmt(asoc_rtd_to_cpu(rtd, 0), fmt);
        if (ret) {
                dev_err(dev, "failed to set cpu dai fmt: %d\n", ret);
                return ret;
        }
 
-       ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, FSL_SAI_CLK_MAST1, 0, dir);
+       ret = snd_soc_dai_set_sysclk(asoc_rtd_to_cpu(rtd, 0), FSL_SAI_CLK_MAST1, 0, dir);
        if (ret) {
                dev_err(dev, "failed to set cpu sysclk: %d\n", ret);
                return ret;
         * Per datasheet, AUDMIX expects 8 slots and 32 bits
         * for every slot in TDM mode.
         */
-       ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, BIT(channels) - 1,
+       ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_cpu(rtd, 0), BIT(channels) - 1,
                                       BIT(channels) - 1, 8, 32);
        if (ret)
                dev_err(dev, "failed to set cpu dai tdm slot: %d\n", ret);
        fmt |= SND_SOC_DAIFMT_CBM_CFM;
 
        /* set AUDMIX DAI configuration */
-       ret = snd_soc_dai_set_fmt(rtd->cpu_dai, fmt);
+       ret = snd_soc_dai_set_fmt(asoc_rtd_to_cpu(rtd, 0), fmt);
        if (ret)
                dev_err(dev, "failed to set AUDMIX DAI fmt: %d\n", ret);
 
 
        struct snd_pcm_hw_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+       struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
        int ret;
 
        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x3, 0x3, 4, 16);
 
        struct device *dev = rtd->card->dev;
        int ret;
 
-       ret = snd_soc_dai_set_sysclk(rtd->codec_dai, SGTL5000_SYSCLK,
+       ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0), SGTL5000_SYSCLK,
                                     data->clk_frequency, SND_SOC_CLOCK_IN);
        if (ret) {
                dev_err(dev, "could not set codec driver clock params\n");
 
                           struct snd_pcm_substream *substream, int cmd)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma);
        struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs;
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct psc_dma_stream *s;
        int rc;
 
                         struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct psc_dma_stream *s;
 
        dev_dbg(psc_dma->dev, "psc_dma_close(substream=%p)\n", substream);
                struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        struct psc_dma_stream *s;
        dma_addr_t count;
 
                       struct snd_soc_pcm_runtime *rtd)
 {
        struct snd_card *card = rtd->card->snd_card;
-       struct snd_soc_dai *dai = rtd->cpu_dai;
+       struct snd_soc_dai *dai = asoc_rtd_to_cpu(rtd, 0);
        struct snd_pcm *pcm = rtd->pcm;
        size_t size = psc_dma_hardware.buffer_bytes_max;
        int rc;
 
                                 struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
        u32 mode;
 
        dev_dbg(psc_dma->dev, "%s(substream=%p) p_size=%i p_bytes=%i"
 
        int ret = 0;
 
        /* Tell the codec driver what the serial protocol is. */
-       ret = snd_soc_dai_set_fmt(rtd->codec_dai, machine_data->dai_format);
+       ret = snd_soc_dai_set_fmt(asoc_rtd_to_codec(rtd, 0), machine_data->dai_format);
        if (ret < 0) {
                dev_err(dev, "could not set codec driver audio format\n");
                return ret;
         * Tell the codec driver what the MCLK frequency is, and whether it's
         * a slave or master.
         */
-       ret = snd_soc_dai_set_sysclk(rtd->codec_dai, 0,
+       ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0), 0,
                                     machine_data->clk_frequency,
                                     machine_data->codec_clk_direction);
        if (ret < 0) {
 
                            struct snd_pcm_hw_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+       struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
        int ret;
 
        ret = snd_soc_dai_set_sysclk(codec_dai, 0,
 
        int ret = 0;
 
        /* Tell the codec driver what the serial protocol is. */
-       ret = snd_soc_dai_set_fmt(rtd->codec_dai, mdata->dai_format);
+       ret = snd_soc_dai_set_fmt(asoc_rtd_to_codec(rtd, 0), mdata->dai_format);
        if (ret < 0) {
                dev_err(dev, "could not set codec driver audio format\n");
                return ret;
         * Tell the codec driver what the MCLK frequency is, and whether it's
         * a slave or master.
         */
-       ret = snd_soc_dai_set_sysclk(rtd->codec_dai, 0, mdata->clk_frequency,
+       ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0), 0, mdata->clk_frequency,
                                     mdata->codec_clk_direction);
        if (ret < 0) {
                dev_err(dev, "could not set codec driver clock params\n");
 
        int ret = 0;
 
        /* Tell the codec driver what the serial protocol is. */
-       ret = snd_soc_dai_set_fmt(rtd->codec_dai, mdata->dai_format);
+       ret = snd_soc_dai_set_fmt(asoc_rtd_to_codec(rtd, 0), mdata->dai_format);
        if (ret < 0) {
                dev_err(dev, "could not set codec driver audio format (ret=%i)\n",
                        ret);
                return ret;
        }
 
-       ret = snd_soc_dai_set_pll(rtd->codec_dai, 0, 0, mdata->clk_frequency,
+       ret = snd_soc_dai_set_pll(asoc_rtd_to_codec(rtd, 0), 0, 0, mdata->clk_frequency,
                mdata->clk_frequency);
        if (ret < 0) {
                dev_err(dev, "could not set codec PLL frequency (ret=%i)\n",
 
                                struct snd_pcm_hw_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+       struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
        int i, found = 0;
        snd_pcm_format_t format = params_format(params);
        unsigned int rate = params_rate(params);
 
 static int wm1133_ev1_init(struct snd_soc_pcm_runtime *rtd)
 {
-       struct snd_soc_component *component = rtd->codec_dai->component;
+       struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
 
        /* Headphone jack detection */
        snd_soc_card_jack_new(rtd->card, "Headphone", SND_JACK_HEADPHONE,