Lines Matching refs:chan

137 static bool check_config(struct knav_dma_chan *chan, struct knav_dma_cfg *cfg)  in check_config()  argument
139 if (!memcmp(&chan->cfg, cfg, sizeof(*cfg))) in check_config()
145 static int chan_start(struct knav_dma_chan *chan, in chan_start() argument
150 spin_lock(&chan->lock); in chan_start()
151 if ((chan->direction == DMA_MEM_TO_DEV) && chan->reg_chan) { in chan_start()
156 writel_relaxed(v, &chan->reg_chan->mode); in chan_start()
157 writel_relaxed(DMA_ENABLE, &chan->reg_chan->control); in chan_start()
160 if (chan->reg_tx_sched) in chan_start()
161 writel_relaxed(cfg->u.tx.priority, &chan->reg_tx_sched->prio); in chan_start()
163 if (chan->reg_rx_flow) { in chan_start()
179 writel_relaxed(v, &chan->reg_rx_flow->control); in chan_start()
180 writel_relaxed(0, &chan->reg_rx_flow->tags); in chan_start()
181 writel_relaxed(0, &chan->reg_rx_flow->tag_sel); in chan_start()
185 writel_relaxed(v, &chan->reg_rx_flow->fdq_sel[0]); in chan_start()
189 writel_relaxed(v, &chan->reg_rx_flow->fdq_sel[1]); in chan_start()
191 writel_relaxed(0, &chan->reg_rx_flow->thresh[0]); in chan_start()
192 writel_relaxed(0, &chan->reg_rx_flow->thresh[1]); in chan_start()
193 writel_relaxed(0, &chan->reg_rx_flow->thresh[2]); in chan_start()
197 memcpy(&chan->cfg, cfg, sizeof(*cfg)); in chan_start()
198 spin_unlock(&chan->lock); in chan_start()
203 static int chan_teardown(struct knav_dma_chan *chan) in chan_teardown() argument
207 if (!chan->reg_chan) in chan_teardown()
211 writel_relaxed(DMA_TEARDOWN, &chan->reg_chan->control); in chan_teardown()
216 value = readl_relaxed(&chan->reg_chan->control); in chan_teardown()
221 if (readl_relaxed(&chan->reg_chan->control) & DMA_ENABLE) { in chan_teardown()
229 static void chan_stop(struct knav_dma_chan *chan) in chan_stop() argument
231 spin_lock(&chan->lock); in chan_stop()
232 if (chan->reg_rx_flow) { in chan_stop()
234 writel_relaxed(0, &chan->reg_rx_flow->fdq_sel[0]); in chan_stop()
235 writel_relaxed(0, &chan->reg_rx_flow->fdq_sel[1]); in chan_stop()
236 writel_relaxed(0, &chan->reg_rx_flow->thresh[0]); in chan_stop()
237 writel_relaxed(0, &chan->reg_rx_flow->thresh[1]); in chan_stop()
238 writel_relaxed(0, &chan->reg_rx_flow->thresh[2]); in chan_stop()
242 chan_teardown(chan); in chan_stop()
245 if (chan->reg_rx_flow) { in chan_stop()
246 writel_relaxed(0, &chan->reg_rx_flow->control); in chan_stop()
247 writel_relaxed(0, &chan->reg_rx_flow->tags); in chan_stop()
248 writel_relaxed(0, &chan->reg_rx_flow->tag_sel); in chan_stop()
251 memset(&chan->cfg, 0, sizeof(struct knav_dma_cfg)); in chan_stop()
252 spin_unlock(&chan->lock); in chan_stop()
313 struct knav_dma_chan *chan) in dma_debug_show_channels() argument
318 ((chan->direction == DMA_MEM_TO_DEV) ? "tx chan" : "rx flow"), in dma_debug_show_channels()
319 chan_number(chan)); in dma_debug_show_channels()
321 if (chan->direction == DMA_MEM_TO_DEV) { in dma_debug_show_channels()
323 chan->cfg.u.tx.filt_einfo, in dma_debug_show_channels()
324 chan->cfg.u.tx.filt_pswords, in dma_debug_show_channels()
325 chan->cfg.u.tx.priority); in dma_debug_show_channels()
328 chan->cfg.u.rx.einfo_present, in dma_debug_show_channels()
329 chan->cfg.u.rx.psinfo_present, in dma_debug_show_channels()
330 chan->cfg.u.rx.desc_type); in dma_debug_show_channels()
332 chan->cfg.u.rx.dst_q, in dma_debug_show_channels()
333 chan->cfg.u.rx.thresh); in dma_debug_show_channels()
335 seq_printf(s, "[%d]", chan->cfg.u.rx.fdq[i]); in dma_debug_show_channels()
343 struct knav_dma_chan *chan; in dma_debug_show_devices() local
345 list_for_each_entry(chan, &dma->chan_list, list) { in dma_debug_show_devices()
346 if (atomic_read(&chan->ref_count)) in dma_debug_show_devices()
347 dma_debug_show_channels(s, chan); in dma_debug_show_devices()
421 struct knav_dma_chan *chan; in knav_dma_open_channel() local
463 list_for_each_entry(chan, &dma->chan_list, list) { in knav_dma_open_channel()
465 if (chan->channel == chan_num) { in knav_dma_open_channel()
470 if (chan->flow == chan_num) { in knav_dma_open_channel()
482 if (atomic_read(&chan->ref_count) >= 1) { in knav_dma_open_channel()
483 if (!check_config(chan, config)) { in knav_dma_open_channel()
490 if (atomic_inc_return(&chan->dma->ref_count) <= 1) in knav_dma_open_channel()
491 knav_dma_hw_init(chan->dma); in knav_dma_open_channel()
493 if (atomic_inc_return(&chan->ref_count) <= 1) in knav_dma_open_channel()
494 chan_start(chan, config); in knav_dma_open_channel()
499 return chan; in knav_dma_open_channel()
511 struct knav_dma_chan *chan = channel; in knav_dma_close_channel() local
518 if (atomic_dec_return(&chan->ref_count) <= 0) in knav_dma_close_channel()
519 chan_stop(chan); in knav_dma_close_channel()
521 if (atomic_dec_return(&chan->dma->ref_count) <= 0) in knav_dma_close_channel()
522 knav_dma_hw_destroy(chan->dma); in knav_dma_close_channel()
525 chan->channel, chan->flow, chan->dma->name); in knav_dma_close_channel()
555 static int pktdma_init_rx_chan(struct knav_dma_chan *chan, u32 flow) in pktdma_init_rx_chan() argument
557 struct knav_dma_device *dma = chan->dma; in pktdma_init_rx_chan()
559 chan->flow = flow; in pktdma_init_rx_chan()
560 chan->reg_rx_flow = dma->reg_rx_flow + flow; in pktdma_init_rx_chan()
561 chan->channel = DMA_INVALID_ID; in pktdma_init_rx_chan()
562 dev_dbg(kdev->dev, "rx flow(%d) (%p)\n", chan->flow, chan->reg_rx_flow); in pktdma_init_rx_chan()
567 static int pktdma_init_tx_chan(struct knav_dma_chan *chan, u32 channel) in pktdma_init_tx_chan() argument
569 struct knav_dma_device *dma = chan->dma; in pktdma_init_tx_chan()
571 chan->channel = channel; in pktdma_init_tx_chan()
572 chan->reg_chan = dma->reg_tx_chan + channel; in pktdma_init_tx_chan()
573 chan->reg_tx_sched = dma->reg_tx_sched + channel; in pktdma_init_tx_chan()
574 chan->flow = DMA_INVALID_ID; in pktdma_init_tx_chan()
575 dev_dbg(kdev->dev, "tx channel(%d) (%p)\n", chan->channel, chan->reg_chan); in pktdma_init_tx_chan()
585 struct knav_dma_chan *chan; in pktdma_init_chan() local
588 chan = devm_kzalloc(dev, sizeof(*chan), GFP_KERNEL); in pktdma_init_chan()
589 if (!chan) in pktdma_init_chan()
592 INIT_LIST_HEAD(&chan->list); in pktdma_init_chan()
593 chan->dma = dma; in pktdma_init_chan()
594 chan->direction = DMA_NONE; in pktdma_init_chan()
595 atomic_set(&chan->ref_count, 0); in pktdma_init_chan()
596 spin_lock_init(&chan->lock); in pktdma_init_chan()
599 chan->direction = dir; in pktdma_init_chan()
600 ret = pktdma_init_tx_chan(chan, chan_num); in pktdma_init_chan()
602 chan->direction = dir; in pktdma_init_chan()
603 ret = pktdma_init_rx_chan(chan, chan_num); in pktdma_init_chan()
608 list_add_tail(&chan->list, &dma->chan_list); in pktdma_init_chan()