static void geni_se_select_dma_mode(struct geni_se *se)
 {
+       u32 proto = geni_se_read_proto(se);
        u32 val;
 
        writel_relaxed(0, se->base + SE_GSI_EVENT_EN);
        writel_relaxed(0xffffffff, se->base + SE_DMA_RX_IRQ_CLR);
        writel_relaxed(0xffffffff, se->base + SE_IRQ_EN);
 
+       val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN);
+       if (proto != GENI_SE_UART) {
+               val &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN);
+               val &= ~(M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN);
+       }
+       writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN);
+
+       val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN);
+       if (proto != GENI_SE_UART)
+               val &= ~S_CMD_DONE_EN;
+       writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN);
+
        val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN);
        val |= GENI_DMA_MODE_EN;
        writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN);
        writel_relaxed(lower_32_bits(*iova), se->base + SE_DMA_TX_PTR_L);
        writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_TX_PTR_H);
        writel_relaxed(GENI_SE_DMA_EOT_BUF, se->base + SE_DMA_TX_ATTR);
-       writel_relaxed(len, se->base + SE_DMA_TX_LEN);
+       writel(len, se->base + SE_DMA_TX_LEN);
        return 0;
 }
 EXPORT_SYMBOL(geni_se_tx_dma_prep);
        writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_RX_PTR_H);
        /* RX does not have EOT buffer type bit. So just reset RX_ATTR */
        writel_relaxed(0, se->base + SE_DMA_RX_ATTR);
-       writel_relaxed(len, se->base + SE_DMA_RX_LEN);
+       writel(len, se->base + SE_DMA_RX_LEN);
        return 0;
 }
 EXPORT_SYMBOL(geni_se_rx_dma_prep);