Lines Matching refs:chan
139 container_of(dchan, struct pxad_chan, vc.chan)
151 dev_vdbg(&phy->vchan->vc.chan.dev->device, \
159 dev_vdbg(&phy->vchan->vc.chan.dev->device, \
166 dev_vdbg(&phy->vchan->vc.chan.dev->device, \
178 static bool pxad_filter_fn(struct dma_chan *chan, void *param);
325 struct dentry *chan;
329 chan = debugfs_create_dir(chan_name, chandir);
332 debugfs_create_file("state", 0400, chan, dt, &chan_state_fops);
333 debugfs_create_file("descriptors", 0400, chan, dt, &descriptors_fops);
334 debugfs_create_file("requesters", 0400, chan, dt, &requester_chan_fops);
336 return chan;
372 struct pxad_device *pdev = to_pxad_dev(pchan->vc.chan.device);
400 dev_dbg(&pchan->vc.chan.dev->device,
407 static void pxad_free_phy(struct pxad_chan *chan)
409 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
413 dev_dbg(&chan->vc.chan.dev->device,
415 if (!chan->phy)
419 if (chan->drcmr <= pdev->nr_requestors) {
420 reg = pxad_drcmr(chan->drcmr);
421 writel_relaxed(0, chan->phy->base + reg);
425 chan->phy->vchan = NULL;
426 chan->phy = NULL;
430 static bool is_chan_running(struct pxad_chan *chan)
433 struct pxad_phy *phy = chan->phy;
441 static bool is_running_chan_misaligned(struct pxad_chan *chan)
445 BUG_ON(!chan->phy);
446 dalgn = phy_readl_relaxed(chan->phy, DALGN);
447 return dalgn & (BIT(chan->phy->idx));
458 dev_dbg(&phy->vchan->vc.chan.dev->device,
462 pdev = to_pxad_dev(phy->vchan->vc.chan.device);
487 dev_dbg(&phy->vchan->vc.chan.dev->device,
492 static void pxad_launch_chan(struct pxad_chan *chan,
495 dev_dbg(&chan->vc.chan.dev->device,
497 if (!chan->phy) {
498 chan->phy = lookup_phy(chan);
499 if (!chan->phy) {
500 dev_dbg(&chan->vc.chan.dev->device,
505 chan->bus_error = 0;
511 phy_writel(chan->phy, desc->first, DDADR);
512 phy_enable(chan->phy, chan->misaligned);
513 wake_up(&chan->wq_state);
558 struct pxad_chan *chan = to_pxad_chan(&vc->chan);
567 if (is_chan_running(chan)) {
570 if (!is_running_chan_misaligned(chan) &&
577 if (is_chan_running(chan) || is_desc_completed(vd))
596 dev_warn(&phy->vchan->vc.chan.dev->device,
597 "%s(chan=%p): PXA_DCSR_BUSERR\n",
606 struct pxad_chan *chan = phy->vchan;
612 BUG_ON(!chan);
618 spin_lock(&chan->vc.lock);
619 list_for_each_entry_safe(vd, tmp, &chan->vc.desc_issued, node) {
621 dev_dbg(&chan->vc.chan.dev->device,
639 chan->bus_error = last_started;
643 if (!chan->bus_error && dcsr & PXA_DCSR_STOPSTATE) {
644 dev_dbg(&chan->vc.chan.dev->device,
647 list_empty(&chan->vc.desc_submitted),
648 list_empty(&chan->vc.desc_issued));
651 if (list_empty(&chan->vc.desc_issued)) {
652 chan->misaligned =
653 !list_empty(&chan->vc.desc_submitted);
655 vd = list_first_entry(&chan->vc.desc_issued,
657 pxad_launch_chan(chan, to_pxad_sw_desc(vd));
660 spin_unlock(&chan->vc.lock);
661 wake_up(&chan->wq_state);
686 struct pxad_chan *chan = to_pxad_chan(dchan);
687 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
689 if (chan->desc_pool)
692 chan->desc_pool = dma_pool_create(dma_chan_name(dchan),
697 if (!chan->desc_pool) {
698 dev_err(&chan->vc.chan.dev->device,
709 struct pxad_chan *chan = to_pxad_chan(dchan);
711 vchan_free_chan_resources(&chan->vc);
712 dma_pool_destroy(chan->desc_pool);
713 chan->desc_pool = NULL;
715 chan->drcmr = U32_MAX;
716 chan->prio = PXAD_PRIO_LOWEST;
738 pxad_alloc_desc(struct pxad_chan *chan, unsigned int nb_hw_desc)
748 sw_desc->desc_pool = chan->desc_pool;
754 dev_err(&chan->vc.chan.dev->device,
775 struct virt_dma_chan *vc = to_virt_chan(tx->chan);
776 struct pxad_chan *chan = to_pxad_chan(&vc->chan);
789 dev_dbg(&chan->vc.chan.dev->device,
807 if (chan->misaligned || !to_pxad_sw_desc(vd)->misaligned)
812 dev_dbg(&chan->vc.chan.dev->device,
816 chan->misaligned |= to_pxad_sw_desc(vd)->misaligned;
825 struct pxad_chan *chan = to_pxad_chan(dchan);
829 spin_lock_irqsave(&chan->vc.lock, flags);
830 if (list_empty(&chan->vc.desc_submitted))
833 vd_first = list_first_entry(&chan->vc.desc_submitted,
835 dev_dbg(&chan->vc.chan.dev->device,
838 vchan_issue_pending(&chan->vc);
839 if (!pxad_try_hotchain(&chan->vc, vd_first))
840 pxad_launch_chan(chan, to_pxad_sw_desc(vd_first));
842 spin_unlock_irqrestore(&chan->vc.lock, flags);
850 struct pxad_chan *chan = container_of(vc, struct pxad_chan, vc);
855 dev_dbg(&chan->vc.chan.dev->device,
863 static void pxad_get_config(struct pxad_chan *chan,
869 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
873 maxburst = chan->cfg.src_maxburst;
874 width = chan->cfg.src_addr_width;
875 dev_addr = chan->cfg.src_addr;
878 if (chan->drcmr <= pdev->nr_requestors)
882 maxburst = chan->cfg.dst_maxburst;
883 width = chan->cfg.dst_addr_width;
884 dev_addr = chan->cfg.dst_addr;
887 if (chan->drcmr <= pdev->nr_requestors)
894 dev_dbg(&chan->vc.chan.dev->device,
918 struct pxad_chan *chan = to_pxad_chan(dchan);
928 dev_dbg(&chan->vc.chan.dev->device,
932 pxad_get_config(chan, DMA_MEM_TO_MEM, &dcmd, NULL, NULL);
935 sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
957 return pxad_tx_prep(&chan->vc, &sw_desc->vd, flags);
965 struct pxad_chan *chan = to_pxad_chan(dchan);
976 pxad_get_config(chan, dir, &dcmd, &dsadr, &dtadr);
977 dev_dbg(&chan->vc.chan.dev->device,
982 sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
1007 return pxad_tx_prep(&chan->vc, &sw_desc->vd, flags);
1015 struct pxad_chan *chan = to_pxad_chan(dchan);
1025 dev_err(&chan->vc.chan.dev->device,
1034 pxad_get_config(chan, dir, &dcmd, &dsadr, &dtadr);
1036 dev_dbg(&chan->vc.chan.dev->device,
1042 sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
1060 return pxad_tx_prep(&chan->vc, &sw_desc->vd, flags);
1066 struct pxad_chan *chan = to_pxad_chan(dchan);
1071 chan->cfg = *cfg;
1077 struct pxad_chan *chan = to_pxad_chan(dchan);
1078 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
1084 dev_dbg(&chan->vc.chan.dev->device,
1085 "%s(): vchan %p: terminate all\n", __func__, &chan->vc);
1087 spin_lock_irqsave(&chan->vc.lock, flags);
1088 vchan_get_all_descriptors(&chan->vc, &head);
1091 dev_dbg(&chan->vc.chan.dev->device,
1096 phy = chan->phy;
1098 phy_disable(chan->phy);
1099 pxad_free_phy(chan);
1100 chan->phy = NULL;
1105 spin_unlock_irqrestore(&chan->vc.lock, flags);
1106 vchan_dma_desc_free_list(&chan->vc, &head);
1111 static unsigned int pxad_residue(struct pxad_chan *chan,
1126 if (!chan->phy)
1129 spin_lock_irqsave(&chan->vc.lock, flags);
1131 vd = vchan_find_desc(&chan->vc, cookie);
1137 curr = phy_readl_relaxed(chan->phy, DSADR);
1139 curr = phy_readl_relaxed(chan->phy, DTADR);
1180 spin_unlock_irqrestore(&chan->vc.lock, flags);
1181 dev_dbg(&chan->vc.chan.dev->device,
1191 struct pxad_chan *chan = to_pxad_chan(dchan);
1194 if (cookie == chan->bus_error)
1199 dma_set_residue(txstate, pxad_residue(chan, cookie));
1206 struct pxad_chan *chan = to_pxad_chan(dchan);
1208 wait_event(chan->wq_state, !is_chan_running(chan));
1209 vchan_synchronize(&chan->vc);
1217 vc.chan.device_node) {
1218 list_del(&c->vc.chan.device_node);
1286 struct dma_chan *chan;
1288 chan = dma_get_any_slave_channel(&d->slave);
1289 if (!chan)
1292 to_pxad_chan(chan)->drcmr = dma_spec->args[0];
1293 to_pxad_chan(chan)->prio = dma_spec->args[1];
1295 return chan;
1449 static bool pxad_filter_fn(struct dma_chan *chan, void *param)
1451 struct pxad_chan *c = to_pxad_chan(chan);
1454 if (chan->device->dev->driver != &pxad_driver.driver)