Lines Matching refs:chan
144 static bool check_config(struct knav_dma_chan *chan, struct knav_dma_cfg *cfg)
146 if (!memcmp(&chan->cfg, cfg, sizeof(*cfg)))
152 static int chan_start(struct knav_dma_chan *chan,
157 spin_lock(&chan->lock);
158 if ((chan->direction == DMA_MEM_TO_DEV) && chan->reg_chan) {
163 writel_relaxed(v, &chan->reg_chan->mode);
164 writel_relaxed(DMA_ENABLE, &chan->reg_chan->control);
167 if (chan->reg_tx_sched)
168 writel_relaxed(cfg->u.tx.priority, &chan->reg_tx_sched->prio);
170 if (chan->reg_rx_flow) {
186 writel_relaxed(v, &chan->reg_rx_flow->control);
187 writel_relaxed(0, &chan->reg_rx_flow->tags);
188 writel_relaxed(0, &chan->reg_rx_flow->tag_sel);
192 writel_relaxed(v, &chan->reg_rx_flow->fdq_sel[0]);
196 writel_relaxed(v, &chan->reg_rx_flow->fdq_sel[1]);
198 writel_relaxed(0, &chan->reg_rx_flow->thresh[0]);
199 writel_relaxed(0, &chan->reg_rx_flow->thresh[1]);
200 writel_relaxed(0, &chan->reg_rx_flow->thresh[2]);
204 memcpy(&chan->cfg, cfg, sizeof(*cfg));
205 spin_unlock(&chan->lock);
210 static int chan_teardown(struct knav_dma_chan *chan)
214 if (!chan->reg_chan)
218 writel_relaxed(DMA_TEARDOWN, &chan->reg_chan->control);
223 value = readl_relaxed(&chan->reg_chan->control);
228 if (readl_relaxed(&chan->reg_chan->control) & DMA_ENABLE) {
236 static void chan_stop(struct knav_dma_chan *chan)
238 spin_lock(&chan->lock);
239 if (chan->reg_rx_flow) {
241 writel_relaxed(0, &chan->reg_rx_flow->fdq_sel[0]);
242 writel_relaxed(0, &chan->reg_rx_flow->fdq_sel[1]);
243 writel_relaxed(0, &chan->reg_rx_flow->thresh[0]);
244 writel_relaxed(0, &chan->reg_rx_flow->thresh[1]);
245 writel_relaxed(0, &chan->reg_rx_flow->thresh[2]);
249 chan_teardown(chan);
252 if (chan->reg_rx_flow) {
253 writel_relaxed(0, &chan->reg_rx_flow->control);
254 writel_relaxed(0, &chan->reg_rx_flow->tags);
255 writel_relaxed(0, &chan->reg_rx_flow->tag_sel);
258 memset(&chan->cfg, 0, sizeof(struct knav_dma_cfg));
259 spin_unlock(&chan->lock);
320 struct knav_dma_chan *chan)
325 ((chan->direction == DMA_MEM_TO_DEV) ? "tx chan" : "rx flow"),
326 chan_number(chan));
328 if (chan->direction == DMA_MEM_TO_DEV) {
330 chan->cfg.u.tx.filt_einfo,
331 chan->cfg.u.tx.filt_pswords,
332 chan->cfg.u.tx.priority);
335 chan->cfg.u.rx.einfo_present,
336 chan->cfg.u.rx.psinfo_present,
337 chan->cfg.u.rx.desc_type);
339 chan->cfg.u.rx.dst_q,
340 chan->cfg.u.rx.thresh);
342 seq_printf(s, "[%d]", chan->cfg.u.rx.fdq[i]);
350 struct knav_dma_chan *chan;
352 list_for_each_entry(chan, &dma->chan_list, list) {
353 if (atomic_read(&chan->ref_count))
354 dma_debug_show_channels(s, chan);
418 struct knav_dma_chan *chan;
460 list_for_each_entry(chan, &dma->chan_list, list) {
462 if (chan->channel == chan_num) {
467 if (chan->flow == chan_num) {
479 if (atomic_read(&chan->ref_count) >= 1) {
480 if (!check_config(chan, config)) {
487 if (atomic_inc_return(&chan->dma->ref_count) <= 1)
488 knav_dma_hw_init(chan->dma);
490 if (atomic_inc_return(&chan->ref_count) <= 1)
491 chan_start(chan, config);
496 return chan;
508 struct knav_dma_chan *chan = channel;
515 if (atomic_dec_return(&chan->ref_count) <= 0)
516 chan_stop(chan);
518 if (atomic_dec_return(&chan->dma->ref_count) <= 0)
519 knav_dma_hw_destroy(chan->dma);
522 chan->channel, chan->flow, chan->dma->name);
552 static int pktdma_init_rx_chan(struct knav_dma_chan *chan, u32 flow)
554 struct knav_dma_device *dma = chan->dma;
556 chan->flow = flow;
557 chan->reg_rx_flow = dma->reg_rx_flow + flow;
558 chan->channel = DMA_INVALID_ID;
559 dev_dbg(kdev->dev, "rx flow(%d) (%p)\n", chan->flow, chan->reg_rx_flow);
564 static int pktdma_init_tx_chan(struct knav_dma_chan *chan, u32 channel)
566 struct knav_dma_device *dma = chan->dma;
568 chan->channel = channel;
569 chan->reg_chan = dma->reg_tx_chan + channel;
570 chan->reg_tx_sched = dma->reg_tx_sched + channel;
571 chan->flow = DMA_INVALID_ID;
572 dev_dbg(kdev->dev, "tx channel(%d) (%p)\n", chan->channel, chan->reg_chan);
582 struct knav_dma_chan *chan;
585 chan = devm_kzalloc(dev, sizeof(*chan), GFP_KERNEL);
586 if (!chan)
589 INIT_LIST_HEAD(&chan->list);
590 chan->dma = dma;
591 chan->direction = DMA_TRANS_NONE;
592 atomic_set(&chan->ref_count, 0);
593 spin_lock_init(&chan->lock);
596 chan->direction = dir;
597 ret = pktdma_init_tx_chan(chan, chan_num);
599 chan->direction = dir;
600 ret = pktdma_init_rx_chan(chan, chan_num);
605 list_add_tail(&chan->list, &dma->chan_list);