Lines Matching refs:chan

87 #define to_usb_dmac_chan(c) container_of(c, struct usb_dmac_chan, vc.chan)
161 static u32 usb_dmac_chan_read(struct usb_dmac_chan *chan, u32 reg)
163 return readl(chan->iomem + reg);
166 static void usb_dmac_chan_write(struct usb_dmac_chan *chan, u32 reg, u32 data)
168 writel(data, chan->iomem + reg);
175 static bool usb_dmac_chan_is_busy(struct usb_dmac_chan *chan)
177 u32 chcr = usb_dmac_chan_read(chan, USB_DMACHCR);
193 static void usb_dmac_chan_start_sg(struct usb_dmac_chan *chan,
196 struct usb_dmac_desc *desc = chan->desc;
200 WARN_ON_ONCE(usb_dmac_chan_is_busy(chan));
207 dev_dbg(chan->vc.chan.device->dev,
208 "chan%u: queue sg %p: %u@%pad -> %pad\n",
209 chan->index, sg, sg->size, &src_addr, &dst_addr);
211 usb_dmac_chan_write(chan, USB_DMASAR, src_addr & 0xffffffff);
212 usb_dmac_chan_write(chan, USB_DMADAR, dst_addr & 0xffffffff);
213 usb_dmac_chan_write(chan, USB_DMATCR,
215 usb_dmac_chan_write(chan, USB_DMATEND, usb_dmac_calc_tend(sg->size));
217 usb_dmac_chan_write(chan, USB_DMACHCR, USB_DMAC_CHCR_TS |
222 static void usb_dmac_chan_start_desc(struct usb_dmac_chan *chan)
226 vd = vchan_next_desc(&chan->vc);
228 chan->desc = NULL;
239 chan->desc = to_usb_dmac_desc(vd);
240 chan->desc->sg_index = 0;
241 usb_dmac_chan_start_sg(chan, 0);
263 static int usb_dmac_desc_alloc(struct usb_dmac_chan *chan, unsigned int sg_len,
276 spin_lock_irqsave(&chan->vc.lock, flags);
277 list_add_tail(&desc->node, &chan->desc_freed);
278 spin_unlock_irqrestore(&chan->vc.lock, flags);
283 static void usb_dmac_desc_free(struct usb_dmac_chan *chan)
288 list_splice_init(&chan->desc_freed, &list);
289 list_splice_init(&chan->desc_got, &list);
295 chan->descs_allocated = 0;
298 static struct usb_dmac_desc *usb_dmac_desc_get(struct usb_dmac_chan *chan,
305 spin_lock_irqsave(&chan->vc.lock, flags);
306 list_for_each_entry(desc, &chan->desc_freed, node) {
308 list_move_tail(&desc->node, &chan->desc_got);
309 spin_unlock_irqrestore(&chan->vc.lock, flags);
313 spin_unlock_irqrestore(&chan->vc.lock, flags);
316 if (!usb_dmac_desc_alloc(chan, sg_len, gfp)) {
318 spin_lock_irqsave(&chan->vc.lock, flags);
319 desc = list_last_entry(&chan->desc_freed, struct usb_dmac_desc,
321 list_move_tail(&desc->node, &chan->desc_got);
322 spin_unlock_irqrestore(&chan->vc.lock, flags);
329 static void usb_dmac_desc_put(struct usb_dmac_chan *chan,
334 spin_lock_irqsave(&chan->vc.lock, flags);
335 list_move_tail(&desc->node, &chan->desc_freed);
336 spin_unlock_irqrestore(&chan->vc.lock, flags);
345 struct dma_chan *chan = &uchan->vc.chan;
346 struct usb_dmac *dmac = to_usb_dmac(chan->device);
362 static void usb_dmac_chan_halt(struct usb_dmac_chan *chan)
364 u32 chcr = usb_dmac_chan_read(chan, USB_DMACHCR);
367 usb_dmac_chan_write(chan, USB_DMACHCR, chcr);
369 usb_dmac_soft_reset(chan);
381 static int usb_dmac_alloc_chan_resources(struct dma_chan *chan)
383 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
396 return pm_runtime_get_sync(chan->device->dev);
399 static void usb_dmac_free_chan_resources(struct dma_chan *chan)
401 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
412 pm_runtime_put(chan->device->dev);
416 usb_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
420 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
426 dev_warn(chan->device->dev,
445 static int usb_dmac_chan_terminate_all(struct dma_chan *chan)
447 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
467 static unsigned int usb_dmac_get_current_residue(struct usb_dmac_chan *chan,
480 residue -= usb_dmac_chan_read(chan, USB_DMADAR) - mem_addr;
482 residue -= usb_dmac_chan_read(chan, USB_DMASAR) - mem_addr;
487 static u32 usb_dmac_chan_get_residue_if_complete(struct usb_dmac_chan *chan,
493 list_for_each_entry_reverse(desc, &chan->desc_freed, node) {
503 static u32 usb_dmac_chan_get_residue(struct usb_dmac_chan *chan,
508 struct usb_dmac_desc *desc = chan->desc;
512 vd = vchan_find_desc(&chan->vc, cookie);
523 residue += usb_dmac_get_current_residue(chan, desc, desc->sg_index);
528 static enum dma_status usb_dmac_tx_status(struct dma_chan *chan,
532 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
537 status = dma_cookie_status(chan, cookie, txstate);
554 static void usb_dmac_issue_pending(struct dma_chan *chan)
556 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
568 struct usb_dmac_chan *chan = to_usb_dmac_chan(vd->tx.chan);
570 usb_dmac_desc_put(chan, desc);
577 static void usb_dmac_isr_transfer_end(struct usb_dmac_chan *chan)
579 struct usb_dmac_desc *desc = chan->desc;
584 usb_dmac_chan_start_sg(chan, desc->sg_index);
586 desc->residue = usb_dmac_get_current_residue(chan, desc,
594 usb_dmac_chan_start_desc(chan);
600 struct usb_dmac_chan *chan = dev;
606 spin_lock(&chan->vc.lock);
608 chcr = usb_dmac_chan_read(chan, USB_DMACHCR);
622 usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask);
625 usb_dmac_isr_transfer_end(chan);
627 spin_unlock(&chan->vc.lock);
636 static bool usb_dmac_chan_filter(struct dma_chan *chan, void *arg)
638 struct usb_dmac_chan *uchan = to_usb_dmac_chan(chan);
651 struct dma_chan *chan;
661 chan = __dma_request_channel(&mask, usb_dmac_chan_filter, dma_spec,
663 if (!chan)
666 return chan;