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;
613 BUG_ON(!chan);
619 spin_lock_irqsave(&chan->vc.lock, flags);
620 list_for_each_entry_safe(vd, tmp, &chan->vc.desc_issued, node) {
622 dev_dbg(&chan->vc.chan.dev->device,
640 chan->bus_error = last_started;
644 if (!chan->bus_error && dcsr & PXA_DCSR_STOPSTATE) {
645 dev_dbg(&chan->vc.chan.dev->device,
648 list_empty(&chan->vc.desc_submitted),
649 list_empty(&chan->vc.desc_issued));
652 if (list_empty(&chan->vc.desc_issued)) {
653 chan->misaligned =
654 !list_empty(&chan->vc.desc_submitted);
656 vd = list_first_entry(&chan->vc.desc_issued,
658 pxad_launch_chan(chan, to_pxad_sw_desc(vd));
661 spin_unlock_irqrestore(&chan->vc.lock, flags);
662 wake_up(&chan->wq_state);
687 struct pxad_chan *chan = to_pxad_chan(dchan);
688 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
690 if (chan->desc_pool)
693 chan->desc_pool = dma_pool_create(dma_chan_name(dchan),
698 if (!chan->desc_pool) {
699 dev_err(&chan->vc.chan.dev->device,
710 struct pxad_chan *chan = to_pxad_chan(dchan);
712 vchan_free_chan_resources(&chan->vc);
713 dma_pool_destroy(chan->desc_pool);
714 chan->desc_pool = NULL;
716 chan->drcmr = U32_MAX;
717 chan->prio = PXAD_PRIO_LOWEST;
739 pxad_alloc_desc(struct pxad_chan *chan, unsigned int nb_hw_desc)
750 sw_desc->desc_pool = chan->desc_pool;
756 dev_err(&chan->vc.chan.dev->device,
777 struct virt_dma_chan *vc = to_virt_chan(tx->chan);
778 struct pxad_chan *chan = to_pxad_chan(&vc->chan);
791 dev_dbg(&chan->vc.chan.dev->device,
809 if (chan->misaligned || !to_pxad_sw_desc(vd)->misaligned)
814 dev_dbg(&chan->vc.chan.dev->device,
818 chan->misaligned |= to_pxad_sw_desc(vd)->misaligned;
827 struct pxad_chan *chan = to_pxad_chan(dchan);
831 spin_lock_irqsave(&chan->vc.lock, flags);
832 if (list_empty(&chan->vc.desc_submitted))
835 vd_first = list_first_entry(&chan->vc.desc_submitted,
837 dev_dbg(&chan->vc.chan.dev->device,
840 vchan_issue_pending(&chan->vc);
841 if (!pxad_try_hotchain(&chan->vc, vd_first))
842 pxad_launch_chan(chan, to_pxad_sw_desc(vd_first));
844 spin_unlock_irqrestore(&chan->vc.lock, flags);
852 struct pxad_chan *chan = container_of(vc, struct pxad_chan, vc);
857 dev_dbg(&chan->vc.chan.dev->device,
865 static void pxad_get_config(struct pxad_chan *chan,
871 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
875 maxburst = chan->cfg.src_maxburst;
876 width = chan->cfg.src_addr_width;
877 dev_addr = chan->cfg.src_addr;
880 if (chan->drcmr <= pdev->nr_requestors)
884 maxburst = chan->cfg.dst_maxburst;
885 width = chan->cfg.dst_addr_width;
886 dev_addr = chan->cfg.dst_addr;
889 if (chan->drcmr <= pdev->nr_requestors)
896 dev_dbg(&chan->vc.chan.dev->device,
920 struct pxad_chan *chan = to_pxad_chan(dchan);
930 dev_dbg(&chan->vc.chan.dev->device,
934 pxad_get_config(chan, DMA_MEM_TO_MEM, &dcmd, NULL, NULL);
937 sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
959 return pxad_tx_prep(&chan->vc, &sw_desc->vd, flags);
967 struct pxad_chan *chan = to_pxad_chan(dchan);
978 pxad_get_config(chan, dir, &dcmd, &dsadr, &dtadr);
979 dev_dbg(&chan->vc.chan.dev->device,
984 sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
1009 return pxad_tx_prep(&chan->vc, &sw_desc->vd, flags);
1017 struct pxad_chan *chan = to_pxad_chan(dchan);
1027 dev_err(&chan->vc.chan.dev->device,
1036 pxad_get_config(chan, dir, &dcmd, &dsadr, &dtadr);
1038 dev_dbg(&chan->vc.chan.dev->device,
1044 sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
1062 return pxad_tx_prep(&chan->vc, &sw_desc->vd, flags);
1068 struct pxad_chan *chan = to_pxad_chan(dchan);
1073 chan->cfg = *cfg;
1079 struct pxad_chan *chan = to_pxad_chan(dchan);
1080 struct pxad_device *pdev = to_pxad_dev(chan->vc.chan.device);
1086 dev_dbg(&chan->vc.chan.dev->device,
1087 "%s(): vchan %p: terminate all\n", __func__, &chan->vc);
1089 spin_lock_irqsave(&chan->vc.lock, flags);
1090 vchan_get_all_descriptors(&chan->vc, &head);
1093 dev_dbg(&chan->vc.chan.dev->device,
1098 phy = chan->phy;
1100 phy_disable(chan->phy);
1101 pxad_free_phy(chan);
1102 chan->phy = NULL;
1107 spin_unlock_irqrestore(&chan->vc.lock, flags);
1108 vchan_dma_desc_free_list(&chan->vc, &head);
1113 static unsigned int pxad_residue(struct pxad_chan *chan,
1128 if (!chan->phy)
1131 spin_lock_irqsave(&chan->vc.lock, flags);
1133 vd = vchan_find_desc(&chan->vc, cookie);
1139 curr = phy_readl_relaxed(chan->phy, DSADR);
1141 curr = phy_readl_relaxed(chan->phy, DTADR);
1182 spin_unlock_irqrestore(&chan->vc.lock, flags);
1183 dev_dbg(&chan->vc.chan.dev->device,
1193 struct pxad_chan *chan = to_pxad_chan(dchan);
1196 if (cookie == chan->bus_error)
1201 dma_set_residue(txstate, pxad_residue(chan, cookie));
1208 struct pxad_chan *chan = to_pxad_chan(dchan);
1210 wait_event(chan->wq_state, !is_chan_running(chan));
1211 vchan_synchronize(&chan->vc);
1219 vc.chan.device_node) {
1220 list_del(&c->vc.chan.device_node);
1288 struct dma_chan *chan;
1290 chan = dma_get_any_slave_channel(&d->slave);
1291 if (!chan)
1294 to_pxad_chan(chan)->drcmr = dma_spec->args[0];
1295 to_pxad_chan(chan)->prio = dma_spec->args[1];
1297 return chan;
1446 static bool pxad_filter_fn(struct dma_chan *chan, void *param)
1448 struct pxad_chan *c = to_pxad_chan(chan);
1451 if (chan->device->dev->driver != &pxad_driver.driver)