rk: revert 20f3d0b+v3.0.66 to v3.0
[firefly-linux-kernel-4.4.55.git] / drivers / dma / at_hdmac.c
index 1357c3b1e3a28ae629d539afd722f82c866868c7..36144f88d718f383b232b25d168030077f6769d3 100644 (file)
@@ -237,6 +237,10 @@ static void atc_dostart(struct at_dma_chan *atchan, struct at_desc *first)
 
        vdbg_dump_regs(atchan);
 
+       /* clear any pending interrupt */
+       while (dma_readl(atdma, EBCISR))
+               cpu_relax();
+
        channel_writel(atchan, SADDR, 0);
        channel_writel(atchan, DADDR, 0);
        channel_writel(atchan, CTRLA, 0);
@@ -674,7 +678,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
                        flags);
 
        if (unlikely(!atslave || !sg_len)) {
-               dev_dbg(chan2dev(chan), "prep_slave_sg: sg length is zero!\n");
+               dev_dbg(chan2dev(chan), "prep_dma_memcpy: length is zero!\n");
                return NULL;
        }
 
@@ -702,11 +706,6 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 
                        mem = sg_dma_address(sg);
                        len = sg_dma_len(sg);
-                       if (unlikely(!len)) {
-                               dev_dbg(chan2dev(chan),
-                                       "prep_slave_sg: sg(%d) data length is zero\n", i);
-                               goto err;
-                       }
                        mem_width = 2;
                        if (unlikely(mem & 3 || len & 3))
                                mem_width = 0;
@@ -741,11 +740,6 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 
                        mem = sg_dma_address(sg);
                        len = sg_dma_len(sg);
-                       if (unlikely(!len)) {
-                               dev_dbg(chan2dev(chan),
-                                       "prep_slave_sg: sg(%d) data length is zero\n", i);
-                               goto err;
-                       }
                        mem_width = 2;
                        if (unlikely(mem & 3 || len & 3))
                                mem_width = 0;
@@ -779,7 +773,6 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 
 err_desc_get:
        dev_err(chan2dev(chan), "not enough descriptors available\n");
-err:
        atc_desc_put(atchan, first);
        return NULL;
 }
@@ -1286,7 +1279,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
 
                tasklet_init(&atchan->tasklet, atc_tasklet,
                                (unsigned long)atchan);
-               atc_enable_chan_irq(atdma, i);
+               atc_enable_irq(atchan);
        }
 
        /* set base routines */
@@ -1355,7 +1348,7 @@ static int __exit at_dma_remove(struct platform_device *pdev)
                struct at_dma_chan      *atchan = to_at_dma_chan(chan);
 
                /* Disable interrupts */
-               atc_disable_chan_irq(atdma, chan->chan_id);
+               atc_disable_irq(atchan);
                tasklet_disable(&atchan->tasklet);
 
                tasklet_kill(&atchan->tasklet);