dmaengine: mmp-pdma: Split device_control
Split the device_control callback of the Marvell MMP PDMA driver to make use of the newly introduced callbacks, that will eventually be used to retrieve slave capabilities. Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
This commit is contained in:
parent
db08425ebd
commit
a0abd6719b
|
@ -683,68 +683,70 @@ fail:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmp_pdma_control(struct dma_chan *dchan, enum dma_ctrl_cmd cmd,
|
static int mmp_pdma_config(struct dma_chan *dchan,
|
||||||
unsigned long arg)
|
struct dma_slave_config *cfg)
|
||||||
{
|
{
|
||||||
struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
|
struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
|
||||||
struct dma_slave_config *cfg = (void *)arg;
|
|
||||||
unsigned long flags;
|
|
||||||
u32 maxburst = 0, addr = 0;
|
u32 maxburst = 0, addr = 0;
|
||||||
enum dma_slave_buswidth width = DMA_SLAVE_BUSWIDTH_UNDEFINED;
|
enum dma_slave_buswidth width = DMA_SLAVE_BUSWIDTH_UNDEFINED;
|
||||||
|
|
||||||
if (!dchan)
|
if (!dchan)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
switch (cmd) {
|
if (cfg->direction == DMA_DEV_TO_MEM) {
|
||||||
case DMA_TERMINATE_ALL:
|
chan->dcmd = DCMD_INCTRGADDR | DCMD_FLOWSRC;
|
||||||
disable_chan(chan->phy);
|
maxburst = cfg->src_maxburst;
|
||||||
mmp_pdma_free_phy(chan);
|
width = cfg->src_addr_width;
|
||||||
spin_lock_irqsave(&chan->desc_lock, flags);
|
addr = cfg->src_addr;
|
||||||
mmp_pdma_free_desc_list(chan, &chan->chain_pending);
|
} else if (cfg->direction == DMA_MEM_TO_DEV) {
|
||||||
mmp_pdma_free_desc_list(chan, &chan->chain_running);
|
chan->dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG;
|
||||||
spin_unlock_irqrestore(&chan->desc_lock, flags);
|
maxburst = cfg->dst_maxburst;
|
||||||
chan->idle = true;
|
width = cfg->dst_addr_width;
|
||||||
break;
|
addr = cfg->dst_addr;
|
||||||
case DMA_SLAVE_CONFIG:
|
|
||||||
if (cfg->direction == DMA_DEV_TO_MEM) {
|
|
||||||
chan->dcmd = DCMD_INCTRGADDR | DCMD_FLOWSRC;
|
|
||||||
maxburst = cfg->src_maxburst;
|
|
||||||
width = cfg->src_addr_width;
|
|
||||||
addr = cfg->src_addr;
|
|
||||||
} else if (cfg->direction == DMA_MEM_TO_DEV) {
|
|
||||||
chan->dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG;
|
|
||||||
maxburst = cfg->dst_maxburst;
|
|
||||||
width = cfg->dst_addr_width;
|
|
||||||
addr = cfg->dst_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (width == DMA_SLAVE_BUSWIDTH_1_BYTE)
|
|
||||||
chan->dcmd |= DCMD_WIDTH1;
|
|
||||||
else if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
|
|
||||||
chan->dcmd |= DCMD_WIDTH2;
|
|
||||||
else if (width == DMA_SLAVE_BUSWIDTH_4_BYTES)
|
|
||||||
chan->dcmd |= DCMD_WIDTH4;
|
|
||||||
|
|
||||||
if (maxburst == 8)
|
|
||||||
chan->dcmd |= DCMD_BURST8;
|
|
||||||
else if (maxburst == 16)
|
|
||||||
chan->dcmd |= DCMD_BURST16;
|
|
||||||
else if (maxburst == 32)
|
|
||||||
chan->dcmd |= DCMD_BURST32;
|
|
||||||
|
|
||||||
chan->dir = cfg->direction;
|
|
||||||
chan->dev_addr = addr;
|
|
||||||
/* FIXME: drivers should be ported over to use the filter
|
|
||||||
* function. Once that's done, the following two lines can
|
|
||||||
* be removed.
|
|
||||||
*/
|
|
||||||
if (cfg->slave_id)
|
|
||||||
chan->drcmr = cfg->slave_id;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (width == DMA_SLAVE_BUSWIDTH_1_BYTE)
|
||||||
|
chan->dcmd |= DCMD_WIDTH1;
|
||||||
|
else if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
|
||||||
|
chan->dcmd |= DCMD_WIDTH2;
|
||||||
|
else if (width == DMA_SLAVE_BUSWIDTH_4_BYTES)
|
||||||
|
chan->dcmd |= DCMD_WIDTH4;
|
||||||
|
|
||||||
|
if (maxburst == 8)
|
||||||
|
chan->dcmd |= DCMD_BURST8;
|
||||||
|
else if (maxburst == 16)
|
||||||
|
chan->dcmd |= DCMD_BURST16;
|
||||||
|
else if (maxburst == 32)
|
||||||
|
chan->dcmd |= DCMD_BURST32;
|
||||||
|
|
||||||
|
chan->dir = cfg->direction;
|
||||||
|
chan->dev_addr = addr;
|
||||||
|
/* FIXME: drivers should be ported over to use the filter
|
||||||
|
* function. Once that's done, the following two lines can
|
||||||
|
* be removed.
|
||||||
|
*/
|
||||||
|
if (cfg->slave_id)
|
||||||
|
chan->drcmr = cfg->slave_id;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mmp_pdma_terminate_all(struct dma_chan *dchan)
|
||||||
|
{
|
||||||
|
struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (!dchan)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
disable_chan(chan->phy);
|
||||||
|
mmp_pdma_free_phy(chan);
|
||||||
|
spin_lock_irqsave(&chan->desc_lock, flags);
|
||||||
|
mmp_pdma_free_desc_list(chan, &chan->chain_pending);
|
||||||
|
mmp_pdma_free_desc_list(chan, &chan->chain_running);
|
||||||
|
spin_unlock_irqrestore(&chan->desc_lock, flags);
|
||||||
|
chan->idle = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,7 +1063,8 @@ static int mmp_pdma_probe(struct platform_device *op)
|
||||||
pdev->device.device_prep_slave_sg = mmp_pdma_prep_slave_sg;
|
pdev->device.device_prep_slave_sg = mmp_pdma_prep_slave_sg;
|
||||||
pdev->device.device_prep_dma_cyclic = mmp_pdma_prep_dma_cyclic;
|
pdev->device.device_prep_dma_cyclic = mmp_pdma_prep_dma_cyclic;
|
||||||
pdev->device.device_issue_pending = mmp_pdma_issue_pending;
|
pdev->device.device_issue_pending = mmp_pdma_issue_pending;
|
||||||
pdev->device.device_control = mmp_pdma_control;
|
pdev->device.device_config = mmp_pdma_config;
|
||||||
|
pdev->device.device_terminate_all = mmp_pdma_terminate_all;
|
||||||
pdev->device.copy_align = PDMA_ALIGNMENT;
|
pdev->device.copy_align = PDMA_ALIGNMENT;
|
||||||
|
|
||||||
if (pdev->dev->coherent_dma_mask)
|
if (pdev->dev->coherent_dma_mask)
|
||||||
|
|
Loading…
Reference in New Issue