]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/dma/pl330.c
Merge branch 'for-linus-4.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / dma / pl330.c
index 030fe05ed43b1e99a63644324fb30305198c62ce..87fd01539fcb74daa0c80a62a268311b7125dce1 100644 (file)
@@ -570,7 +570,8 @@ static inline u32 _emit_ADDH(unsigned dry_run, u8 buf[],
 
        buf[0] = CMD_DMAADDH;
        buf[0] |= (da << 1);
-       *((__le16 *)&buf[1]) = cpu_to_le16(val);
+       buf[1] = val;
+       buf[2] = val >> 8;
 
        PL330_DBGCMD_DUMP(SZ_DMAADDH, "\tDMAADDH %s %u\n",
                da == 1 ? "DA" : "SA", val);
@@ -724,7 +725,10 @@ static inline u32 _emit_MOV(unsigned dry_run, u8 buf[],
 
        buf[0] = CMD_DMAMOV;
        buf[1] = dst;
-       *((__le32 *)&buf[2]) = cpu_to_le32(val);
+       buf[2] = val;
+       buf[3] = val >> 8;
+       buf[4] = val >> 16;
+       buf[5] = val >> 24;
 
        PL330_DBGCMD_DUMP(SZ_DMAMOV, "\tDMAMOV %s 0x%x\n",
                dst == SAR ? "SAR" : (dst == DAR ? "DAR" : "CCR"), val);
@@ -899,10 +903,11 @@ static inline u32 _emit_GO(unsigned dry_run, u8 buf[],
 
        buf[0] = CMD_DMAGO;
        buf[0] |= (ns << 1);
-
        buf[1] = chan & 0x7;
-
-       *((__le32 *)&buf[2]) = cpu_to_le32(addr);
+       buf[2] = addr;
+       buf[3] = addr >> 8;
+       buf[4] = addr >> 16;
+       buf[5] = addr >> 24;
 
        return SZ_DMAGO;
 }
@@ -1883,11 +1888,8 @@ static int dmac_alloc_resources(struct pl330_dmac *pl330)
 
 static int pl330_add(struct pl330_dmac *pl330)
 {
-       void __iomem *regs;
        int i, ret;
 
-       regs = pl330->base;
-
        /* Check if we can handle this DMAC */
        if ((pl330->pcfg.periph_id & 0xfffff) != PERIPH_ID_VAL) {
                dev_err(pl330->ddma.dev, "PERIPH_ID 0x%x !\n",
@@ -2263,6 +2265,11 @@ static int pl330_get_current_xferred_count(struct dma_pl330_chan *pch,
        }
        pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
        pm_runtime_put_autosuspend(pl330->ddma.dev);
+
+       /* If DMAMOV hasn't finished yet, SAR/DAR can be zero */
+       if (!val)
+               return 0;
+
        return val - addr;
 }