desc = sdmac->desc;
                if (desc) {
                        if (sdmac->flags & IMX_DMA_SG_LOOP) {
-                               sdma_update_channel_loop(sdmac);
+                               if (sdmac->peripheral_type != IMX_DMATYPE_HDMI)
+                                       sdma_update_channel_loop(sdmac);
+                               else
+                                       vchan_cyclic_callback(&desc->vd);
                        } else {
                                mxc_sdma_handle_channel_normal(sdmac);
                                vchan_cookie_complete(&desc->vd);
                per_2_emi = sdma->script_addrs->sai_2_mcu_addr;
                emi_2_per = sdma->script_addrs->mcu_2_sai_addr;
                break;
+       case IMX_DMATYPE_HDMI:
+               emi_2_per = sdma->script_addrs->hdmi_dma_addr;
+               sdmac->is_ram_script = true;
+               break;
        default:
                dev_err(sdma->dev, "Unsupported transfer type %d\n",
                        peripheral_type);
        /* Send by context the event mask,base address for peripheral
         * and watermark level
         */
-       context->gReg[0] = sdmac->event_mask[1];
-       context->gReg[1] = sdmac->event_mask[0];
-       context->gReg[2] = sdmac->per_addr;
-       context->gReg[6] = sdmac->shp_addr;
-       context->gReg[7] = sdmac->watermark_level;
+       if (sdmac->peripheral_type == IMX_DMATYPE_HDMI) {
+               context->gReg[4] = sdmac->per_addr;
+               context->gReg[6] = sdmac->shp_addr;
+       } else {
+               context->gReg[0] = sdmac->event_mask[1];
+               context->gReg[1] = sdmac->event_mask[0];
+               context->gReg[2] = sdmac->per_addr;
+               context->gReg[6] = sdmac->shp_addr;
+               context->gReg[7] = sdmac->watermark_level;
+       }
 
        bd0->mode.command = C0_SETDM;
        bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD;
        desc->sdmac = sdmac;
        desc->num_bd = bds;
 
-       if (sdma_alloc_bd(desc))
+       if (bds && sdma_alloc_bd(desc))
                goto err_desc_out;
 
        /* No slave_config called in MEMCPY case, so do here */
 {
        struct sdma_channel *sdmac = to_sdma_chan(chan);
        struct sdma_engine *sdma = sdmac->sdma;
-       int num_periods = buf_len / period_len;
+       int num_periods = 0;
        int channel = sdmac->channel;
        int i = 0, buf = 0;
        struct sdma_desc *desc;
 
        dev_dbg(sdma->dev, "%s channel: %d\n", __func__, channel);
 
+       if (sdmac->peripheral_type != IMX_DMATYPE_HDMI)
+               num_periods = buf_len / period_len;
+
        sdma_config_write(chan, &sdmac->slave_config, direction);
 
        desc = sdma_transfer_init(sdmac, direction, num_periods);
                goto err_bd_out;
        }
 
+       if (sdmac->peripheral_type == IMX_DMATYPE_HDMI)
+               return vchan_tx_prep(&sdmac->vc, &desc->vd, flags);
+
        while (buf < buf_len) {
                struct sdma_buffer_descriptor *bd = &desc->bd[i];
                int param;
                sdmac->watermark_level |= (dmaengine_cfg->dst_maxburst << 16) &
                        SDMA_WATERMARK_LEVEL_HWML;
                sdmac->word_size = dmaengine_cfg->dst_addr_width;
+       } else if (sdmac->peripheral_type == IMX_DMATYPE_HDMI) {
+               sdmac->per_address = dmaengine_cfg->dst_addr;
+               sdmac->per_address2 = dmaengine_cfg->src_addr;
+               sdmac->watermark_level = 0;
        } else {
                sdmac->per_address = dmaengine_cfg->dst_addr;
                sdmac->watermark_level = dmaengine_cfg->dst_maxburst *