Lines Matching defs:fchan
32 static int st_fdma_dreq_get(struct st_fdma_chan *fchan)
34 struct st_fdma_dev *fdev = fchan->fdev;
35 u32 req_line_cfg = fchan->cfg.req_line;
66 static void st_fdma_dreq_put(struct st_fdma_chan *fchan)
68 struct st_fdma_dev *fdev = fchan->fdev;
70 dev_dbg(fdev->dev, "put dreq_line:%#x\n", fchan->dreq_line);
71 clear_bit(fchan->dreq_line, &fdev->dreq_mask);
74 static void st_fdma_xfer_desc(struct st_fdma_chan *fchan)
79 vdesc = vchan_next_desc(&fchan->vchan);
83 fchan->fdesc = to_st_fdma_desc(vdesc);
84 nbytes = fchan->fdesc->node[0].desc->nbytes;
85 cmd = FDMA_CMD_START(fchan->vchan.chan.chan_id);
86 ch_cmd = fchan->fdesc->node[0].pdesc | FDMA_CH_CMD_STA_START;
89 fnode_write(fchan, nbytes, FDMA_CNTN_OFST);
90 fchan_write(fchan, ch_cmd, FDMA_CH_CMD_OFST);
92 fchan->fdev->slim_rproc->peri + FDMA_CMD_SET_OFST);
94 dev_dbg(fchan->fdev->dev, "start chan:%d\n", fchan->vchan.chan.chan_id);
97 static void st_fdma_ch_sta_update(struct st_fdma_chan *fchan,
101 int ch_id = fchan->vchan.chan.chan_id;
102 struct st_fdma_dev *fdev = fchan->fdev;
104 ch_sta = fchan_read(fchan, FDMA_CH_CMD_OFST);
110 fchan->status = DMA_ERROR;
116 fchan->status = DMA_PAUSED;
120 fchan->status = DMA_IN_PROGRESS;
129 struct st_fdma_chan *fchan = &fdev->chans[0];
135 for (; int_sta != 0 ; int_sta >>= 2, fchan++) {
139 spin_lock(&fchan->vchan.lock);
140 st_fdma_ch_sta_update(fchan, int_sta);
142 if (fchan->fdesc) {
143 if (!fchan->fdesc->iscyclic) {
144 list_del(&fchan->fdesc->vdesc.node);
145 vchan_cookie_complete(&fchan->fdesc->vdesc);
146 fchan->fdesc = NULL;
147 fchan->status = DMA_COMPLETE;
149 vchan_cyclic_callback(&fchan->fdesc->vdesc);
153 if (!fchan->fdesc)
154 st_fdma_xfer_desc(fchan);
157 spin_unlock(&fchan->vchan.lock);
171 struct st_fdma_chan *fchan;
190 fchan = to_st_fdma_chan(chan);
192 fchan->cfg.of_node = dma_spec->np;
193 fchan->cfg.req_line = dma_spec->args[0];
194 fchan->cfg.req_ctrl = 0;
195 fchan->cfg.type = ST_FDMA_TYPE_FREE_RUN;
198 fchan->cfg.req_ctrl = dma_spec->args[1]
202 fchan->cfg.type = dma_spec->args[2];
204 if (fchan->cfg.type == ST_FDMA_TYPE_FREE_RUN) {
205 fchan->dreq_line = 0;
207 fchan->dreq_line = st_fdma_dreq_get(fchan);
208 if (IS_ERR_VALUE(fchan->dreq_line)) {
209 chan = ERR_PTR(fchan->dreq_line);
215 fchan->cfg.req_line, fchan->cfg.type, fchan->cfg.req_ctrl);
232 dma_pool_free(fdesc->fchan->node_pool, fdesc->node[i].desc,
237 static struct st_fdma_desc *st_fdma_alloc_desc(struct st_fdma_chan *fchan,
247 fdesc->fchan = fchan;
250 fdesc->node[i].desc = dma_pool_alloc(fchan->node_pool,
259 dma_pool_free(fchan->node_pool, fdesc->node[i].desc,
267 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
270 fchan->node_pool = dma_pool_create(dev_name(&chan->dev->device),
271 fchan->fdev->dev,
276 if (!fchan->node_pool) {
277 dev_err(fchan->fdev->dev, "unable to allocate desc pool\n");
281 dev_dbg(fchan->fdev->dev, "alloc ch_id:%d type:%d\n",
282 fchan->vchan.chan.chan_id, fchan->cfg.type);
289 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
290 struct rproc *rproc = fchan->fdev->slim_rproc->rproc;
293 dev_dbg(fchan->fdev->dev, "%s: freeing chan:%d\n",
294 __func__, fchan->vchan.chan.chan_id);
296 if (fchan->cfg.type != ST_FDMA_TYPE_FREE_RUN)
297 st_fdma_dreq_put(fchan);
299 spin_lock_irqsave(&fchan->vchan.lock, flags);
300 fchan->fdesc = NULL;
301 spin_unlock_irqrestore(&fchan->vchan.lock, flags);
303 dma_pool_destroy(fchan->node_pool);
304 fchan->node_pool = NULL;
305 memset(&fchan->cfg, 0, sizeof(struct st_fdma_cfg));
314 struct st_fdma_chan *fchan;
321 fchan = to_st_fdma_chan(chan);
324 fdesc = st_fdma_alloc_desc(fchan, 1);
326 dev_err(fchan->fdev->dev, "no memory for desc\n");
343 return vchan_tx_prep(&fchan->vchan, &fdesc->vdesc, flags);
346 static int config_reqctrl(struct st_fdma_chan *fchan,
351 int ch_id = fchan->vchan.chan.chan_id;
352 struct st_fdma_dev *fdev = fchan->fdev;
357 fchan->cfg.req_ctrl &= ~FDMA_REQ_CTRL_WNR;
358 maxburst = fchan->scfg.src_maxburst;
359 width = fchan->scfg.src_addr_width;
360 addr = fchan->scfg.src_addr;
364 fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_WNR;
365 maxburst = fchan->scfg.dst_maxburst;
366 width = fchan->scfg.dst_addr_width;
367 addr = fchan->scfg.dst_addr;
374 fchan->cfg.req_ctrl &= ~FDMA_REQ_CTRL_OPCODE_MASK;
379 fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST1;
383 fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST2;
387 fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST4;
391 fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST8;
398 fchan->cfg.req_ctrl &= ~FDMA_REQ_CTRL_NUM_OPS_MASK;
399 fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_NUM_OPS(maxburst-1);
400 dreq_write(fchan, fchan->cfg.req_ctrl, FDMA_REQ_CTRL_OFST);
402 fchan->cfg.dev_addr = addr;
403 fchan->cfg.dir = direction;
406 ch_id, addr, fchan->cfg.req_ctrl);
412 struct st_fdma_chan *fchan,
418 hw_node->daddr = fchan->cfg.dev_addr;
422 hw_node->saddr = fchan->cfg.dev_addr;
432 struct st_fdma_chan *fchan;
437 fchan = to_st_fdma_chan(chan);
440 dev_err(fchan->fdev->dev, "bad direction?\n");
444 return fchan;
452 struct st_fdma_chan *fchan;
456 fchan = st_fdma_prep_common(chan, len, direction);
457 if (!fchan)
463 if (config_reqctrl(fchan, direction)) {
464 dev_err(fchan->fdev->dev, "bad width or direction\n");
470 dev_err(fchan->fdev->dev, "len is not multiple of period\n");
475 fdesc = st_fdma_alloc_desc(fchan, sg_len);
477 dev_err(fchan->fdev->dev, "no memory for desc\n");
489 FDMA_NODE_CTRL_REQ_MAP_DREQ(fchan->dreq_line);
492 fill_hw_node(hw_node, fchan, direction);
503 return vchan_tx_prep(&fchan->vchan, &fdesc->vdesc, flags);
511 struct st_fdma_chan *fchan;
517 fchan = st_fdma_prep_common(chan, sg_len, direction);
518 if (!fchan)
524 fdesc = st_fdma_alloc_desc(fchan, sg_len);
526 dev_err(fchan->fdev->dev, "no memory for desc\n");
536 hw_node->control = FDMA_NODE_CTRL_REQ_MAP_DREQ(fchan->dreq_line);
538 fill_hw_node(hw_node, fchan, direction);
552 return vchan_tx_prep(&fchan->vchan, &fdesc->vdesc, flags);
555 static size_t st_fdma_desc_residue(struct st_fdma_chan *fchan,
559 struct st_fdma_desc *fdesc = fchan->fdesc;
565 cur_addr = fchan_read(fchan, FDMA_CH_CMD_OFST);
569 for (i = fchan->fdesc->n_nodes - 1 ; i >= 0; i--) {
571 residue += fnode_read(fchan, FDMA_CNTN_OFST);
584 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
593 spin_lock_irqsave(&fchan->vchan.lock, flags);
594 vd = vchan_find_desc(&fchan->vchan, cookie);
595 if (fchan->fdesc && cookie == fchan->fdesc->vdesc.tx.cookie)
596 txstate->residue = st_fdma_desc_residue(fchan, vd, true);
598 txstate->residue = st_fdma_desc_residue(fchan, vd, false);
602 spin_unlock_irqrestore(&fchan->vchan.lock, flags);
609 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
612 spin_lock_irqsave(&fchan->vchan.lock, flags);
614 if (vchan_issue_pending(&fchan->vchan) && !fchan->fdesc)
615 st_fdma_xfer_desc(fchan);
617 spin_unlock_irqrestore(&fchan->vchan.lock, flags);
623 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
624 int ch_id = fchan->vchan.chan.chan_id;
627 dev_dbg(fchan->fdev->dev, "pause chan:%d\n", ch_id);
629 spin_lock_irqsave(&fchan->vchan.lock, flags);
630 if (fchan->fdesc)
631 fdma_write(fchan->fdev, cmd, FDMA_CMD_SET_OFST);
632 spin_unlock_irqrestore(&fchan->vchan.lock, flags);
641 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
642 int ch_id = fchan->vchan.chan.chan_id;
644 dev_dbg(fchan->fdev->dev, "resume chan:%d\n", ch_id);
646 spin_lock_irqsave(&fchan->vchan.lock, flags);
647 if (fchan->fdesc) {
648 val = fchan_read(fchan, FDMA_CH_CMD_OFST);
650 fchan_write(fchan, val, FDMA_CH_CMD_OFST);
652 spin_unlock_irqrestore(&fchan->vchan.lock, flags);
661 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
662 int ch_id = fchan->vchan.chan.chan_id;
665 dev_dbg(fchan->fdev->dev, "terminate chan:%d\n", ch_id);
667 spin_lock_irqsave(&fchan->vchan.lock, flags);
668 fdma_write(fchan->fdev, cmd, FDMA_CMD_SET_OFST);
669 fchan->fdesc = NULL;
670 vchan_get_all_descriptors(&fchan->vchan, &head);
671 spin_unlock_irqrestore(&fchan->vchan.lock, flags);
672 vchan_dma_desc_free_list(&fchan->vchan, &head);
680 struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
682 memcpy(&fchan->scfg, slave_cfg, sizeof(fchan->scfg));
729 struct st_fdma_chan *fchan;
733 fchan = &fdev->chans[i];
734 list_del(&fchan->vchan.chan.device_node);
735 tasklet_kill(&fchan->vchan.task);
795 struct st_fdma_chan *fchan = &fdev->chans[i];
797 fchan->fdev = fdev;
798 fchan->vchan.desc_free = st_fdma_free_desc;
799 vchan_init(&fchan->vchan, &fdev->dma_device);