Lines Matching refs:chan

136 static bool check_config(struct knav_dma_chan *chan, struct knav_dma_cfg *cfg)
138 if (!memcmp(&chan->cfg, cfg, sizeof(*cfg)))
144 static int chan_start(struct knav_dma_chan *chan,
149 spin_lock(&chan->lock);
150 if ((chan->direction == DMA_MEM_TO_DEV) && chan->reg_chan) {
155 writel_relaxed(v, &chan->reg_chan->mode);
156 writel_relaxed(DMA_ENABLE, &chan->reg_chan->control);
159 if (chan->reg_tx_sched)
160 writel_relaxed(cfg->u.tx.priority, &chan->reg_tx_sched->prio);
162 if (chan->reg_rx_flow) {
178 writel_relaxed(v, &chan->reg_rx_flow->control);
179 writel_relaxed(0, &chan->reg_rx_flow->tags);
180 writel_relaxed(0, &chan->reg_rx_flow->tag_sel);
184 writel_relaxed(v, &chan->reg_rx_flow->fdq_sel[0]);
188 writel_relaxed(v, &chan->reg_rx_flow->fdq_sel[1]);
190 writel_relaxed(0, &chan->reg_rx_flow->thresh[0]);
191 writel_relaxed(0, &chan->reg_rx_flow->thresh[1]);
192 writel_relaxed(0, &chan->reg_rx_flow->thresh[2]);
196 memcpy(&chan->cfg, cfg, sizeof(*cfg));
197 spin_unlock(&chan->lock);
202 static int chan_teardown(struct knav_dma_chan *chan)
206 if (!chan->reg_chan)
210 writel_relaxed(DMA_TEARDOWN, &chan->reg_chan->control);
215 value = readl_relaxed(&chan->reg_chan->control);
220 if (readl_relaxed(&chan->reg_chan->control) & DMA_ENABLE) {
228 static void chan_stop(struct knav_dma_chan *chan)
230 spin_lock(&chan->lock);
231 if (chan->reg_rx_flow) {
233 writel_relaxed(0, &chan->reg_rx_flow->fdq_sel[0]);
234 writel_relaxed(0, &chan->reg_rx_flow->fdq_sel[1]);
235 writel_relaxed(0, &chan->reg_rx_flow->thresh[0]);
236 writel_relaxed(0, &chan->reg_rx_flow->thresh[1]);
237 writel_relaxed(0, &chan->reg_rx_flow->thresh[2]);
241 chan_teardown(chan);
244 if (chan->reg_rx_flow) {
245 writel_relaxed(0, &chan->reg_rx_flow->control);
246 writel_relaxed(0, &chan->reg_rx_flow->tags);
247 writel_relaxed(0, &chan->reg_rx_flow->tag_sel);
250 memset(&chan->cfg, 0, sizeof(struct knav_dma_cfg));
251 spin_unlock(&chan->lock);
312 struct knav_dma_chan *chan)
317 ((chan->direction == DMA_MEM_TO_DEV) ? "tx chan" : "rx flow"),
318 chan_number(chan));
320 if (chan->direction == DMA_MEM_TO_DEV) {
322 chan->cfg.u.tx.filt_einfo,
323 chan->cfg.u.tx.filt_pswords,
324 chan->cfg.u.tx.priority);
327 chan->cfg.u.rx.einfo_present,
328 chan->cfg.u.rx.psinfo_present,
329 chan->cfg.u.rx.desc_type);
331 chan->cfg.u.rx.dst_q,
332 chan->cfg.u.rx.thresh);
334 seq_printf(s, "[%d]", chan->cfg.u.rx.fdq[i]);
342 struct knav_dma_chan *chan;
344 list_for_each_entry(chan, &dma->chan_list, list) {
345 if (atomic_read(&chan->ref_count))
346 dma_debug_show_channels(s, chan);
411 struct knav_dma_chan *chan = NULL, *iter2;
453 chan = iter2;
458 chan = iter2;
463 if (!chan) {
469 if (atomic_read(&chan->ref_count) >= 1) {
470 if (!check_config(chan, config)) {
477 if (atomic_inc_return(&chan->dma->ref_count) <= 1)
478 knav_dma_hw_init(chan->dma);
480 if (atomic_inc_return(&chan->ref_count) <= 1)
481 chan_start(chan, config);
486 return chan;
498 struct knav_dma_chan *chan = channel;
505 if (atomic_dec_return(&chan->ref_count) <= 0)
506 chan_stop(chan);
508 if (atomic_dec_return(&chan->dma->ref_count) <= 0)
509 knav_dma_hw_destroy(chan->dma);
512 chan->channel, chan->flow, chan->dma->name);
542 static int pktdma_init_rx_chan(struct knav_dma_chan *chan, u32 flow)
544 struct knav_dma_device *dma = chan->dma;
546 chan->flow = flow;
547 chan->reg_rx_flow = dma->reg_rx_flow + flow;
548 chan->channel = DMA_INVALID_ID;
549 dev_dbg(kdev->dev, "rx flow(%d) (%p)\n", chan->flow, chan->reg_rx_flow);
554 static int pktdma_init_tx_chan(struct knav_dma_chan *chan, u32 channel)
556 struct knav_dma_device *dma = chan->dma;
558 chan->channel = channel;
559 chan->reg_chan = dma->reg_tx_chan + channel;
560 chan->reg_tx_sched = dma->reg_tx_sched + channel;
561 chan->flow = DMA_INVALID_ID;
562 dev_dbg(kdev->dev, "tx channel(%d) (%p)\n", chan->channel, chan->reg_chan);
572 struct knav_dma_chan *chan;
575 chan = devm_kzalloc(dev, sizeof(*chan), GFP_KERNEL);
576 if (!chan)
579 INIT_LIST_HEAD(&chan->list);
580 chan->dma = dma;
581 chan->direction = DMA_TRANS_NONE;
582 atomic_set(&chan->ref_count, 0);
583 spin_lock_init(&chan->lock);
586 chan->direction = dir;
587 ret = pktdma_init_tx_chan(chan, chan_num);
589 chan->direction = dir;
590 ret = pktdma_init_rx_chan(chan, chan_num);
595 list_add_tail(&chan->list, &dma->chan_list);