mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'topic/async' into for-linus
This commit is contained in:
commit
d3f1e93ce8
7 changed files with 177 additions and 8 deletions
|
|
@ -307,6 +307,13 @@ static int axi_dmac_terminate_all(struct dma_chan *c)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void axi_dmac_synchronize(struct dma_chan *c)
|
||||
{
|
||||
struct axi_dmac_chan *chan = to_axi_dmac_chan(c);
|
||||
|
||||
vchan_synchronize(&chan->vchan);
|
||||
}
|
||||
|
||||
static void axi_dmac_issue_pending(struct dma_chan *c)
|
||||
{
|
||||
struct axi_dmac_chan *chan = to_axi_dmac_chan(c);
|
||||
|
|
@ -613,6 +620,7 @@ static int axi_dmac_probe(struct platform_device *pdev)
|
|||
dma_dev->device_prep_dma_cyclic = axi_dmac_prep_dma_cyclic;
|
||||
dma_dev->device_prep_interleaved_dma = axi_dmac_prep_interleaved;
|
||||
dma_dev->device_terminate_all = axi_dmac_terminate_all;
|
||||
dma_dev->device_synchronize = axi_dmac_synchronize;
|
||||
dma_dev->dev = &pdev->dev;
|
||||
dma_dev->chancnt = 1;
|
||||
dma_dev->src_addr_widths = BIT(dmac->chan.src_width);
|
||||
|
|
|
|||
|
|
@ -266,8 +266,11 @@ static void dma_chan_put(struct dma_chan *chan)
|
|||
module_put(dma_chan_to_owner(chan));
|
||||
|
||||
/* This channel is not in use anymore, free it */
|
||||
if (!chan->client_count && chan->device->device_free_chan_resources)
|
||||
if (!chan->client_count && chan->device->device_free_chan_resources) {
|
||||
/* Make sure all operations have completed */
|
||||
dmaengine_synchronize(chan);
|
||||
chan->device->device_free_chan_resources(chan);
|
||||
}
|
||||
|
||||
/* If the channel is used via a DMA request router, free the mapping */
|
||||
if (chan->router && chan->router->route_free) {
|
||||
|
|
|
|||
|
|
@ -163,4 +163,17 @@ static inline void vchan_free_chan_resources(struct virt_dma_chan *vc)
|
|||
vchan_dma_desc_free_list(vc, &head);
|
||||
}
|
||||
|
||||
/**
|
||||
* vchan_synchronize() - synchronize callback execution to the current context
|
||||
* @vc: virtual channel to synchronize
|
||||
*
|
||||
* Makes sure that all scheduled or active callbacks have finished running. For
|
||||
* proper operation the caller has to ensure that no new callbacks are scheduled
|
||||
* after the invocation of this function started.
|
||||
*/
|
||||
static inline void vchan_synchronize(struct virt_dma_chan *vc)
|
||||
{
|
||||
tasklet_kill(&vc->task);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue