Lines Matching refs:plchan

317 static int pl08x_request_mux(struct pl08x_dma_chan *plchan)  in pl08x_request_mux()  argument
319 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_request_mux()
322 if (plchan->mux_use++ == 0 && pd->get_xfer_signal) { in pl08x_request_mux()
323 ret = pd->get_xfer_signal(plchan->cd); in pl08x_request_mux()
325 plchan->mux_use = 0; in pl08x_request_mux()
329 plchan->signal = ret; in pl08x_request_mux()
334 static void pl08x_release_mux(struct pl08x_dma_chan *plchan) in pl08x_release_mux() argument
336 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_release_mux()
338 if (plchan->signal >= 0) { in pl08x_release_mux()
339 WARN_ON(plchan->mux_use == 0); in pl08x_release_mux()
341 if (--plchan->mux_use == 0 && pd->put_xfer_signal) { in pl08x_release_mux()
342 pd->put_xfer_signal(plchan->cd, plchan->signal); in pl08x_release_mux()
343 plchan->signal = -1; in pl08x_release_mux()
396 static void pl08x_start_next_txd(struct pl08x_dma_chan *plchan) in pl08x_start_next_txd() argument
398 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_start_next_txd()
399 struct pl08x_phy_chan *phychan = plchan->phychan; in pl08x_start_next_txd()
400 struct virt_dma_desc *vd = vchan_next_desc(&plchan->vc); in pl08x_start_next_txd()
406 plchan->at = txd; in pl08x_start_next_txd()
528 static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan) in pl08x_getbytes_chan() argument
530 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_getbytes_chan()
539 ch = plchan->phychan; in pl08x_getbytes_chan()
540 txd = plchan->at; in pl08x_getbytes_chan()
644 static void pl08x_phy_alloc_and_start(struct pl08x_dma_chan *plchan) in pl08x_phy_alloc_and_start() argument
646 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_alloc_and_start()
649 ch = pl08x_get_phy_channel(pl08x, plchan); in pl08x_phy_alloc_and_start()
651 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name); in pl08x_phy_alloc_and_start()
652 plchan->state = PL08X_CHAN_WAITING; in pl08x_phy_alloc_and_start()
657 ch->id, plchan->name); in pl08x_phy_alloc_and_start()
659 plchan->phychan = ch; in pl08x_phy_alloc_and_start()
660 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_alloc_and_start()
661 pl08x_start_next_txd(plchan); in pl08x_phy_alloc_and_start()
665 struct pl08x_dma_chan *plchan) in pl08x_phy_reassign_start() argument
667 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_reassign_start()
670 ch->id, plchan->name); in pl08x_phy_reassign_start()
677 ch->serving = plchan; in pl08x_phy_reassign_start()
678 plchan->phychan = ch; in pl08x_phy_reassign_start()
679 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_reassign_start()
680 pl08x_start_next_txd(plchan); in pl08x_phy_reassign_start()
687 static void pl08x_phy_free(struct pl08x_dma_chan *plchan) in pl08x_phy_free() argument
689 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_free()
711 pl08x_terminate_phy_chan(pl08x, plchan->phychan); in pl08x_phy_free()
724 pl08x_phy_reassign_start(plchan->phychan, next); in pl08x_phy_free()
732 pl08x_put_phy_channel(pl08x, plchan->phychan); in pl08x_phy_free()
735 plchan->phychan = NULL; in pl08x_phy_free()
736 plchan->state = PL08X_CHAN_IDLE; in pl08x_phy_free()
1175 struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan); in pl08x_desc_free() local
1179 pl08x_release_mux(plchan); in pl08x_desc_free()
1181 pl08x_free_txd(plchan->host, txd); in pl08x_desc_free()
1185 struct pl08x_dma_chan *plchan) in pl08x_free_txd_list() argument
1189 vchan_get_all_descriptors(&plchan->vc, &head); in pl08x_free_txd_list()
1190 vchan_dma_desc_free_list(&plchan->vc, &head); in pl08x_free_txd_list()
1218 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_dma_tx_status() local
1233 if (plchan->state == PL08X_CHAN_PAUSED) in pl08x_dma_tx_status()
1238 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1241 vd = vchan_find_desc(&plchan->vc, cookie); in pl08x_dma_tx_status()
1250 bytes = pl08x_getbytes_chan(plchan); in pl08x_dma_tx_status()
1253 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1261 if (plchan->state == PL08X_CHAN_PAUSED && ret == DMA_IN_PROGRESS) in pl08x_dma_tx_status()
1361 static u32 pl08x_get_cctl(struct pl08x_dma_chan *plchan, in pl08x_get_cctl() argument
1378 if (plchan->cd->single) in pl08x_get_cctl()
1394 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_issue_pending() local
1397 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_issue_pending()
1398 if (vchan_issue_pending(&plchan->vc)) { in pl08x_issue_pending()
1399 if (!plchan->phychan && plchan->state != PL08X_CHAN_WAITING) in pl08x_issue_pending()
1400 pl08x_phy_alloc_and_start(plchan); in pl08x_issue_pending()
1402 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_issue_pending()
1405 static struct pl08x_txd *pl08x_get_txd(struct pl08x_dma_chan *plchan) in pl08x_get_txd() argument
1426 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_memcpy() local
1427 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_memcpy()
1432 txd = pl08x_get_txd(plchan); in pl08x_prep_dma_memcpy()
1464 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_memcpy()
1470 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_memcpy()
1478 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_init_txd() local
1479 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_init_txd()
1486 txd = pl08x_get_txd(plchan); in pl08x_init_txd()
1499 *slave_addr = plchan->cfg.dst_addr; in pl08x_init_txd()
1500 addr_width = plchan->cfg.dst_addr_width; in pl08x_init_txd()
1501 maxburst = plchan->cfg.dst_maxburst; in pl08x_init_txd()
1503 dst_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1506 *slave_addr = plchan->cfg.src_addr; in pl08x_init_txd()
1507 addr_width = plchan->cfg.src_addr_width; in pl08x_init_txd()
1508 maxburst = plchan->cfg.src_maxburst; in pl08x_init_txd()
1509 src_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1518 cctl |= pl08x_get_cctl(plchan, addr_width, maxburst); in pl08x_init_txd()
1528 if (plchan->cfg.device_fc) in pl08x_init_txd()
1537 ret = pl08x_request_mux(plchan); in pl08x_init_txd()
1542 plchan->name); in pl08x_init_txd()
1547 plchan->signal, plchan->name); in pl08x_init_txd()
1551 txd->ccfg |= plchan->signal << PL080_CONFIG_DST_SEL_SHIFT; in pl08x_init_txd()
1553 txd->ccfg |= plchan->signal << PL080_CONFIG_SRC_SEL_SHIFT; in pl08x_init_txd()
1589 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_slave_sg() local
1590 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_slave_sg()
1597 __func__, sg_dma_len(sgl), plchan->name); in pl08x_prep_slave_sg()
1608 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
1616 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_slave_sg()
1618 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
1623 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_slave_sg()
1631 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_cyclic() local
1632 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_cyclic()
1641 plchan->name); in pl08x_prep_dma_cyclic()
1653 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
1659 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_cyclic()
1661 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
1666 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_cyclic()
1672 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_config() local
1673 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_config()
1675 if (!plchan->slave) in pl08x_config()
1690 plchan->cfg = *config; in pl08x_config()
1697 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_terminate_all() local
1698 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_terminate_all()
1701 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_terminate_all()
1702 if (!plchan->phychan && !plchan->at) { in pl08x_terminate_all()
1703 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
1707 plchan->state = PL08X_CHAN_IDLE; in pl08x_terminate_all()
1709 if (plchan->phychan) { in pl08x_terminate_all()
1714 pl08x_phy_free(plchan); in pl08x_terminate_all()
1717 if (plchan->at) { in pl08x_terminate_all()
1718 pl08x_desc_free(&plchan->at->vd); in pl08x_terminate_all()
1719 plchan->at = NULL; in pl08x_terminate_all()
1722 pl08x_free_txd_list(pl08x, plchan); in pl08x_terminate_all()
1724 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
1731 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_pause() local
1738 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_pause()
1739 if (!plchan->phychan && !plchan->at) { in pl08x_pause()
1740 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
1744 pl08x_pause_phy_chan(plchan->phychan); in pl08x_pause()
1745 plchan->state = PL08X_CHAN_PAUSED; in pl08x_pause()
1747 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
1754 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_resume() local
1761 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_resume()
1762 if (!plchan->phychan && !plchan->at) { in pl08x_resume()
1763 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
1767 pl08x_resume_phy_chan(plchan->phychan); in pl08x_resume()
1768 plchan->state = PL08X_CHAN_RUNNING; in pl08x_resume()
1770 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
1777 struct pl08x_dma_chan *plchan; in pl08x_filter_id() local
1784 plchan = to_pl08x_chan(chan); in pl08x_filter_id()
1787 if (!strcmp(plchan->name, name)) in pl08x_filter_id()
1831 struct pl08x_dma_chan *plchan = phychan->serving; in pl08x_irq() local
1834 if (!plchan) { in pl08x_irq()
1841 spin_lock(&plchan->vc.lock); in pl08x_irq()
1842 tx = plchan->at; in pl08x_irq()
1846 plchan->at = NULL; in pl08x_irq()
1851 pl08x_release_mux(plchan); in pl08x_irq()
1859 if (vchan_next_desc(&plchan->vc)) in pl08x_irq()
1860 pl08x_start_next_txd(plchan); in pl08x_irq()
1862 pl08x_phy_free(plchan); in pl08x_irq()
1864 spin_unlock(&plchan->vc.lock); in pl08x_irq()