#include <sound/pcm_params.h>
 #include <sound/soc.h>
 
-struct qmc_dai_chan {
-       struct qmc_dai_prtd *prtd_tx;
-       struct qmc_dai_prtd *prtd_rx;
-       struct qmc_chan *qmc_chan;
-};
-
 struct qmc_dai {
        char *name;
        int id;
        unsigned int nb_chans_avail;
        unsigned int nb_chans_used_tx;
        unsigned int nb_chans_used_rx;
-       struct qmc_dai_chan *chans;
+       struct qmc_chan **qmc_chans;
 };
 
 struct qmc_audio {
        int ret;
 
        for (i = 0; i < prtd->channels; i++) {
-               ret = qmc_chan_write_submit(prtd->qmc_dai->chans[i].qmc_chan,
+               ret = qmc_chan_write_submit(prtd->qmc_dai->qmc_chans[i],
                                            prtd->ch_dma_addr_current + i * prtd->ch_dma_offset,
                                            prtd->ch_dma_size,
                                            i == prtd->channels - 1 ? qmc_audio_pcm_write_complete :
        int ret;
 
        for (i = 0; i < prtd->channels; i++) {
-               ret = qmc_chan_read_submit(prtd->qmc_dai->chans[i].qmc_chan,
+               ret = qmc_chan_read_submit(prtd->qmc_dai->qmc_chans[i],
                                           prtd->ch_dma_addr_current + i * prtd->ch_dma_offset,
                                           prtd->ch_dma_size,
                                           i == prtd->channels - 1 ? qmc_audio_pcm_read_complete :
                                 struct snd_pcm_substream *substream, int cmd)
 {
        struct qmc_dai_prtd *prtd = substream->runtime->private_data;
-       unsigned int i;
        int ret;
 
        if (!prtd->qmc_dai) {
                prtd->ch_dma_addr_current = prtd->ch_dma_addr_start;
 
                if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-                       for (i = 0; i < prtd->channels; i++)
-                               prtd->qmc_dai->chans[i].prtd_tx = prtd;
-
                        /* Submit first chunk ... */
                        ret = qmc_audio_pcm_write_submit(prtd);
                        if (ret)
                        if (ret)
                                return ret;
                } else {
-                       for (i = 0; i < prtd->channels; i++)
-                               prtd->qmc_dai->chans[i].prtd_rx = prtd;
-
                        /* Submit first chunk ... */
                        ret = qmc_audio_pcm_read_submit(prtd);
                        if (ret)
                chan_param.mode = QMC_TRANSPARENT;
                chan_param.transp.max_rx_buf_size = params_period_bytes(params) / nb_chans_used;
                for (i = 0; i < nb_chans_used; i++) {
-                       ret = qmc_chan_set_param(qmc_dai->chans[i].qmc_chan, &chan_param);
+                       ret = qmc_chan_set_param(qmc_dai->qmc_chans[i], &chan_param);
                        if (ret) {
-                               dev_err(dai->dev, "chans[%u], set param failed %d\n",
+                               dev_err(dai->dev, "qmc_chans[%u], set param failed %d\n",
                                        i, ret);
                                return ret;
                        }
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
                for (i = 0; i < nb_chans_used; i++) {
-                       ret = qmc_chan_start(qmc_dai->chans[i].qmc_chan, direction);
+                       ret = qmc_chan_start(qmc_dai->qmc_chans[i], direction);
                        if (ret)
                                goto err_stop;
                }
        case SNDRV_PCM_TRIGGER_STOP:
                /* Stop and reset all QMC channels and return the first error encountered */
                for (i = 0; i < nb_chans_used; i++) {
-                       ret_tmp = qmc_chan_stop(qmc_dai->chans[i].qmc_chan, direction);
+                       ret_tmp = qmc_chan_stop(qmc_dai->qmc_chans[i], direction);
                        if (!ret)
                                ret = ret_tmp;
                        if (ret_tmp)
                                continue;
 
-                       ret_tmp = qmc_chan_reset(qmc_dai->chans[i].qmc_chan, direction);
+                       ret_tmp = qmc_chan_reset(qmc_dai->qmc_chans[i], direction);
                        if (!ret)
                                ret = ret_tmp;
                }
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
                /* Stop all QMC channels and return the first error encountered */
                for (i = 0; i < nb_chans_used; i++) {
-                       ret_tmp = qmc_chan_stop(qmc_dai->chans[i].qmc_chan, direction);
+                       ret_tmp = qmc_chan_stop(qmc_dai->qmc_chans[i], direction);
                        if (!ret)
                                ret = ret_tmp;
                }
 
 err_stop:
        while (i--) {
-               qmc_chan_stop(qmc_dai->chans[i].qmc_chan, direction);
-               qmc_chan_reset(qmc_dai->chans[i].qmc_chan, direction);
+               qmc_chan_stop(qmc_dai->qmc_chans[i], direction);
+               qmc_chan_reset(qmc_dai->qmc_chans[i], direction);
        }
        return ret;
 }
                return dev_err_probe(qmc_audio->dev, -EINVAL,
                                     "dai %d no QMC channel defined\n", qmc_dai->id);
 
-       qmc_dai->chans = devm_kcalloc(qmc_audio->dev, count, sizeof(*qmc_dai->chans), GFP_KERNEL);
-       if (!qmc_dai->chans)
+       qmc_dai->qmc_chans = devm_kcalloc(qmc_audio->dev, count, sizeof(*qmc_dai->qmc_chans),
+                                         GFP_KERNEL);
+       if (!qmc_dai->qmc_chans)
                return -ENOMEM;
 
        for (i = 0; i < count; i++) {
-               qmc_dai->chans[i].qmc_chan = devm_qmc_chan_get_byphandles_index(qmc_audio->dev, np,
-                                                                               "fsl,qmc-chan", i);
-               if (IS_ERR(qmc_dai->chans[i].qmc_chan)) {
-                       return dev_err_probe(qmc_audio->dev, PTR_ERR(qmc_dai->chans[i].qmc_chan),
+               qmc_dai->qmc_chans[i] = devm_qmc_chan_get_byphandles_index(qmc_audio->dev, np,
+                                                                          "fsl,qmc-chan", i);
+               if (IS_ERR(qmc_dai->qmc_chans[i])) {
+                       return dev_err_probe(qmc_audio->dev, PTR_ERR(qmc_dai->qmc_chans[i]),
                                             "dai %d get QMC channel %d failed\n", qmc_dai->id, i);
                }
 
-               ret = qmc_chan_get_info(qmc_dai->chans[i].qmc_chan, &info);
+               ret = qmc_chan_get_info(qmc_dai->qmc_chans[i], &info);
                if (ret) {
                        dev_err(qmc_audio->dev, "dai %d get QMC %d channel info failed %d\n",
                                qmc_dai->id, i, ret);
                        }
                }
 
-               ret = qmc_chan_get_ts_info(qmc_dai->chans[i].qmc_chan, &ts_info);
+               ret = qmc_chan_get_ts_info(qmc_dai->qmc_chans[i], &ts_info);
                if (ret) {
                        dev_err(qmc_audio->dev, "dai %d get QMC %d channel TS info failed %d\n",
                                qmc_dai->id, i, ret);