Lines Matching refs:plchan

343 static int pl08x_request_mux(struct pl08x_dma_chan *plchan)  in pl08x_request_mux()  argument
345 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_request_mux()
348 if (plchan->mux_use++ == 0 && pd->get_xfer_signal) { in pl08x_request_mux()
349 ret = pd->get_xfer_signal(plchan->cd); in pl08x_request_mux()
351 plchan->mux_use = 0; in pl08x_request_mux()
355 plchan->signal = ret; in pl08x_request_mux()
360 static void pl08x_release_mux(struct pl08x_dma_chan *plchan) in pl08x_release_mux() argument
362 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_release_mux()
364 if (plchan->signal >= 0) { in pl08x_release_mux()
365 WARN_ON(plchan->mux_use == 0); in pl08x_release_mux()
367 if (--plchan->mux_use == 0 && pd->put_xfer_signal) { in pl08x_release_mux()
368 pd->put_xfer_signal(plchan->cd, plchan->signal); in pl08x_release_mux()
369 plchan->signal = -1; in pl08x_release_mux()
537 static void pl08x_start_next_txd(struct pl08x_dma_chan *plchan) in pl08x_start_next_txd() argument
539 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_start_next_txd()
540 struct pl08x_phy_chan *phychan = plchan->phychan; in pl08x_start_next_txd()
541 struct virt_dma_desc *vd = vchan_next_desc(&plchan->vc); in pl08x_start_next_txd()
547 plchan->at = txd; in pl08x_start_next_txd()
763 static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan) in pl08x_getbytes_chan() argument
765 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_getbytes_chan()
774 ch = plchan->phychan; in pl08x_getbytes_chan()
775 txd = plchan->at; in pl08x_getbytes_chan()
869 static void pl08x_phy_alloc_and_start(struct pl08x_dma_chan *plchan) in pl08x_phy_alloc_and_start() argument
871 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_alloc_and_start()
874 ch = pl08x_get_phy_channel(pl08x, plchan); in pl08x_phy_alloc_and_start()
876 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name); in pl08x_phy_alloc_and_start()
877 plchan->state = PL08X_CHAN_WAITING; in pl08x_phy_alloc_and_start()
882 ch->id, plchan->name); in pl08x_phy_alloc_and_start()
884 plchan->phychan = ch; in pl08x_phy_alloc_and_start()
885 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_alloc_and_start()
886 pl08x_start_next_txd(plchan); in pl08x_phy_alloc_and_start()
890 struct pl08x_dma_chan *plchan) in pl08x_phy_reassign_start() argument
892 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_reassign_start()
895 ch->id, plchan->name); in pl08x_phy_reassign_start()
902 ch->serving = plchan; in pl08x_phy_reassign_start()
903 plchan->phychan = ch; in pl08x_phy_reassign_start()
904 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_reassign_start()
905 pl08x_start_next_txd(plchan); in pl08x_phy_reassign_start()
912 static void pl08x_phy_free(struct pl08x_dma_chan *plchan) in pl08x_phy_free() argument
914 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_free()
936 pl08x_terminate_phy_chan(pl08x, plchan->phychan); in pl08x_phy_free()
949 pl08x_phy_reassign_start(plchan->phychan, next); in pl08x_phy_free()
957 pl08x_put_phy_channel(pl08x, plchan->phychan); in pl08x_phy_free()
960 plchan->phychan = NULL; in pl08x_phy_free()
961 plchan->state = PL08X_CHAN_IDLE; in pl08x_phy_free()
1513 struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan); in pl08x_desc_free() local
1517 pl08x_release_mux(plchan); in pl08x_desc_free()
1519 pl08x_free_txd(plchan->host, txd); in pl08x_desc_free()
1523 struct pl08x_dma_chan *plchan) in pl08x_free_txd_list() argument
1527 vchan_get_all_descriptors(&plchan->vc, &head); in pl08x_free_txd_list()
1528 vchan_dma_desc_free_list(&plchan->vc, &head); in pl08x_free_txd_list()
1556 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_dma_tx_status() local
1571 if (plchan->state == PL08X_CHAN_PAUSED) in pl08x_dma_tx_status()
1576 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1579 vd = vchan_find_desc(&plchan->vc, cookie); in pl08x_dma_tx_status()
1588 bytes = pl08x_getbytes_chan(plchan); in pl08x_dma_tx_status()
1591 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1599 if (plchan->state == PL08X_CHAN_PAUSED && ret == DMA_IN_PROGRESS) in pl08x_dma_tx_status()
1710 static u32 pl08x_get_cctl(struct pl08x_dma_chan *plchan, in pl08x_get_cctl() argument
1727 if (plchan->cd->single) in pl08x_get_cctl()
1743 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_issue_pending() local
1746 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_issue_pending()
1747 if (vchan_issue_pending(&plchan->vc)) { in pl08x_issue_pending()
1748 if (!plchan->phychan && plchan->state != PL08X_CHAN_WAITING) in pl08x_issue_pending()
1749 pl08x_phy_alloc_and_start(plchan); in pl08x_issue_pending()
1751 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_issue_pending()
1754 static struct pl08x_txd *pl08x_get_txd(struct pl08x_dma_chan *plchan) in pl08x_get_txd() argument
1895 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_memcpy() local
1896 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_memcpy()
1901 txd = pl08x_get_txd(plchan); in pl08x_prep_dma_memcpy()
1929 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_memcpy()
1935 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_memcpy()
1943 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_init_txd() local
1944 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_init_txd()
1951 txd = pl08x_get_txd(plchan); in pl08x_init_txd()
1964 *slave_addr = plchan->cfg.dst_addr; in pl08x_init_txd()
1965 addr_width = plchan->cfg.dst_addr_width; in pl08x_init_txd()
1966 maxburst = plchan->cfg.dst_maxburst; in pl08x_init_txd()
1968 dst_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1971 *slave_addr = plchan->cfg.src_addr; in pl08x_init_txd()
1972 addr_width = plchan->cfg.src_addr_width; in pl08x_init_txd()
1973 maxburst = plchan->cfg.src_maxburst; in pl08x_init_txd()
1974 src_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1983 cctl |= pl08x_get_cctl(plchan, addr_width, maxburst); in pl08x_init_txd()
1993 if (plchan->cfg.device_fc) in pl08x_init_txd()
2004 ret = pl08x_request_mux(plchan); in pl08x_init_txd()
2009 plchan->name); in pl08x_init_txd()
2014 plchan->signal, plchan->name); in pl08x_init_txd()
2018 txd->ccfg |= plchan->signal << PL080_CONFIG_DST_SEL_SHIFT; in pl08x_init_txd()
2020 txd->ccfg |= plchan->signal << PL080_CONFIG_SRC_SEL_SHIFT; in pl08x_init_txd()
2056 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_slave_sg() local
2057 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_slave_sg()
2064 __func__, sg_dma_len(sgl), plchan->name); in pl08x_prep_slave_sg()
2075 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
2083 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_slave_sg()
2085 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
2090 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_slave_sg()
2098 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_cyclic() local
2099 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_cyclic()
2108 plchan->name); in pl08x_prep_dma_cyclic()
2120 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
2126 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_cyclic()
2128 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
2133 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_cyclic()
2139 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_config() local
2140 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_config()
2142 if (!plchan->slave) in pl08x_config()
2157 plchan->cfg = *config; in pl08x_config()
2164 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_terminate_all() local
2165 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_terminate_all()
2168 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_terminate_all()
2169 if (!plchan->phychan && !plchan->at) { in pl08x_terminate_all()
2170 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
2174 plchan->state = PL08X_CHAN_IDLE; in pl08x_terminate_all()
2176 if (plchan->phychan) { in pl08x_terminate_all()
2181 pl08x_phy_free(plchan); in pl08x_terminate_all()
2184 if (plchan->at) { in pl08x_terminate_all()
2185 vchan_terminate_vdesc(&plchan->at->vd); in pl08x_terminate_all()
2186 plchan->at = NULL; in pl08x_terminate_all()
2189 pl08x_free_txd_list(pl08x, plchan); in pl08x_terminate_all()
2191 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
2198 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_synchronize() local
2200 vchan_synchronize(&plchan->vc); in pl08x_synchronize()
2205 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_pause() local
2212 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_pause()
2213 if (!plchan->phychan && !plchan->at) { in pl08x_pause()
2214 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
2218 pl08x_pause_phy_chan(plchan->phychan); in pl08x_pause()
2219 plchan->state = PL08X_CHAN_PAUSED; in pl08x_pause()
2221 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
2228 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_resume() local
2235 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_resume()
2236 if (!plchan->phychan && !plchan->at) { in pl08x_resume()
2237 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
2241 pl08x_resume_phy_chan(plchan->phychan); in pl08x_resume()
2242 plchan->state = PL08X_CHAN_RUNNING; in pl08x_resume()
2244 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
2251 struct pl08x_dma_chan *plchan; in pl08x_filter_id() local
2258 plchan = to_pl08x_chan(chan); in pl08x_filter_id()
2261 if (!strcmp(plchan->name, name)) in pl08x_filter_id()
2270 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_filter_fn() local
2272 return plchan->cd == chan_id; in pl08x_filter_fn()
2317 struct pl08x_dma_chan *plchan = phychan->serving; in pl08x_irq() local
2320 if (!plchan) { in pl08x_irq()
2327 spin_lock(&plchan->vc.lock); in pl08x_irq()
2328 tx = plchan->at; in pl08x_irq()
2332 plchan->at = NULL; in pl08x_irq()
2337 pl08x_release_mux(plchan); in pl08x_irq()
2345 if (vchan_next_desc(&plchan->vc)) in pl08x_irq()
2346 pl08x_start_next_txd(plchan); in pl08x_irq()
2348 pl08x_phy_free(plchan); in pl08x_irq()
2350 spin_unlock(&plchan->vc.lock); in pl08x_irq()
2557 struct pl08x_dma_chan *plchan; in pl08x_of_xlate() local
2575 plchan = to_pl08x_chan(dma_chan); in pl08x_of_xlate()
2581 plchan->cd->periph_buses = dma_spec->args[1]; in pl08x_of_xlate()