Lines Matching refs:plchan
333 static int pl08x_request_mux(struct pl08x_dma_chan *plchan)
335 const struct pl08x_platform_data *pd = plchan->host->pd;
338 if (plchan->mux_use++ == 0 && pd->get_xfer_signal) {
339 ret = pd->get_xfer_signal(plchan->cd);
341 plchan->mux_use = 0;
345 plchan->signal = ret;
350 static void pl08x_release_mux(struct pl08x_dma_chan *plchan)
352 const struct pl08x_platform_data *pd = plchan->host->pd;
354 if (plchan->signal >= 0) {
355 WARN_ON(plchan->mux_use == 0);
357 if (--plchan->mux_use == 0 && pd->put_xfer_signal) {
358 pd->put_xfer_signal(plchan->cd, plchan->signal);
359 plchan->signal = -1;
527 static void pl08x_start_next_txd(struct pl08x_dma_chan *plchan)
529 struct pl08x_driver_data *pl08x = plchan->host;
530 struct pl08x_phy_chan *phychan = plchan->phychan;
531 struct virt_dma_desc *vd = vchan_next_desc(&plchan->vc);
537 plchan->at = txd;
753 static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan)
755 struct pl08x_driver_data *pl08x = plchan->host;
764 ch = plchan->phychan;
765 txd = plchan->at;
859 static void pl08x_phy_alloc_and_start(struct pl08x_dma_chan *plchan)
861 struct pl08x_driver_data *pl08x = plchan->host;
864 ch = pl08x_get_phy_channel(pl08x, plchan);
866 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name);
867 plchan->state = PL08X_CHAN_WAITING;
868 plchan->waiting_at = jiffies;
873 ch->id, plchan->name);
875 plchan->phychan = ch;
876 plchan->state = PL08X_CHAN_RUNNING;
877 pl08x_start_next_txd(plchan);
881 struct pl08x_dma_chan *plchan)
883 struct pl08x_driver_data *pl08x = plchan->host;
886 ch->id, plchan->name);
893 ch->serving = plchan;
894 plchan->phychan = ch;
895 plchan->state = PL08X_CHAN_RUNNING;
896 pl08x_start_next_txd(plchan);
903 static void pl08x_phy_free(struct pl08x_dma_chan *plchan)
905 struct pl08x_driver_data *pl08x = plchan->host;
934 pl08x_terminate_phy_chan(pl08x, plchan->phychan);
947 pl08x_phy_reassign_start(plchan->phychan, next);
955 pl08x_put_phy_channel(pl08x, plchan->phychan);
958 plchan->phychan = NULL;
959 plchan->state = PL08X_CHAN_IDLE;
1511 struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan);
1515 pl08x_release_mux(plchan);
1517 pl08x_free_txd(plchan->host, txd);
1521 struct pl08x_dma_chan *plchan)
1525 vchan_get_all_descriptors(&plchan->vc, &head);
1526 vchan_dma_desc_free_list(&plchan->vc, &head);
1554 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
1569 if (plchan->state == PL08X_CHAN_PAUSED)
1574 spin_lock_irqsave(&plchan->vc.lock, flags);
1577 vd = vchan_find_desc(&plchan->vc, cookie);
1586 bytes = pl08x_getbytes_chan(plchan);
1589 spin_unlock_irqrestore(&plchan->vc.lock, flags);
1597 if (plchan->state == PL08X_CHAN_PAUSED && ret == DMA_IN_PROGRESS)
1708 static u32 pl08x_get_cctl(struct pl08x_dma_chan *plchan,
1725 if (plchan->cd->single)
1741 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
1744 spin_lock_irqsave(&plchan->vc.lock, flags);
1745 if (vchan_issue_pending(&plchan->vc)) {
1746 if (!plchan->phychan && plchan->state != PL08X_CHAN_WAITING)
1747 pl08x_phy_alloc_and_start(plchan);
1749 spin_unlock_irqrestore(&plchan->vc.lock, flags);
1752 static struct pl08x_txd *pl08x_get_txd(struct pl08x_dma_chan *plchan)
1893 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
1894 struct pl08x_driver_data *pl08x = plchan->host;
1899 txd = pl08x_get_txd(plchan);
1927 ret = pl08x_fill_llis_for_desc(plchan->host, txd);
1933 return vchan_tx_prep(&plchan->vc, &txd->vd, flags);
1941 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
1942 struct pl08x_driver_data *pl08x = plchan->host;
1949 txd = pl08x_get_txd(plchan);
1962 *slave_addr = plchan->cfg.dst_addr;
1963 addr_width = plchan->cfg.dst_addr_width;
1964 maxburst = plchan->cfg.dst_maxburst;
1966 dst_buses = plchan->cd->periph_buses;
1969 *slave_addr = plchan->cfg.src_addr;
1970 addr_width = plchan->cfg.src_addr_width;
1971 maxburst = plchan->cfg.src_maxburst;
1972 src_buses = plchan->cd->periph_buses;
1981 cctl |= pl08x_get_cctl(plchan, addr_width, maxburst);
1991 if (plchan->cfg.device_fc)
2002 ret = pl08x_request_mux(plchan);
2007 plchan->name);
2012 plchan->signal, plchan->name);
2016 txd->ccfg |= plchan->signal << PL080_CONFIG_DST_SEL_SHIFT;
2018 txd->ccfg |= plchan->signal << PL080_CONFIG_SRC_SEL_SHIFT;
2054 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2055 struct pl08x_driver_data *pl08x = plchan->host;
2062 __func__, sg_dma_len(sgl), plchan->name);
2073 pl08x_release_mux(plchan);
2081 ret = pl08x_fill_llis_for_desc(plchan->host, txd);
2083 pl08x_release_mux(plchan);
2088 return vchan_tx_prep(&plchan->vc, &txd->vd, flags);
2096 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2097 struct pl08x_driver_data *pl08x = plchan->host;
2106 plchan->name);
2118 pl08x_release_mux(plchan);
2124 ret = pl08x_fill_llis_for_desc(plchan->host, txd);
2126 pl08x_release_mux(plchan);
2131 return vchan_tx_prep(&plchan->vc, &txd->vd, flags);
2137 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2138 struct pl08x_driver_data *pl08x = plchan->host;
2140 if (!plchan->slave)
2155 plchan->cfg = *config;
2162 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2163 struct pl08x_driver_data *pl08x = plchan->host;
2166 spin_lock_irqsave(&plchan->vc.lock, flags);
2167 if (!plchan->phychan && !plchan->at) {
2168 spin_unlock_irqrestore(&plchan->vc.lock, flags);
2172 plchan->state = PL08X_CHAN_IDLE;
2174 if (plchan->phychan) {
2179 pl08x_phy_free(plchan);
2182 if (plchan->at) {
2183 vchan_terminate_vdesc(&plchan->at->vd);
2184 plchan->at = NULL;
2187 pl08x_free_txd_list(pl08x, plchan);
2189 spin_unlock_irqrestore(&plchan->vc.lock, flags);
2196 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2198 vchan_synchronize(&plchan->vc);
2203 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2210 spin_lock_irqsave(&plchan->vc.lock, flags);
2211 if (!plchan->phychan && !plchan->at) {
2212 spin_unlock_irqrestore(&plchan->vc.lock, flags);
2216 pl08x_pause_phy_chan(plchan->phychan);
2217 plchan->state = PL08X_CHAN_PAUSED;
2219 spin_unlock_irqrestore(&plchan->vc.lock, flags);
2226 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2233 spin_lock_irqsave(&plchan->vc.lock, flags);
2234 if (!plchan->phychan && !plchan->at) {
2235 spin_unlock_irqrestore(&plchan->vc.lock, flags);
2239 pl08x_resume_phy_chan(plchan->phychan);
2240 plchan->state = PL08X_CHAN_RUNNING;
2242 spin_unlock_irqrestore(&plchan->vc.lock, flags);
2249 struct pl08x_dma_chan *plchan;
2256 plchan = to_pl08x_chan(chan);
2259 if (!strcmp(plchan->name, name))
2268 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
2270 return plchan->cd == chan_id;
2315 struct pl08x_dma_chan *plchan = phychan->serving;
2318 if (!plchan) {
2325 spin_lock(&plchan->vc.lock);
2326 tx = plchan->at;
2330 plchan->at = NULL;
2335 pl08x_release_mux(plchan);
2343 if (vchan_next_desc(&plchan->vc))
2344 pl08x_start_next_txd(plchan);
2346 pl08x_phy_free(plchan);
2348 spin_unlock(&plchan->vc.lock);
2544 struct pl08x_dma_chan *plchan;
2562 plchan = to_pl08x_chan(dma_chan);
2568 plchan->cd->periph_buses = dma_spec->args[1];