Lines Matching refs:plchan

315 static int pl08x_request_mux(struct pl08x_dma_chan *plchan)  in pl08x_request_mux()  argument
317 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_request_mux()
320 if (plchan->mux_use++ == 0 && pd->get_xfer_signal) { in pl08x_request_mux()
321 ret = pd->get_xfer_signal(plchan->cd); in pl08x_request_mux()
323 plchan->mux_use = 0; in pl08x_request_mux()
327 plchan->signal = ret; in pl08x_request_mux()
332 static void pl08x_release_mux(struct pl08x_dma_chan *plchan) in pl08x_release_mux() argument
334 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_release_mux()
336 if (plchan->signal >= 0) { in pl08x_release_mux()
337 WARN_ON(plchan->mux_use == 0); in pl08x_release_mux()
339 if (--plchan->mux_use == 0 && pd->put_xfer_signal) { in pl08x_release_mux()
340 pd->put_xfer_signal(plchan->cd, plchan->signal); in pl08x_release_mux()
341 plchan->signal = -1; in pl08x_release_mux()
394 static void pl08x_start_next_txd(struct pl08x_dma_chan *plchan) in pl08x_start_next_txd() argument
396 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_start_next_txd()
397 struct pl08x_phy_chan *phychan = plchan->phychan; in pl08x_start_next_txd()
398 struct virt_dma_desc *vd = vchan_next_desc(&plchan->vc); in pl08x_start_next_txd()
404 plchan->at = txd; in pl08x_start_next_txd()
526 static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan) in pl08x_getbytes_chan() argument
528 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_getbytes_chan()
537 ch = plchan->phychan; in pl08x_getbytes_chan()
538 txd = plchan->at; in pl08x_getbytes_chan()
642 static void pl08x_phy_alloc_and_start(struct pl08x_dma_chan *plchan) in pl08x_phy_alloc_and_start() argument
644 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_alloc_and_start()
647 ch = pl08x_get_phy_channel(pl08x, plchan); in pl08x_phy_alloc_and_start()
649 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name); in pl08x_phy_alloc_and_start()
650 plchan->state = PL08X_CHAN_WAITING; in pl08x_phy_alloc_and_start()
655 ch->id, plchan->name); in pl08x_phy_alloc_and_start()
657 plchan->phychan = ch; in pl08x_phy_alloc_and_start()
658 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_alloc_and_start()
659 pl08x_start_next_txd(plchan); in pl08x_phy_alloc_and_start()
663 struct pl08x_dma_chan *plchan) in pl08x_phy_reassign_start() argument
665 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_reassign_start()
668 ch->id, plchan->name); in pl08x_phy_reassign_start()
675 ch->serving = plchan; in pl08x_phy_reassign_start()
676 plchan->phychan = ch; in pl08x_phy_reassign_start()
677 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_reassign_start()
678 pl08x_start_next_txd(plchan); in pl08x_phy_reassign_start()
685 static void pl08x_phy_free(struct pl08x_dma_chan *plchan) in pl08x_phy_free() argument
687 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_free()
709 pl08x_terminate_phy_chan(pl08x, plchan->phychan); in pl08x_phy_free()
722 pl08x_phy_reassign_start(plchan->phychan, next); in pl08x_phy_free()
730 pl08x_put_phy_channel(pl08x, plchan->phychan); in pl08x_phy_free()
733 plchan->phychan = NULL; in pl08x_phy_free()
734 plchan->state = PL08X_CHAN_IDLE; in pl08x_phy_free()
1173 struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan); in pl08x_desc_free() local
1177 pl08x_release_mux(plchan); in pl08x_desc_free()
1179 pl08x_free_txd(plchan->host, txd); in pl08x_desc_free()
1183 struct pl08x_dma_chan *plchan) in pl08x_free_txd_list() argument
1187 vchan_get_all_descriptors(&plchan->vc, &head); in pl08x_free_txd_list()
1188 vchan_dma_desc_free_list(&plchan->vc, &head); in pl08x_free_txd_list()
1216 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_dma_tx_status() local
1231 if (plchan->state == PL08X_CHAN_PAUSED) in pl08x_dma_tx_status()
1236 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1239 vd = vchan_find_desc(&plchan->vc, cookie); in pl08x_dma_tx_status()
1248 bytes = pl08x_getbytes_chan(plchan); in pl08x_dma_tx_status()
1251 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1259 if (plchan->state == PL08X_CHAN_PAUSED && ret == DMA_IN_PROGRESS) in pl08x_dma_tx_status()
1359 static u32 pl08x_get_cctl(struct pl08x_dma_chan *plchan, in pl08x_get_cctl() argument
1376 if (plchan->cd->single) in pl08x_get_cctl()
1392 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_issue_pending() local
1395 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_issue_pending()
1396 if (vchan_issue_pending(&plchan->vc)) { in pl08x_issue_pending()
1397 if (!plchan->phychan && plchan->state != PL08X_CHAN_WAITING) in pl08x_issue_pending()
1398 pl08x_phy_alloc_and_start(plchan); in pl08x_issue_pending()
1400 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_issue_pending()
1403 static struct pl08x_txd *pl08x_get_txd(struct pl08x_dma_chan *plchan) in pl08x_get_txd() argument
1424 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_memcpy() local
1425 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_memcpy()
1430 txd = pl08x_get_txd(plchan); in pl08x_prep_dma_memcpy()
1462 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_memcpy()
1468 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_memcpy()
1476 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_init_txd() local
1477 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_init_txd()
1484 txd = pl08x_get_txd(plchan); in pl08x_init_txd()
1497 *slave_addr = plchan->cfg.dst_addr; in pl08x_init_txd()
1498 addr_width = plchan->cfg.dst_addr_width; in pl08x_init_txd()
1499 maxburst = plchan->cfg.dst_maxburst; in pl08x_init_txd()
1501 dst_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1504 *slave_addr = plchan->cfg.src_addr; in pl08x_init_txd()
1505 addr_width = plchan->cfg.src_addr_width; in pl08x_init_txd()
1506 maxburst = plchan->cfg.src_maxburst; in pl08x_init_txd()
1507 src_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1516 cctl |= pl08x_get_cctl(plchan, addr_width, maxburst); in pl08x_init_txd()
1526 if (plchan->cfg.device_fc) in pl08x_init_txd()
1535 ret = pl08x_request_mux(plchan); in pl08x_init_txd()
1540 plchan->name); in pl08x_init_txd()
1545 plchan->signal, plchan->name); in pl08x_init_txd()
1549 txd->ccfg |= plchan->signal << PL080_CONFIG_DST_SEL_SHIFT; in pl08x_init_txd()
1551 txd->ccfg |= plchan->signal << PL080_CONFIG_SRC_SEL_SHIFT; in pl08x_init_txd()
1587 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_slave_sg() local
1588 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_slave_sg()
1595 __func__, sg_dma_len(sgl), plchan->name); in pl08x_prep_slave_sg()
1606 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
1614 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_slave_sg()
1616 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
1621 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_slave_sg()
1629 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_cyclic() local
1630 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_cyclic()
1639 plchan->name); in pl08x_prep_dma_cyclic()
1651 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
1657 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_cyclic()
1659 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
1664 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_cyclic()
1670 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_config() local
1671 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_config()
1673 if (!plchan->slave) in pl08x_config()
1688 plchan->cfg = *config; in pl08x_config()
1695 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_terminate_all() local
1696 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_terminate_all()
1699 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_terminate_all()
1700 if (!plchan->phychan && !plchan->at) { in pl08x_terminate_all()
1701 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
1705 plchan->state = PL08X_CHAN_IDLE; in pl08x_terminate_all()
1707 if (plchan->phychan) { in pl08x_terminate_all()
1712 pl08x_phy_free(plchan); in pl08x_terminate_all()
1715 if (plchan->at) { in pl08x_terminate_all()
1716 pl08x_desc_free(&plchan->at->vd); in pl08x_terminate_all()
1717 plchan->at = NULL; in pl08x_terminate_all()
1720 pl08x_free_txd_list(pl08x, plchan); in pl08x_terminate_all()
1722 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
1729 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_pause() local
1736 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_pause()
1737 if (!plchan->phychan && !plchan->at) { in pl08x_pause()
1738 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
1742 pl08x_pause_phy_chan(plchan->phychan); in pl08x_pause()
1743 plchan->state = PL08X_CHAN_PAUSED; in pl08x_pause()
1745 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
1752 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_resume() local
1759 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_resume()
1760 if (!plchan->phychan && !plchan->at) { in pl08x_resume()
1761 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
1765 pl08x_resume_phy_chan(plchan->phychan); in pl08x_resume()
1766 plchan->state = PL08X_CHAN_RUNNING; in pl08x_resume()
1768 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
1775 struct pl08x_dma_chan *plchan; in pl08x_filter_id() local
1782 plchan = to_pl08x_chan(chan); in pl08x_filter_id()
1785 if (!strcmp(plchan->name, name)) in pl08x_filter_id()
1829 struct pl08x_dma_chan *plchan = phychan->serving; in pl08x_irq() local
1832 if (!plchan) { in pl08x_irq()
1839 spin_lock(&plchan->vc.lock); in pl08x_irq()
1840 tx = plchan->at; in pl08x_irq()
1844 plchan->at = NULL; in pl08x_irq()
1849 pl08x_release_mux(plchan); in pl08x_irq()
1857 if (vchan_next_desc(&plchan->vc)) in pl08x_irq()
1858 pl08x_start_next_txd(plchan); in pl08x_irq()
1860 pl08x_phy_free(plchan); in pl08x_irq()
1862 spin_unlock(&plchan->vc.lock); in pl08x_irq()