Lines Matching refs:plchan

333 static int pl08x_request_mux(struct pl08x_dma_chan *plchan)  in pl08x_request_mux()  argument
335 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_request_mux()
338 if (plchan->mux_use++ == 0 && pd->get_xfer_signal) { in pl08x_request_mux()
339 ret = pd->get_xfer_signal(plchan->cd); in pl08x_request_mux()
341 plchan->mux_use = 0; in pl08x_request_mux()
345 plchan->signal = ret; in pl08x_request_mux()
350 static void pl08x_release_mux(struct pl08x_dma_chan *plchan) in pl08x_release_mux() argument
352 const struct pl08x_platform_data *pd = plchan->host->pd; in pl08x_release_mux()
354 if (plchan->signal >= 0) { in pl08x_release_mux()
355 WARN_ON(plchan->mux_use == 0); in pl08x_release_mux()
357 if (--plchan->mux_use == 0 && pd->put_xfer_signal) { in pl08x_release_mux()
358 pd->put_xfer_signal(plchan->cd, plchan->signal); in pl08x_release_mux()
359 plchan->signal = -1; in pl08x_release_mux()
527 static void pl08x_start_next_txd(struct pl08x_dma_chan *plchan) in pl08x_start_next_txd() argument
529 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_start_next_txd()
530 struct pl08x_phy_chan *phychan = plchan->phychan; in pl08x_start_next_txd()
531 struct virt_dma_desc *vd = vchan_next_desc(&plchan->vc); in pl08x_start_next_txd()
537 plchan->at = txd; in pl08x_start_next_txd()
753 static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan) in pl08x_getbytes_chan() argument
755 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_getbytes_chan()
764 ch = plchan->phychan; in pl08x_getbytes_chan()
765 txd = plchan->at; in pl08x_getbytes_chan()
859 static void pl08x_phy_alloc_and_start(struct pl08x_dma_chan *plchan) in pl08x_phy_alloc_and_start() argument
861 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_alloc_and_start()
864 ch = pl08x_get_phy_channel(pl08x, plchan); in pl08x_phy_alloc_and_start()
866 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name); in pl08x_phy_alloc_and_start()
867 plchan->state = PL08X_CHAN_WAITING; in pl08x_phy_alloc_and_start()
868 plchan->waiting_at = jiffies; in pl08x_phy_alloc_and_start()
873 ch->id, plchan->name); in pl08x_phy_alloc_and_start()
875 plchan->phychan = ch; in pl08x_phy_alloc_and_start()
876 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_alloc_and_start()
877 pl08x_start_next_txd(plchan); in pl08x_phy_alloc_and_start()
881 struct pl08x_dma_chan *plchan) in pl08x_phy_reassign_start() argument
883 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_reassign_start()
886 ch->id, plchan->name); in pl08x_phy_reassign_start()
893 ch->serving = plchan; in pl08x_phy_reassign_start()
894 plchan->phychan = ch; in pl08x_phy_reassign_start()
895 plchan->state = PL08X_CHAN_RUNNING; in pl08x_phy_reassign_start()
896 pl08x_start_next_txd(plchan); in pl08x_phy_reassign_start()
903 static void pl08x_phy_free(struct pl08x_dma_chan *plchan) in pl08x_phy_free() argument
905 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_free()
934 pl08x_terminate_phy_chan(pl08x, plchan->phychan); in pl08x_phy_free()
947 pl08x_phy_reassign_start(plchan->phychan, next); in pl08x_phy_free()
955 pl08x_put_phy_channel(pl08x, plchan->phychan); in pl08x_phy_free()
958 plchan->phychan = NULL; in pl08x_phy_free()
959 plchan->state = PL08X_CHAN_IDLE; in pl08x_phy_free()
1511 struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan); in pl08x_desc_free() local
1515 pl08x_release_mux(plchan); in pl08x_desc_free()
1517 pl08x_free_txd(plchan->host, txd); in pl08x_desc_free()
1521 struct pl08x_dma_chan *plchan) in pl08x_free_txd_list() argument
1525 vchan_get_all_descriptors(&plchan->vc, &head); in pl08x_free_txd_list()
1526 vchan_dma_desc_free_list(&plchan->vc, &head); in pl08x_free_txd_list()
1546 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_dma_tx_status() local
1561 if (plchan->state == PL08X_CHAN_PAUSED) in pl08x_dma_tx_status()
1566 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1569 vd = vchan_find_desc(&plchan->vc, cookie); in pl08x_dma_tx_status()
1578 bytes = pl08x_getbytes_chan(plchan); in pl08x_dma_tx_status()
1581 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_dma_tx_status()
1589 if (plchan->state == PL08X_CHAN_PAUSED && ret == DMA_IN_PROGRESS) in pl08x_dma_tx_status()
1700 static u32 pl08x_get_cctl(struct pl08x_dma_chan *plchan, in pl08x_get_cctl() argument
1717 if (plchan->cd->single) in pl08x_get_cctl()
1733 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_issue_pending() local
1736 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_issue_pending()
1737 if (vchan_issue_pending(&plchan->vc)) { in pl08x_issue_pending()
1738 if (!plchan->phychan && plchan->state != PL08X_CHAN_WAITING) in pl08x_issue_pending()
1739 pl08x_phy_alloc_and_start(plchan); in pl08x_issue_pending()
1741 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_issue_pending()
1744 static struct pl08x_txd *pl08x_get_txd(struct pl08x_dma_chan *plchan) in pl08x_get_txd() argument
1885 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_memcpy() local
1886 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_memcpy()
1891 txd = pl08x_get_txd(plchan); in pl08x_prep_dma_memcpy()
1919 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_memcpy()
1925 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_memcpy()
1933 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_init_txd() local
1934 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_init_txd()
1941 txd = pl08x_get_txd(plchan); in pl08x_init_txd()
1954 *slave_addr = plchan->cfg.dst_addr; in pl08x_init_txd()
1955 addr_width = plchan->cfg.dst_addr_width; in pl08x_init_txd()
1956 maxburst = plchan->cfg.dst_maxburst; in pl08x_init_txd()
1958 dst_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1961 *slave_addr = plchan->cfg.src_addr; in pl08x_init_txd()
1962 addr_width = plchan->cfg.src_addr_width; in pl08x_init_txd()
1963 maxburst = plchan->cfg.src_maxburst; in pl08x_init_txd()
1964 src_buses = plchan->cd->periph_buses; in pl08x_init_txd()
1973 cctl |= pl08x_get_cctl(plchan, addr_width, maxburst); in pl08x_init_txd()
1983 if (plchan->cfg.device_fc) in pl08x_init_txd()
1994 ret = pl08x_request_mux(plchan); in pl08x_init_txd()
1999 plchan->name); in pl08x_init_txd()
2004 plchan->signal, plchan->name); in pl08x_init_txd()
2008 txd->ccfg |= plchan->signal << PL080_CONFIG_DST_SEL_SHIFT; in pl08x_init_txd()
2010 txd->ccfg |= plchan->signal << PL080_CONFIG_SRC_SEL_SHIFT; in pl08x_init_txd()
2046 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_slave_sg() local
2047 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_slave_sg()
2054 __func__, sg_dma_len(sgl), plchan->name); in pl08x_prep_slave_sg()
2065 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
2073 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_slave_sg()
2075 pl08x_release_mux(plchan); in pl08x_prep_slave_sg()
2080 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_slave_sg()
2088 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_prep_dma_cyclic() local
2089 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_cyclic()
2098 plchan->name); in pl08x_prep_dma_cyclic()
2110 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
2116 ret = pl08x_fill_llis_for_desc(plchan->host, txd); in pl08x_prep_dma_cyclic()
2118 pl08x_release_mux(plchan); in pl08x_prep_dma_cyclic()
2123 return vchan_tx_prep(&plchan->vc, &txd->vd, flags); in pl08x_prep_dma_cyclic()
2129 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_config() local
2130 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_config()
2132 if (!plchan->slave) in pl08x_config()
2147 plchan->cfg = *config; in pl08x_config()
2154 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_terminate_all() local
2155 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_terminate_all()
2158 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_terminate_all()
2159 if (!plchan->phychan && !plchan->at) { in pl08x_terminate_all()
2160 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
2164 plchan->state = PL08X_CHAN_IDLE; in pl08x_terminate_all()
2166 if (plchan->phychan) { in pl08x_terminate_all()
2171 pl08x_phy_free(plchan); in pl08x_terminate_all()
2174 if (plchan->at) { in pl08x_terminate_all()
2175 vchan_terminate_vdesc(&plchan->at->vd); in pl08x_terminate_all()
2176 plchan->at = NULL; in pl08x_terminate_all()
2179 pl08x_free_txd_list(pl08x, plchan); in pl08x_terminate_all()
2181 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_terminate_all()
2188 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_synchronize() local
2190 vchan_synchronize(&plchan->vc); in pl08x_synchronize()
2195 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_pause() local
2202 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_pause()
2203 if (!plchan->phychan && !plchan->at) { in pl08x_pause()
2204 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
2208 pl08x_pause_phy_chan(plchan->phychan); in pl08x_pause()
2209 plchan->state = PL08X_CHAN_PAUSED; in pl08x_pause()
2211 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_pause()
2218 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_resume() local
2225 spin_lock_irqsave(&plchan->vc.lock, flags); in pl08x_resume()
2226 if (!plchan->phychan && !plchan->at) { in pl08x_resume()
2227 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
2231 pl08x_resume_phy_chan(plchan->phychan); in pl08x_resume()
2232 plchan->state = PL08X_CHAN_RUNNING; in pl08x_resume()
2234 spin_unlock_irqrestore(&plchan->vc.lock, flags); in pl08x_resume()
2241 struct pl08x_dma_chan *plchan; in pl08x_filter_id() local
2248 plchan = to_pl08x_chan(chan); in pl08x_filter_id()
2251 if (!strcmp(plchan->name, name)) in pl08x_filter_id()
2260 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); in pl08x_filter_fn() local
2262 return plchan->cd == chan_id; in pl08x_filter_fn()
2307 struct pl08x_dma_chan *plchan = phychan->serving; in pl08x_irq() local
2310 if (!plchan) { in pl08x_irq()
2317 spin_lock(&plchan->vc.lock); in pl08x_irq()
2318 tx = plchan->at; in pl08x_irq()
2322 plchan->at = NULL; in pl08x_irq()
2327 pl08x_release_mux(plchan); in pl08x_irq()
2335 if (vchan_next_desc(&plchan->vc)) in pl08x_irq()
2336 pl08x_start_next_txd(plchan); in pl08x_irq()
2338 pl08x_phy_free(plchan); in pl08x_irq()
2340 spin_unlock(&plchan->vc.lock); in pl08x_irq()
2536 struct pl08x_dma_chan *plchan; in pl08x_of_xlate() local
2554 plchan = to_pl08x_chan(dma_chan); in pl08x_of_xlate()
2560 plchan->cd->periph_buses = dma_spec->args[1]; in pl08x_of_xlate()