|
|
|
@ -132,7 +132,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
|
|
|
|
|
async_desc->num_desc = num_alloc;
|
|
|
|
|
async_desc->curr_desc = async_desc->desc;
|
|
|
|
|
@@ -685,29 +688,16 @@ err_out:
|
|
|
|
|
@@ -685,28 +688,16 @@ err_out:
|
|
|
|
|
static int bam_dma_terminate_all(struct dma_chan *chan)
|
|
|
|
|
{
|
|
|
|
|
struct bam_chan *bchan = to_bam_chan(chan);
|
|
|
|
@ -159,15 +159,14 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
- bam_chan_init_hw(bchan, bchan->curr_txd->dir);
|
|
|
|
|
- list_add(&bchan->curr_txd->vd.node, &bchan->vc.desc_issued);
|
|
|
|
|
- bchan->curr_txd = NULL;
|
|
|
|
|
- }
|
|
|
|
|
+ list_for_each_entry_safe(async_desc, tmp,
|
|
|
|
|
+ &bchan->desc_list, desc_node) {
|
|
|
|
|
+ list_add(&async_desc->vd.node, &bchan->vc.desc_issued);
|
|
|
|
|
+ list_del(&async_desc->desc_node);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vchan_get_all_descriptors(&bchan->vc, &head);
|
|
|
|
|
spin_unlock_irqrestore(&bchan->vc.lock, flag);
|
|
|
|
|
@@ -778,9 +768,9 @@ static int bam_resume(struct dma_chan *c
|
|
|
|
|
@@ -778,9 +769,9 @@ static int bam_resume(struct dma_chan *c
|
|
|
|
|
*/
|
|
|
|
|
static u32 process_channel_irqs(struct bam_device *bdev)
|
|
|
|
|
{
|
|
|
|
@ -179,7 +178,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
|
|
|
|
|
srcs = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_SRCS_EE));
|
|
|
|
|
|
|
|
|
|
@@ -800,27 +790,40 @@ static u32 process_channel_irqs(struct b
|
|
|
|
|
@@ -800,27 +791,40 @@ static u32 process_channel_irqs(struct b
|
|
|
|
|
writel_relaxed(pipe_stts, bam_addr(bdev, i, BAM_P_IRQ_CLR));
|
|
|
|
|
|
|
|
|
|
spin_lock_irqsave(&bchan->vc.lock, flags);
|
|
|
|
@ -229,7 +228,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
spin_unlock_irqrestore(&bchan->vc.lock, flags);
|
|
|
|
|
@@ -882,6 +885,7 @@ static enum dma_status bam_tx_status(str
|
|
|
|
|
@@ -882,6 +886,7 @@ static enum dma_status bam_tx_status(str
|
|
|
|
|
struct dma_tx_state *txstate)
|
|
|
|
|
{
|
|
|
|
|
struct bam_chan *bchan = to_bam_chan(chan);
|
|
|
|
@ -237,7 +236,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
struct virt_dma_desc *vd;
|
|
|
|
|
int ret;
|
|
|
|
|
size_t residue = 0;
|
|
|
|
|
@@ -897,11 +901,17 @@ static enum dma_status bam_tx_status(str
|
|
|
|
|
@@ -897,11 +902,17 @@ static enum dma_status bam_tx_status(str
|
|
|
|
|
|
|
|
|
|
spin_lock_irqsave(&bchan->vc.lock, flags);
|
|
|
|
|
vd = vchan_find_desc(&bchan->vc, cookie);
|
|
|
|
@ -259,7 +258,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
|
|
|
|
|
spin_unlock_irqrestore(&bchan->vc.lock, flags);
|
|
|
|
|
|
|
|
|
|
@@ -942,63 +952,86 @@ static void bam_start_dma(struct bam_cha
|
|
|
|
|
@@ -942,63 +953,86 @@ static void bam_start_dma(struct bam_cha
|
|
|
|
|
{
|
|
|
|
|
struct virt_dma_desc *vd = vchan_next_desc(&bchan->vc);
|
|
|
|
|
struct bam_device *bdev = bchan->bdev;
|
|
|
|
@ -382,7 +381,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
|
|
|
|
|
/* ensure descriptor writes and dma start not reordered */
|
|
|
|
|
wmb();
|
|
|
|
|
@@ -1027,7 +1060,7 @@ static void dma_tasklet(unsigned long da
|
|
|
|
|
@@ -1027,7 +1061,7 @@ static void dma_tasklet(unsigned long da
|
|
|
|
|
bchan = &bdev->channels[i];
|
|
|
|
|
spin_lock_irqsave(&bchan->vc.lock, flags);
|
|
|
|
|
|
|
|
|
@ -391,7 +390,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
bam_start_dma(bchan);
|
|
|
|
|
spin_unlock_irqrestore(&bchan->vc.lock, flags);
|
|
|
|
|
}
|
|
|
|
|
@@ -1048,7 +1081,7 @@ static void bam_issue_pending(struct dma
|
|
|
|
|
@@ -1048,7 +1082,7 @@ static void bam_issue_pending(struct dma
|
|
|
|
|
spin_lock_irqsave(&bchan->vc.lock, flags);
|
|
|
|
|
|
|
|
|
|
/* if work pending and idle, start a transaction */
|
|
|
|
@ -400,7 +399,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
|
|
|
|
bam_start_dma(bchan);
|
|
|
|
|
|
|
|
|
|
spin_unlock_irqrestore(&bchan->vc.lock, flags);
|
|
|
|
|
@@ -1152,6 +1185,7 @@ static void bam_channel_init(struct bam_
|
|
|
|
|
@@ -1152,6 +1186,7 @@ static void bam_channel_init(struct bam_
|
|
|
|
|
|
|
|
|
|
vchan_init(&bchan->vc, &bdev->common);
|
|
|
|
|
bchan->vc.desc_free = bam_dma_free_desc;
|
|
|
|
|