mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-27 20:07:09 +00:00
dmaengine: d40: Split device_control
Split the device_control callback of the ST-Ericsson DMA 40 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> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
This commit is contained in:
parent
826b15a7a8
commit
6f5bad03e8
@ -1429,11 +1429,17 @@ static bool d40_tx_is_linked(struct d40_chan *d40c)
|
|||||||
return is_link;
|
return is_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int d40_pause(struct d40_chan *d40c)
|
static int d40_pause(struct dma_chan *chan)
|
||||||
{
|
{
|
||||||
|
struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
|
||||||
int res = 0;
|
int res = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (d40c->phy_chan == NULL) {
|
||||||
|
chan_err(d40c, "Channel is not allocated!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!d40c->busy)
|
if (!d40c->busy)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1448,11 +1454,17 @@ static int d40_pause(struct d40_chan *d40c)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int d40_resume(struct d40_chan *d40c)
|
static int d40_resume(struct dma_chan *chan)
|
||||||
{
|
{
|
||||||
|
struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
|
||||||
int res = 0;
|
int res = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (d40c->phy_chan == NULL) {
|
||||||
|
chan_err(d40c, "Channel is not allocated!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!d40c->busy)
|
if (!d40c->busy)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -2610,6 +2622,11 @@ static void d40_terminate_all(struct dma_chan *chan)
|
|||||||
struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
|
struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (d40c->phy_chan == NULL) {
|
||||||
|
chan_err(d40c, "Channel is not allocated!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&d40c->lock, flags);
|
spin_lock_irqsave(&d40c->lock, flags);
|
||||||
|
|
||||||
pm_runtime_get_sync(d40c->base->dev);
|
pm_runtime_get_sync(d40c->base->dev);
|
||||||
@ -2673,6 +2690,11 @@ static int d40_set_runtime_config(struct dma_chan *chan,
|
|||||||
u32 src_maxburst, dst_maxburst;
|
u32 src_maxburst, dst_maxburst;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (d40c->phy_chan == NULL) {
|
||||||
|
chan_err(d40c, "Channel is not allocated!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
src_addr_width = config->src_addr_width;
|
src_addr_width = config->src_addr_width;
|
||||||
src_maxburst = config->src_maxburst;
|
src_maxburst = config->src_maxburst;
|
||||||
dst_addr_width = config->dst_addr_width;
|
dst_addr_width = config->dst_addr_width;
|
||||||
@ -2781,35 +2803,6 @@ static int d40_set_runtime_config(struct dma_chan *chan,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int d40_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
|
|
||||||
unsigned long arg)
|
|
||||||
{
|
|
||||||
struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
|
|
||||||
|
|
||||||
if (d40c->phy_chan == NULL) {
|
|
||||||
chan_err(d40c, "Channel is not allocated!\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cmd) {
|
|
||||||
case DMA_TERMINATE_ALL:
|
|
||||||
d40_terminate_all(chan);
|
|
||||||
return 0;
|
|
||||||
case DMA_PAUSE:
|
|
||||||
return d40_pause(d40c);
|
|
||||||
case DMA_RESUME:
|
|
||||||
return d40_resume(d40c);
|
|
||||||
case DMA_SLAVE_CONFIG:
|
|
||||||
return d40_set_runtime_config(chan,
|
|
||||||
(struct dma_slave_config *) arg);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Other commands are unimplemented */
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialization functions */
|
/* Initialization functions */
|
||||||
|
|
||||||
static void __init d40_chan_init(struct d40_base *base, struct dma_device *dma,
|
static void __init d40_chan_init(struct d40_base *base, struct dma_device *dma,
|
||||||
@ -2870,7 +2863,10 @@ static void d40_ops_init(struct d40_base *base, struct dma_device *dev)
|
|||||||
dev->device_free_chan_resources = d40_free_chan_resources;
|
dev->device_free_chan_resources = d40_free_chan_resources;
|
||||||
dev->device_issue_pending = d40_issue_pending;
|
dev->device_issue_pending = d40_issue_pending;
|
||||||
dev->device_tx_status = d40_tx_status;
|
dev->device_tx_status = d40_tx_status;
|
||||||
dev->device_control = d40_control;
|
dev->device_config = d40_set_runtime_config;
|
||||||
|
dev->device_pause = d40_pause;
|
||||||
|
dev->device_resume = d40_resume;
|
||||||
|
dev->device_terminate_all = d40_terminate_all;
|
||||||
dev->dev = base->dev;
|
dev->dev = base->dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user