return true;
}
+static struct axi_dmac_desc *axi_dmac_get_next_desc(struct axi_dmac *dmac,
+ struct axi_dmac_chan *chan)
+{
+ struct virt_dma_desc *vdesc;
+ struct axi_dmac_desc *desc;
+
+ if (chan->next_desc)
+ return chan->next_desc;
+
+ vdesc = vchan_next_desc(&chan->vchan);
+ if (!vdesc)
+ return NULL;
+
+ list_move_tail(&vdesc->node, &chan->active_descs);
+ desc = to_axi_dmac_desc(vdesc);
+ chan->next_desc = desc;
+
+ return desc;
+}
+
static void axi_dmac_start_transfer(struct axi_dmac_chan *chan)
{
struct axi_dmac *dmac = chan_to_axi_dmac(chan);
- struct virt_dma_desc *vdesc;
struct axi_dmac_desc *desc;
struct axi_dmac_sg *sg;
unsigned int flags = 0;
if (val) /* Queue is full, wait for the next SOT IRQ */
return;
- desc = chan->next_desc;
+ desc = axi_dmac_get_next_desc(dmac, chan);
+ if (!desc)
+ return;
- if (!desc) {
- vdesc = vchan_next_desc(&chan->vchan);
- if (!vdesc)
- return;
- list_move_tail(&vdesc->node, &chan->active_descs);
- desc = to_axi_dmac_desc(vdesc);
- chan->next_desc = desc;
- }
sg = &desc->sg[desc->num_submitted];
/* Already queued in cyclic mode. Wait for it to finish */