Lines Matching refs:echan
171 struct edma_chan *echan; member
422 static void edma_set_chmap(struct edma_chan *echan, int slot) in edma_set_chmap() argument
424 struct edma_cc *ecc = echan->ecc; in edma_set_chmap()
425 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_set_chmap()
433 static void edma_setup_interrupt(struct edma_chan *echan, bool enable) in edma_setup_interrupt() argument
435 struct edma_cc *ecc = echan->ecc; in edma_setup_interrupt()
436 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_setup_interrupt()
577 static void edma_start(struct edma_chan *echan) in edma_start() argument
579 struct edma_cc *ecc = echan->ecc; in edma_start()
580 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_start()
584 if (!echan->hw_triggered) { in edma_start()
604 static void edma_stop(struct edma_chan *echan) in edma_stop() argument
606 struct edma_cc *ecc = echan->ecc; in edma_stop()
607 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_stop()
631 static void edma_pause(struct edma_chan *echan) in edma_pause() argument
633 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_pause()
636 edma_shadow0_write_array(echan->ecc, SH_EECR, channel >> 5, mask); in edma_pause()
640 static void edma_resume(struct edma_chan *echan) in edma_resume() argument
642 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_resume()
645 edma_shadow0_write_array(echan->ecc, SH_EESR, channel >> 5, mask); in edma_resume()
648 static void edma_trigger_channel(struct edma_chan *echan) in edma_trigger_channel() argument
650 struct edma_cc *ecc = echan->ecc; in edma_trigger_channel()
651 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_trigger_channel()
660 static void edma_clean_channel(struct edma_chan *echan) in edma_clean_channel() argument
662 struct edma_cc *ecc = echan->ecc; in edma_clean_channel()
663 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_clean_channel()
677 static void edma_assign_channel_eventq(struct edma_chan *echan, in edma_assign_channel_eventq() argument
680 struct edma_cc *ecc = echan->ecc; in edma_assign_channel_eventq()
681 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_assign_channel_eventq()
695 static int edma_alloc_channel(struct edma_chan *echan, in edma_alloc_channel() argument
698 struct edma_cc *ecc = echan->ecc; in edma_alloc_channel()
699 int channel = EDMA_CHAN_SLOT(echan->ch_num); in edma_alloc_channel()
705 edma_stop(echan); in edma_alloc_channel()
707 edma_setup_interrupt(echan, true); in edma_alloc_channel()
709 edma_assign_channel_eventq(echan, eventq_no); in edma_alloc_channel()
714 static void edma_free_channel(struct edma_chan *echan) in edma_free_channel() argument
717 edma_stop(echan); in edma_free_channel()
719 edma_setup_interrupt(echan, false); in edma_free_channel()
743 static void edma_execute(struct edma_chan *echan) in edma_execute() argument
745 struct edma_cc *ecc = echan->ecc; in edma_execute()
748 struct device *dev = echan->vchan.chan.device->dev; in edma_execute()
751 if (!echan->edesc) { in edma_execute()
753 vdesc = vchan_next_desc(&echan->vchan); in edma_execute()
757 echan->edesc = to_edma_desc(&vdesc->tx); in edma_execute()
760 edesc = echan->edesc; in edma_execute()
770 edma_write_slot(ecc, echan->slot[i], &edesc->pset[j].param); in edma_execute()
784 j, echan->ch_num, echan->slot[i], in edma_execute()
795 edma_link(ecc, echan->slot[i], echan->slot[i + 1]); in edma_execute()
807 edma_link(ecc, echan->slot[nslots - 1], echan->slot[1]); in edma_execute()
809 edma_link(ecc, echan->slot[nslots - 1], in edma_execute()
810 echan->ecc->dummy_slot); in edma_execute()
813 if (echan->missed) { in edma_execute()
819 dev_dbg(dev, "missed event on channel %d\n", echan->ch_num); in edma_execute()
820 edma_clean_channel(echan); in edma_execute()
821 edma_stop(echan); in edma_execute()
822 edma_start(echan); in edma_execute()
823 edma_trigger_channel(echan); in edma_execute()
824 echan->missed = 0; in edma_execute()
827 echan->ch_num); in edma_execute()
828 edma_start(echan); in edma_execute()
831 echan->ch_num, edesc->processed); in edma_execute()
832 edma_resume(echan); in edma_execute()
838 struct edma_chan *echan = to_edma_chan(chan); in edma_terminate_all() local
842 spin_lock_irqsave(&echan->vchan.lock, flags); in edma_terminate_all()
849 if (echan->edesc) { in edma_terminate_all()
850 edma_stop(echan); in edma_terminate_all()
852 if (!echan->tc && echan->edesc->cyclic) in edma_terminate_all()
853 edma_assign_channel_eventq(echan, EVENTQ_DEFAULT); in edma_terminate_all()
858 edma_desc_free(&echan->edesc->vdesc); in edma_terminate_all()
859 echan->edesc = NULL; in edma_terminate_all()
862 vchan_get_all_descriptors(&echan->vchan, &head); in edma_terminate_all()
863 spin_unlock_irqrestore(&echan->vchan.lock, flags); in edma_terminate_all()
864 vchan_dma_desc_free_list(&echan->vchan, &head); in edma_terminate_all()
872 struct edma_chan *echan = to_edma_chan(chan); in edma_slave_config() local
878 memcpy(&echan->cfg, cfg, sizeof(echan->cfg)); in edma_slave_config()
885 struct edma_chan *echan = to_edma_chan(chan); in edma_dma_pause() local
887 if (!echan->edesc) in edma_dma_pause()
890 edma_pause(echan); in edma_dma_pause()
896 struct edma_chan *echan = to_edma_chan(chan); in edma_dma_resume() local
898 edma_resume(echan); in edma_dma_resume()
918 struct edma_chan *echan = to_edma_chan(chan); in edma_config_pset() local
1002 param->opt = EDMA_TCC(EDMA_CHAN_SLOT(echan->ch_num)); in edma_config_pset()
1030 struct edma_chan *echan = to_edma_chan(chan); in edma_prep_slave_sg() local
1039 if (unlikely(!echan || !sgl || !sg_len)) in edma_prep_slave_sg()
1043 src_addr = echan->cfg.src_addr; in edma_prep_slave_sg()
1044 dev_width = echan->cfg.src_addr_width; in edma_prep_slave_sg()
1045 burst = echan->cfg.src_maxburst; in edma_prep_slave_sg()
1047 dst_addr = echan->cfg.dst_addr; in edma_prep_slave_sg()
1048 dev_width = echan->cfg.dst_addr_width; in edma_prep_slave_sg()
1049 burst = echan->cfg.dst_maxburst; in edma_prep_slave_sg()
1070 edesc->echan = echan; in edma_prep_slave_sg()
1076 if (echan->slot[i] < 0) { in edma_prep_slave_sg()
1077 echan->slot[i] = in edma_prep_slave_sg()
1078 edma_alloc_slot(echan->ecc, EDMA_SLOT_ANY); in edma_prep_slave_sg()
1079 if (echan->slot[i] < 0) { in edma_prep_slave_sg()
1118 return vchan_tx_prep(&echan->vchan, &edesc->vdesc, tx_flags); in edma_prep_slave_sg()
1128 struct edma_chan *echan = to_edma_chan(chan); in edma_prep_dma_memcpy() local
1131 if (unlikely(!echan || !len)) in edma_prep_dma_memcpy()
1174 edesc->echan = echan; in edma_prep_dma_memcpy()
1193 if (echan->slot[1] < 0) { in edma_prep_dma_memcpy()
1194 echan->slot[1] = edma_alloc_slot(echan->ecc, in edma_prep_dma_memcpy()
1196 if (echan->slot[1] < 0) { in edma_prep_dma_memcpy()
1218 return vchan_tx_prep(&echan->vchan, &edesc->vdesc, tx_flags); in edma_prep_dma_memcpy()
1226 struct edma_chan *echan = to_edma_chan(chan); in edma_prep_dma_cyclic() local
1234 if (unlikely(!echan || !buf_len || !period_len)) in edma_prep_dma_cyclic()
1238 src_addr = echan->cfg.src_addr; in edma_prep_dma_cyclic()
1240 dev_width = echan->cfg.src_addr_width; in edma_prep_dma_cyclic()
1241 burst = echan->cfg.src_maxburst; in edma_prep_dma_cyclic()
1244 dst_addr = echan->cfg.dst_addr; in edma_prep_dma_cyclic()
1245 dev_width = echan->cfg.dst_addr_width; in edma_prep_dma_cyclic()
1246 burst = echan->cfg.dst_maxburst; in edma_prep_dma_cyclic()
1286 edesc->echan = echan; in edma_prep_dma_cyclic()
1289 __func__, echan->ch_num, nslots, period_len, buf_len); in edma_prep_dma_cyclic()
1293 if (echan->slot[i] < 0) { in edma_prep_dma_cyclic()
1294 echan->slot[i] = in edma_prep_dma_cyclic()
1295 edma_alloc_slot(echan->ecc, EDMA_SLOT_ANY); in edma_prep_dma_cyclic()
1296 if (echan->slot[i] < 0) { in edma_prep_dma_cyclic()
1336 i, echan->ch_num, echan->slot[i], in edma_prep_dma_cyclic()
1356 if (!echan->tc) in edma_prep_dma_cyclic()
1357 edma_assign_channel_eventq(echan, EVENTQ_0); in edma_prep_dma_cyclic()
1359 return vchan_tx_prep(&echan->vchan, &edesc->vdesc, tx_flags); in edma_prep_dma_cyclic()
1362 static void edma_completion_handler(struct edma_chan *echan) in edma_completion_handler() argument
1364 struct device *dev = echan->vchan.chan.device->dev; in edma_completion_handler()
1365 struct edma_desc *edesc = echan->edesc; in edma_completion_handler()
1370 spin_lock(&echan->vchan.lock); in edma_completion_handler()
1373 spin_unlock(&echan->vchan.lock); in edma_completion_handler()
1377 edma_stop(echan); in edma_completion_handler()
1379 echan->edesc = NULL; in edma_completion_handler()
1382 echan->ch_num); in edma_completion_handler()
1385 echan->ch_num); in edma_completion_handler()
1387 edma_pause(echan); in edma_completion_handler()
1394 edma_execute(echan); in edma_completion_handler()
1396 spin_unlock(&echan->vchan.lock); in edma_completion_handler()
1445 static void edma_error_handler(struct edma_chan *echan) in edma_error_handler() argument
1447 struct edma_cc *ecc = echan->ecc; in edma_error_handler()
1448 struct device *dev = echan->vchan.chan.device->dev; in edma_error_handler()
1451 if (!echan->edesc) in edma_error_handler()
1454 spin_lock(&echan->vchan.lock); in edma_error_handler()
1456 edma_read_slot(ecc, echan->slot[0], &p); in edma_error_handler()
1471 echan->missed = 1; in edma_error_handler()
1478 edma_clean_channel(echan); in edma_error_handler()
1479 edma_stop(echan); in edma_error_handler()
1480 edma_start(echan); in edma_error_handler()
1481 edma_trigger_channel(echan); in edma_error_handler()
1483 spin_unlock(&echan->vchan.lock); in edma_error_handler()
1592 struct edma_chan *echan = to_edma_chan(chan); in edma_alloc_chan_resources() local
1593 struct edma_cc *ecc = echan->ecc; in edma_alloc_chan_resources()
1598 if (echan->tc) { in edma_alloc_chan_resources()
1599 eventq_no = echan->tc->id; in edma_alloc_chan_resources()
1602 echan->tc = &ecc->tc_list[ecc->info->default_queue]; in edma_alloc_chan_resources()
1603 eventq_no = echan->tc->id; in edma_alloc_chan_resources()
1606 ret = edma_alloc_channel(echan, eventq_no); in edma_alloc_chan_resources()
1610 echan->slot[0] = edma_alloc_slot(ecc, echan->ch_num); in edma_alloc_chan_resources()
1611 if (echan->slot[0] < 0) { in edma_alloc_chan_resources()
1613 EDMA_CHAN_SLOT(echan->ch_num)); in edma_alloc_chan_resources()
1618 edma_set_chmap(echan, echan->slot[0]); in edma_alloc_chan_resources()
1619 echan->alloced = true; in edma_alloc_chan_resources()
1622 EDMA_CHAN_SLOT(echan->ch_num), chan->chan_id, in edma_alloc_chan_resources()
1623 echan->hw_triggered ? "HW" : "SW"); in edma_alloc_chan_resources()
1625 edma_tc_set_pm_state(echan->tc, true); in edma_alloc_chan_resources()
1630 edma_free_channel(echan); in edma_alloc_chan_resources()
1637 struct edma_chan *echan = to_edma_chan(chan); in edma_free_chan_resources() local
1638 struct device *dev = echan->ecc->dev; in edma_free_chan_resources()
1642 edma_stop(echan); in edma_free_chan_resources()
1644 vchan_free_chan_resources(&echan->vchan); in edma_free_chan_resources()
1648 if (echan->slot[i] >= 0) { in edma_free_chan_resources()
1649 edma_free_slot(echan->ecc, echan->slot[i]); in edma_free_chan_resources()
1650 echan->slot[i] = -1; in edma_free_chan_resources()
1655 edma_set_chmap(echan, echan->ecc->dummy_slot); in edma_free_chan_resources()
1658 if (echan->alloced) { in edma_free_chan_resources()
1659 edma_free_channel(echan); in edma_free_chan_resources()
1660 echan->alloced = false; in edma_free_chan_resources()
1663 edma_tc_set_pm_state(echan->tc, false); in edma_free_chan_resources()
1664 echan->tc = NULL; in edma_free_chan_resources()
1665 echan->hw_triggered = false; in edma_free_chan_resources()
1668 EDMA_CHAN_SLOT(echan->ch_num), chan->chan_id); in edma_free_chan_resources()
1674 struct edma_chan *echan = to_edma_chan(chan); in edma_issue_pending() local
1677 spin_lock_irqsave(&echan->vchan.lock, flags); in edma_issue_pending()
1678 if (vchan_issue_pending(&echan->vchan) && !echan->edesc) in edma_issue_pending()
1679 edma_execute(echan); in edma_issue_pending()
1680 spin_unlock_irqrestore(&echan->vchan.lock, flags); in edma_issue_pending()
1694 pos = edma_get_position(edesc->echan->ecc, edesc->echan->slot[0], dst); in edma_residue()
1736 struct edma_chan *echan = to_edma_chan(chan); in edma_tx_status() local
1745 spin_lock_irqsave(&echan->vchan.lock, flags); in edma_tx_status()
1746 if (echan->edesc && echan->edesc->vdesc.tx.cookie == cookie) in edma_tx_status()
1747 txstate->residue = edma_residue(echan->edesc); in edma_tx_status()
1748 else if ((vdesc = vchan_find_desc(&echan->vchan, cookie))) in edma_tx_status()
1750 spin_unlock_irqrestore(&echan->vchan.lock, flags); in edma_tx_status()
1839 struct edma_chan *echan = &ecc->slave_chans[i]; in edma_dma_init() local
1840 echan->ch_num = EDMA_CTLR_CHAN(ecc->id, i); in edma_dma_init()
1841 echan->ecc = ecc; in edma_dma_init()
1842 echan->vchan.desc_free = edma_desc_free; in edma_dma_init()
1845 vchan_init(&echan->vchan, m_ddev); in edma_dma_init()
1847 vchan_init(&echan->vchan, s_ddev); in edma_dma_init()
1849 INIT_LIST_HEAD(&echan->node); in edma_dma_init()
1851 echan->slot[j] = -1; in edma_dma_init()
2072 struct edma_chan *echan; in of_edma_xlate() local
2079 echan = &ecc->slave_chans[i]; in of_edma_xlate()
2080 if (echan->ch_num == dma_spec->args[0]) { in of_edma_xlate()
2081 chan = &echan->vchan.chan; in of_edma_xlate()
2089 if (echan->ecc->legacy_mode && dma_spec->args_count == 1) in of_edma_xlate()
2092 if (!echan->ecc->legacy_mode && dma_spec->args_count == 2 && in of_edma_xlate()
2093 dma_spec->args[1] < echan->ecc->num_tc) { in of_edma_xlate()
2094 echan->tc = &echan->ecc->tc_list[dma_spec->args[1]]; in of_edma_xlate()
2101 echan->hw_triggered = true; in of_edma_xlate()
2364 struct edma_chan *echan = ecc->slave_chans; in edma_pm_suspend() local
2368 if (echan[i].alloced) { in edma_pm_suspend()
2369 edma_setup_interrupt(&echan[i], false); in edma_pm_suspend()
2370 edma_tc_set_pm_state(echan[i].tc, false); in edma_pm_suspend()
2380 struct edma_chan *echan = ecc->slave_chans; in edma_pm_resume() local
2392 if (echan[i].alloced) { in edma_pm_resume()
2397 edma_setup_interrupt(&echan[i], true); in edma_pm_resume()
2400 edma_set_chmap(&echan[i], echan[i].slot[0]); in edma_pm_resume()
2402 edma_tc_set_pm_state(echan[i].tc, true); in edma_pm_resume()
2436 struct edma_chan *echan = to_edma_chan(chan); in edma_filter_fn() local
2438 if (ch_req == echan->ch_num) { in edma_filter_fn()
2440 echan->hw_triggered = true; in edma_filter_fn()