Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
* 'next' of git://git.infradead.org/users/vkoul/slave-dma: (53 commits) ARM: mach-shmobile: specify CHCLR registers on SH7372 dma: shdma: fix runtime PM: clear channel buffers on reset dma/imx-sdma: save irq flags when use spin_lock in sdma_tx_submit dmaengine/ste_dma40: clear LNK on channel startup dmaengine: intel_mid_dma: remove legacy pm interface ASoC: mxs: correct 'direction' of device_prep_dma_cyclic dmaengine: intel_mid_dma: error path fix dmaengine: intel_mid_dma: locking and freeing fixes mtd: gpmi-nand: move to dma_transfer_direction mtd: fix compile error for gpmi-nand mmc: mxs-mmc: fix the dma_transfer_direction migration dmaengine: add DMA_TRANS_NONE to dma_transfer_direction dma: mxs-dma: Don't use CLKGATE bits in CTRL0 to disable DMA channels dma: mxs-dma: make mxs_dma_prep_slave_sg() multi user safe dma: mxs-dma: Always leave mxs_dma_init() with the clock disabled. dma: mxs-dma: fix a typo in comment DMA: PL330: Remove pm_runtime_xxx calls from pl330 probe/remove video i.MX IPU: Fix display connections i.MX IPU DMA: Fix wrong burstsize settings dmaengine/ste_dma40: allow fixed physical channel ... Fix up conflicts in drivers/dma/{Kconfig,mxs-dma.c,pl330.c} The conflicts looked pretty trivial, but I'll ask people to verify them.
This commit is contained in:
@@ -854,8 +854,10 @@ static int prep_phy_channel(struct pl08x_dma_chan *plchan,
|
||||
int ret;
|
||||
|
||||
/* Check if we already have a channel */
|
||||
if (plchan->phychan)
|
||||
return 0;
|
||||
if (plchan->phychan) {
|
||||
ch = plchan->phychan;
|
||||
goto got_channel;
|
||||
}
|
||||
|
||||
ch = pl08x_get_phy_channel(pl08x, plchan);
|
||||
if (!ch) {
|
||||
@@ -880,21 +882,22 @@ static int prep_phy_channel(struct pl08x_dma_chan *plchan,
|
||||
return -EBUSY;
|
||||
}
|
||||
ch->signal = ret;
|
||||
|
||||
/* Assign the flow control signal to this channel */
|
||||
if (txd->direction == DMA_TO_DEVICE)
|
||||
txd->ccfg |= ch->signal << PL080_CONFIG_DST_SEL_SHIFT;
|
||||
else if (txd->direction == DMA_FROM_DEVICE)
|
||||
txd->ccfg |= ch->signal << PL080_CONFIG_SRC_SEL_SHIFT;
|
||||
}
|
||||
|
||||
plchan->phychan = ch;
|
||||
dev_dbg(&pl08x->adev->dev, "allocated physical channel %d and signal %d for xfer on %s\n",
|
||||
ch->id,
|
||||
ch->signal,
|
||||
plchan->name);
|
||||
|
||||
got_channel:
|
||||
/* Assign the flow control signal to this channel */
|
||||
if (txd->direction == DMA_MEM_TO_DEV)
|
||||
txd->ccfg |= ch->signal << PL080_CONFIG_DST_SEL_SHIFT;
|
||||
else if (txd->direction == DMA_DEV_TO_MEM)
|
||||
txd->ccfg |= ch->signal << PL080_CONFIG_SRC_SEL_SHIFT;
|
||||
|
||||
plchan->phychan_hold++;
|
||||
plchan->phychan = ch;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1102,10 +1105,10 @@ static int dma_set_runtime_config(struct dma_chan *chan,
|
||||
|
||||
/* Transfer direction */
|
||||
plchan->runtime_direction = config->direction;
|
||||
if (config->direction == DMA_TO_DEVICE) {
|
||||
if (config->direction == DMA_MEM_TO_DEV) {
|
||||
addr_width = config->dst_addr_width;
|
||||
maxburst = config->dst_maxburst;
|
||||
} else if (config->direction == DMA_FROM_DEVICE) {
|
||||
} else if (config->direction == DMA_DEV_TO_MEM) {
|
||||
addr_width = config->src_addr_width;
|
||||
maxburst = config->src_maxburst;
|
||||
} else {
|
||||
@@ -1136,7 +1139,7 @@ static int dma_set_runtime_config(struct dma_chan *chan,
|
||||
cctl |= burst << PL080_CONTROL_SB_SIZE_SHIFT;
|
||||
cctl |= burst << PL080_CONTROL_DB_SIZE_SHIFT;
|
||||
|
||||
if (plchan->runtime_direction == DMA_FROM_DEVICE) {
|
||||
if (plchan->runtime_direction == DMA_DEV_TO_MEM) {
|
||||
plchan->src_addr = config->src_addr;
|
||||
plchan->src_cctl = pl08x_cctl(cctl) | PL080_CONTROL_DST_INCR |
|
||||
pl08x_select_bus(plchan->cd->periph_buses,
|
||||
@@ -1152,7 +1155,7 @@ static int dma_set_runtime_config(struct dma_chan *chan,
|
||||
"configured channel %s (%s) for %s, data width %d, "
|
||||
"maxburst %d words, LE, CCTL=0x%08x\n",
|
||||
dma_chan_name(chan), plchan->name,
|
||||
(config->direction == DMA_FROM_DEVICE) ? "RX" : "TX",
|
||||
(config->direction == DMA_DEV_TO_MEM) ? "RX" : "TX",
|
||||
addr_width,
|
||||
maxburst,
|
||||
cctl);
|
||||
@@ -1322,7 +1325,7 @@ static struct dma_async_tx_descriptor *pl08x_prep_dma_memcpy(
|
||||
|
||||
static struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
|
||||
struct dma_chan *chan, struct scatterlist *sgl,
|
||||
unsigned int sg_len, enum dma_data_direction direction,
|
||||
unsigned int sg_len, enum dma_transfer_direction direction,
|
||||
unsigned long flags)
|
||||
{
|
||||
struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
|
||||
@@ -1354,10 +1357,10 @@ static struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
|
||||
*/
|
||||
txd->direction = direction;
|
||||
|
||||
if (direction == DMA_TO_DEVICE) {
|
||||
if (direction == DMA_MEM_TO_DEV) {
|
||||
txd->cctl = plchan->dst_cctl;
|
||||
slave_addr = plchan->dst_addr;
|
||||
} else if (direction == DMA_FROM_DEVICE) {
|
||||
} else if (direction == DMA_DEV_TO_MEM) {
|
||||
txd->cctl = plchan->src_cctl;
|
||||
slave_addr = plchan->src_addr;
|
||||
} else {
|
||||
@@ -1368,10 +1371,10 @@ static struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
|
||||
}
|
||||
|
||||
if (plchan->cd->device_fc)
|
||||
tmp = (direction == DMA_TO_DEVICE) ? PL080_FLOW_MEM2PER_PER :
|
||||
tmp = (direction == DMA_MEM_TO_DEV) ? PL080_FLOW_MEM2PER_PER :
|
||||
PL080_FLOW_PER2MEM_PER;
|
||||
else
|
||||
tmp = (direction == DMA_TO_DEVICE) ? PL080_FLOW_MEM2PER :
|
||||
tmp = (direction == DMA_MEM_TO_DEV) ? PL080_FLOW_MEM2PER :
|
||||
PL080_FLOW_PER2MEM;
|
||||
|
||||
txd->ccfg |= tmp << PL080_CONFIG_FLOW_CONTROL_SHIFT;
|
||||
@@ -1387,7 +1390,7 @@ static struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
|
||||
list_add_tail(&dsg->node, &txd->dsg_list);
|
||||
|
||||
dsg->len = sg_dma_len(sg);
|
||||
if (direction == DMA_TO_DEVICE) {
|
||||
if (direction == DMA_MEM_TO_DEV) {
|
||||
dsg->src_addr = sg_phys(sg);
|
||||
dsg->dst_addr = slave_addr;
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user