diff options
Diffstat (limited to 'drivers/dma')
| -rw-r--r-- | drivers/dma/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/dma/dw_dmac_regs.h | 18 | ||||
| -rw-r--r-- | drivers/dma/imx-dma.c | 4 | ||||
| -rw-r--r-- | drivers/dma/sirf-dma.c | 4 | 
4 files changed, 29 insertions, 8 deletions
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index 677cd6e4e1a..d4c12180c65 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig @@ -90,6 +90,17 @@ config DW_DMAC  	  Support the Synopsys DesignWare AHB DMA controller.  This  	  can be integrated in chips such as the Atmel AT32ap7000. +config DW_DMAC_BIG_ENDIAN_IO +	bool "Use big endian I/O register access" +	default y if AVR32 +	depends on DW_DMAC +	help +	  Say yes here to use big endian I/O access when reading and writing +	  to the DMA controller registers. This is needed on some platforms, +	  like the Atmel AVR32 architecture. + +	  If unsure, use the default setting. +  config AT_HDMAC  	tristate "Atmel AHB DMA support"  	depends on ARCH_AT91 diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h index ff39fa6cd2b..88965597b7d 100644 --- a/drivers/dma/dw_dmac_regs.h +++ b/drivers/dma/dw_dmac_regs.h @@ -98,9 +98,17 @@ struct dw_dma_regs {  	u32	DW_PARAMS;  }; +#ifdef CONFIG_DW_DMAC_BIG_ENDIAN_IO +#define dma_readl_native ioread32be +#define dma_writel_native iowrite32be +#else +#define dma_readl_native readl +#define dma_writel_native writel +#endif +  /* To access the registers in early stage of probe */  #define dma_read_byaddr(addr, name) \ -	readl((addr) + offsetof(struct dw_dma_regs, name)) +	dma_readl_native((addr) + offsetof(struct dw_dma_regs, name))  /* Bitfields in DW_PARAMS */  #define DW_PARAMS_NR_CHAN	8		/* number of channels */ @@ -216,9 +224,9 @@ __dwc_regs(struct dw_dma_chan *dwc)  }  #define channel_readl(dwc, name) \ -	readl(&(__dwc_regs(dwc)->name)) +	dma_readl_native(&(__dwc_regs(dwc)->name))  #define channel_writel(dwc, name, val) \ -	writel((val), &(__dwc_regs(dwc)->name)) +	dma_writel_native((val), &(__dwc_regs(dwc)->name))  static inline struct dw_dma_chan *to_dw_dma_chan(struct dma_chan *chan)  { @@ -246,9 +254,9 @@ static inline struct dw_dma_regs __iomem *__dw_regs(struct dw_dma *dw)  }  #define dma_readl(dw, name) \ -	readl(&(__dw_regs(dw)->name)) +	dma_readl_native(&(__dw_regs(dw)->name))  #define dma_writel(dw, name, val) \ -	writel((val), &(__dw_regs(dw)->name)) +	dma_writel_native((val), &(__dw_regs(dw)->name))  #define channel_set_bit(dw, reg, mask) \  	dma_writel(dw, reg, ((mask) << 8) | (mask)) diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c index f11b5b2b1a1..7d9554cc497 100644 --- a/drivers/dma/imx-dma.c +++ b/drivers/dma/imx-dma.c @@ -474,8 +474,10 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)  			slot = i;  			break;  		} -		if (slot < 0) +		if (slot < 0) { +			spin_unlock_irqrestore(&imxdma->lock, flags);  			return -EBUSY; +		}  		imxdma->slots_2d[slot].xsr = d->x;  		imxdma->slots_2d[slot].ysr = d->y; diff --git a/drivers/dma/sirf-dma.c b/drivers/dma/sirf-dma.c index 64385cde044..d451caace80 100644 --- a/drivers/dma/sirf-dma.c +++ b/drivers/dma/sirf-dma.c @@ -109,7 +109,7 @@ static void sirfsoc_dma_execute(struct sirfsoc_dma_chan *schan)  	sdesc = list_first_entry(&schan->queued, struct sirfsoc_dma_desc,  		node);  	/* Move the first queued descriptor to active list */ -	list_move_tail(&schan->queued, &schan->active); +	list_move_tail(&sdesc->node, &schan->active);  	/* Start the DMA transfer */  	writel_relaxed(sdesc->width, sdma->base + SIRFSOC_DMA_WIDTH_0 + @@ -428,7 +428,7 @@ static struct dma_async_tx_descriptor *sirfsoc_dma_prep_interleaved(  	unsigned long iflags;  	int ret; -	if ((xt->dir != DMA_MEM_TO_DEV) || (xt->dir != DMA_DEV_TO_MEM)) { +	if ((xt->dir != DMA_MEM_TO_DEV) && (xt->dir != DMA_DEV_TO_MEM)) {  		ret = -EINVAL;  		goto err_dir;  	}  |