*      asoc_rtd_to_codec()
         */
        struct snd_soc_dai **dais;
-       unsigned int num_codecs;
-       unsigned int num_cpus;
 
        struct snd_soc_dapm_widget *playback_widget;
        struct snd_soc_dapm_widget *capture_widget;
 };
 /* see soc_new_pcm_runtime()  */
 #define asoc_rtd_to_cpu(rtd, n)   (rtd)->dais[n]
-#define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->num_cpus]
+#define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->dai_link->num_cpus]
 #define asoc_substream_to_rtd(substream) \
        (struct snd_soc_pcm_runtime *)snd_pcm_substream_chip(substream)
 
             (i)++)
 #define for_each_rtd_cpu_dais(rtd, i, dai)                             \
        for ((i) = 0;                                                   \
-            ((i) < rtd->num_cpus) && ((dai) = asoc_rtd_to_cpu(rtd, i)); \
+            ((i) < rtd->dai_link->num_cpus) && ((dai) = asoc_rtd_to_cpu(rtd, i)); \
             (i)++)
 #define for_each_rtd_codec_dais(rtd, i, dai)                           \
        for ((i) = 0;                                                   \
-            ((i) < rtd->num_codecs) && ((dai) = asoc_rtd_to_codec(rtd, i)); \
+            ((i) < rtd->dai_link->num_codecs) && ((dai) = asoc_rtd_to_codec(rtd, i)); \
             (i)++)
 #define for_each_rtd_dais(rtd, i, dai)                                 \
        for ((i) = 0;                                                   \
-            ((i) < (rtd)->num_cpus + (rtd)->num_codecs) &&             \
+            ((i) < (rtd)->dai_link->num_cpus + (rtd)->dai_link->num_codecs) && \
                     ((dai) = (rtd)->dais[i]);                          \
             (i)++)
 
 
        struct snd_soc_card *card = rtd->card;
        struct snd_soc_dai *codec_dai;
        int ret, i;
-       unsigned int num_codecs = rtd->num_codecs;
+       unsigned int num_codecs = rtd->dai_link->num_codecs;
        unsigned int bclk_val;
 
        ret = 0;
 
        if (ret < 0)
                return ret;
 
-       if (rtd->num_codecs > 1) {
+       if (rtd->dai_link->num_codecs > 1) {
                struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 1);
 
                ret = snd_soc_dai_set_sysclk(codec_dai, 0, rclk_freq,
 
        BUILD_BUG_ON((int)SNDRV_PCM_STREAM_PLAYBACK != (int)SND_COMPRESS_PLAYBACK);
        BUILD_BUG_ON((int)SNDRV_PCM_STREAM_CAPTURE  != (int)SND_COMPRESS_CAPTURE);
 
-       if (rtd->num_cpus > 1 ||
-           rtd->num_codecs > 1) {
+       if (rtd->dai_link->num_cpus > 1 ||
+           rtd->dai_link->num_codecs > 1) {
                dev_err(rtd->card->dev,
                        "Compress ASoC: Multi CPU/Codec not supported\n");
                return -EINVAL;
 
 
        if (attr == &dev_attr_pmdown_time.attr)
                return attr->mode; /* always visible */
-       return rtd->num_codecs ? attr->mode : 0; /* enabled only with codec */
+       return rtd->dai_link->num_codecs ? attr->mode : 0; /* enabled only with codec */
 }
 
 static const struct attribute_group soc_dapm_dev_group = {
         *      asoc_rtd_to_cpu()
         *      asoc_rtd_to_codec()
         */
-       rtd->num_cpus   = dai_link->num_cpus;
-       rtd->num_codecs = dai_link->num_codecs;
        rtd->card       = card;
        rtd->dai_link   = dai_link;
        rtd->num        = card->num_rtd++;
 
                if (rtd->dai_link->dynamic)
                        continue;
 
-               if (rtd->num_cpus == 1) {
+               if (rtd->dai_link->num_cpus == 1) {
                        for_each_rtd_codec_dais(rtd, i, codec_dai)
                                dapm_connect_dai_pair(card, rtd, codec_dai,
                                                      asoc_rtd_to_cpu(rtd, 0));
-               } else if (rtd->num_codecs == rtd->num_cpus) {
+               } else if (rtd->dai_link->num_codecs == rtd->dai_link->num_cpus) {
                        for_each_rtd_codec_dais(rtd, i, codec_dai)
                                dapm_connect_dai_pair(card, rtd, codec_dai,
                                                      asoc_rtd_to_cpu(rtd, i));
 
        struct snd_dmaengine_dai_dma_data *dma_data;
        int ret;
 
-       if (rtd->num_cpus > 1) {
+       if (rtd->dai_link->num_cpus > 1) {
                dev_err(rtd->dev,
                        "%s doesn't support Multi CPU yet\n", __func__);
                return -EINVAL;
        struct snd_dmaengine_dai_dma_data *dma_data;
        struct snd_pcm_hardware hw;
 
-       if (rtd->num_cpus > 1) {
+       if (rtd->dai_link->num_cpus > 1) {
                dev_err(rtd->dev,
                        "%s doesn't support Multi CPU yet\n", __func__);
                return -EINVAL;
        struct dmaengine_pcm *pcm = soc_component_to_pcm(component);
        struct snd_dmaengine_dai_dma_data *dma_data;
 
-       if (rtd->num_cpus > 1) {
+       if (rtd->dai_link->num_cpus > 1) {
                dev_err(rtd->dev,
                        "%s doesn't support Multi CPU yet\n", __func__);
                return NULL;
 
 
 static inline const char *soc_cpu_dai_name(struct snd_soc_pcm_runtime *rtd)
 {
-       return (rtd)->num_cpus == 1 ? asoc_rtd_to_cpu(rtd, 0)->name : "multicpu";
+       return (rtd)->dai_link->num_cpus == 1 ? asoc_rtd_to_cpu(rtd, 0)->name : "multicpu";
 }
 static inline const char *soc_codec_dai_name(struct snd_soc_pcm_runtime *rtd)
 {
-       return (rtd)->num_codecs == 1 ? asoc_rtd_to_codec(rtd, 0)->name : "multicodec";
+       return (rtd)->dai_link->num_codecs == 1 ? asoc_rtd_to_codec(rtd, 0)->name : "multicodec";
 }
 
 #ifdef CONFIG_DEBUG_FS
        int stream;
        char *buf;
 
-       if (fe->num_cpus > 1) {
+       if (fe->dai_link->num_cpus > 1) {
                dev_err(fe->dev,
                        "%s doesn't support Multi CPU yet\n", __func__);
                return -EINVAL;
         * connected to CPU DAI(s), use CPU DAI's directly and let
         * channel allocation be fixed up later
         */
-       if (rtd->num_codecs > 1) {
+       if (rtd->dai_link->num_codecs > 1) {
                hw->channels_min = cpu_chan_min;
                hw->channels_max = cpu_chan_max;
        }
        struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(fe, 0);
        int paths;
 
-       if (fe->num_cpus > 1) {
+       if (fe->dai_link->num_cpus > 1) {
                dev_err(fe->dev,
                        "%s doesn't support Multi CPU yet\n", __func__);
                return -EINVAL;
                 * chan min/max cannot be enforced if there are multiple CODEC
                 * DAIs connected to a single CPU DAI, use CPU DAI's directly
                 */
-               if (be->num_codecs == 1) {
+               if (be->dai_link->num_codecs == 1) {
                        struct snd_soc_pcm_stream *codec_stream = snd_soc_dai_get_pcm_stream(
                                asoc_rtd_to_codec(be, 0), stream);
 
        if (!fe->dai_link->dynamic)
                return 0;
 
-       if (fe->num_cpus > 1) {
+       if (fe->dai_link->num_cpus > 1) {
                dev_err(fe->dev,
                        "%s doesn't support Multi CPU yet\n", __func__);
                return -EINVAL;
        struct snd_soc_dai *cpu_dai;
        int i;
 
-       if (rtd->dai_link->dynamic && rtd->num_cpus > 1) {
+       if (rtd->dai_link->dynamic && rtd->dai_link->num_cpus > 1) {
                dev_err(rtd->dev,
                        "DPCM doesn't support Multi CPU for Front-Ends yet\n");
                return -EINVAL;
                        SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
 
                for_each_rtd_codec_dais(rtd, i, codec_dai) {
-                       if (rtd->num_cpus == 1) {
+                       if (rtd->dai_link->num_cpus == 1) {
                                cpu_dai = asoc_rtd_to_cpu(rtd, 0);
-                       } else if (rtd->num_cpus == rtd->num_codecs) {
+                       } else if (rtd->dai_link->num_cpus == rtd->dai_link->num_codecs) {
                                cpu_dai = asoc_rtd_to_cpu(rtd, i);
                        } else {
                                dev_err(rtd->card->dev,
 
                                        break;
                                }
                        }
-                       if (i == rtd->num_cpus) {
+                       if (i == rtd->dai_link->num_cpus) {
                                dev_err(scomp->dev, "error: can't find BE for DAI %s\n",
                                        w->name);
 
                                        break;
                                }
                        }
-                       if (i == rtd->num_cpus) {
+                       if (i == rtd->dai_link->num_cpus) {
                                dev_err(scomp->dev, "error: can't find BE for DAI %s\n",
                                        w->name);