xref: /linux/drivers/dma/st_fdma.c (revision a460513ed4b6994bfeb7bd86f72853140bc1ac12)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * DMA driver for STMicroelectronics STi FDMA controller
4  *
5  * Copyright (C) 2014 STMicroelectronics
6  *
7  * Author: Ludovic Barre <Ludovic.barre@st.com>
8  *	   Peter Griffin <peter.griffin@linaro.org>
9  */
10 
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/of_device.h>
14 #include <linux/of_dma.h>
15 #include <linux/platform_device.h>
16 #include <linux/interrupt.h>
17 #include <linux/remoteproc.h>
18 #include <linux/slab.h>
19 
20 #include "st_fdma.h"
21 
22 static inline struct st_fdma_chan *to_st_fdma_chan(struct dma_chan *c)
23 {
24 	return container_of(c, struct st_fdma_chan, vchan.chan);
25 }
26 
27 static struct st_fdma_desc *to_st_fdma_desc(struct virt_dma_desc *vd)
28 {
29 	return container_of(vd, struct st_fdma_desc, vdesc);
30 }
31 
32 static int st_fdma_dreq_get(struct st_fdma_chan *fchan)
33 {
34 	struct st_fdma_dev *fdev = fchan->fdev;
35 	u32 req_line_cfg = fchan->cfg.req_line;
36 	u32 dreq_line;
37 	int try = 0;
38 
39 	/*
40 	 * dreq_mask is shared for n channels of fdma, so all accesses must be
41 	 * atomic. if the dreq_mask is changed between ffz and set_bit,
42 	 * we retry
43 	 */
44 	do {
45 		if (fdev->dreq_mask == ~0L) {
46 			dev_err(fdev->dev, "No req lines available\n");
47 			return -EINVAL;
48 		}
49 
50 		if (try || req_line_cfg >= ST_FDMA_NR_DREQS) {
51 			dev_err(fdev->dev, "Invalid or used req line\n");
52 			return -EINVAL;
53 		} else {
54 			dreq_line = req_line_cfg;
55 		}
56 
57 		try++;
58 	} while (test_and_set_bit(dreq_line, &fdev->dreq_mask));
59 
60 	dev_dbg(fdev->dev, "get dreq_line:%d mask:%#lx\n",
61 		dreq_line, fdev->dreq_mask);
62 
63 	return dreq_line;
64 }
65 
66 static void st_fdma_dreq_put(struct st_fdma_chan *fchan)
67 {
68 	struct st_fdma_dev *fdev = fchan->fdev;
69 
70 	dev_dbg(fdev->dev, "put dreq_line:%#x\n", fchan->dreq_line);
71 	clear_bit(fchan->dreq_line, &fdev->dreq_mask);
72 }
73 
74 static void st_fdma_xfer_desc(struct st_fdma_chan *fchan)
75 {
76 	struct virt_dma_desc *vdesc;
77 	unsigned long nbytes, ch_cmd, cmd;
78 
79 	vdesc = vchan_next_desc(&fchan->vchan);
80 	if (!vdesc)
81 		return;
82 
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;
87 
88 	/* start the channel for the descriptor */
89 	fnode_write(fchan, nbytes, FDMA_CNTN_OFST);
90 	fchan_write(fchan, ch_cmd, FDMA_CH_CMD_OFST);
91 	writel(cmd,
92 		fchan->fdev->slim_rproc->peri + FDMA_CMD_SET_OFST);
93 
94 	dev_dbg(fchan->fdev->dev, "start chan:%d\n", fchan->vchan.chan.chan_id);
95 }
96 
97 static void st_fdma_ch_sta_update(struct st_fdma_chan *fchan,
98 				  unsigned long int_sta)
99 {
100 	unsigned long ch_sta, ch_err;
101 	int ch_id = fchan->vchan.chan.chan_id;
102 	struct st_fdma_dev *fdev = fchan->fdev;
103 
104 	ch_sta = fchan_read(fchan, FDMA_CH_CMD_OFST);
105 	ch_err = ch_sta & FDMA_CH_CMD_ERR_MASK;
106 	ch_sta &= FDMA_CH_CMD_STA_MASK;
107 
108 	if (int_sta & FDMA_INT_STA_ERR) {
109 		dev_warn(fdev->dev, "chan:%d, error:%ld\n", ch_id, ch_err);
110 		fchan->status = DMA_ERROR;
111 		return;
112 	}
113 
114 	switch (ch_sta) {
115 	case FDMA_CH_CMD_STA_PAUSED:
116 		fchan->status = DMA_PAUSED;
117 		break;
118 
119 	case FDMA_CH_CMD_STA_RUNNING:
120 		fchan->status = DMA_IN_PROGRESS;
121 		break;
122 	}
123 }
124 
125 static irqreturn_t st_fdma_irq_handler(int irq, void *dev_id)
126 {
127 	struct st_fdma_dev *fdev = dev_id;
128 	irqreturn_t ret = IRQ_NONE;
129 	struct st_fdma_chan *fchan = &fdev->chans[0];
130 	unsigned long int_sta, clr;
131 
132 	int_sta = fdma_read(fdev, FDMA_INT_STA_OFST);
133 	clr = int_sta;
134 
135 	for (; int_sta != 0 ; int_sta >>= 2, fchan++) {
136 		if (!(int_sta & (FDMA_INT_STA_CH | FDMA_INT_STA_ERR)))
137 			continue;
138 
139 		spin_lock(&fchan->vchan.lock);
140 		st_fdma_ch_sta_update(fchan, int_sta);
141 
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;
148 			} else {
149 				vchan_cyclic_callback(&fchan->fdesc->vdesc);
150 			}
151 
152 			/* Start the next descriptor (if available) */
153 			if (!fchan->fdesc)
154 				st_fdma_xfer_desc(fchan);
155 		}
156 
157 		spin_unlock(&fchan->vchan.lock);
158 		ret = IRQ_HANDLED;
159 	}
160 
161 	fdma_write(fdev, clr, FDMA_INT_CLR_OFST);
162 
163 	return ret;
164 }
165 
166 static struct dma_chan *st_fdma_of_xlate(struct of_phandle_args *dma_spec,
167 					 struct of_dma *ofdma)
168 {
169 	struct st_fdma_dev *fdev = ofdma->of_dma_data;
170 	struct dma_chan *chan;
171 	struct st_fdma_chan *fchan;
172 	int ret;
173 
174 	if (dma_spec->args_count < 1)
175 		return ERR_PTR(-EINVAL);
176 
177 	if (fdev->dma_device.dev->of_node != dma_spec->np)
178 		return ERR_PTR(-EINVAL);
179 
180 	ret = rproc_boot(fdev->slim_rproc->rproc);
181 	if (ret == -ENOENT)
182 		return ERR_PTR(-EPROBE_DEFER);
183 	else if (ret)
184 		return ERR_PTR(ret);
185 
186 	chan = dma_get_any_slave_channel(&fdev->dma_device);
187 	if (!chan)
188 		goto err_chan;
189 
190 	fchan = to_st_fdma_chan(chan);
191 
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;
196 
197 	if (dma_spec->args_count > 1)
198 		fchan->cfg.req_ctrl = dma_spec->args[1]
199 			& FDMA_REQ_CTRL_CFG_MASK;
200 
201 	if (dma_spec->args_count > 2)
202 		fchan->cfg.type = dma_spec->args[2];
203 
204 	if (fchan->cfg.type == ST_FDMA_TYPE_FREE_RUN) {
205 		fchan->dreq_line = 0;
206 	} else {
207 		fchan->dreq_line = st_fdma_dreq_get(fchan);
208 		if (IS_ERR_VALUE(fchan->dreq_line)) {
209 			chan = ERR_PTR(fchan->dreq_line);
210 			goto err_chan;
211 		}
212 	}
213 
214 	dev_dbg(fdev->dev, "xlate req_line:%d type:%d req_ctrl:%#lx\n",
215 		fchan->cfg.req_line, fchan->cfg.type, fchan->cfg.req_ctrl);
216 
217 	return chan;
218 
219 err_chan:
220 	rproc_shutdown(fdev->slim_rproc->rproc);
221 	return chan;
222 
223 }
224 
225 static void st_fdma_free_desc(struct virt_dma_desc *vdesc)
226 {
227 	struct st_fdma_desc *fdesc;
228 	int i;
229 
230 	fdesc = to_st_fdma_desc(vdesc);
231 	for (i = 0; i < fdesc->n_nodes; i++)
232 		dma_pool_free(fdesc->fchan->node_pool, fdesc->node[i].desc,
233 			      fdesc->node[i].pdesc);
234 	kfree(fdesc);
235 }
236 
237 static struct st_fdma_desc *st_fdma_alloc_desc(struct st_fdma_chan *fchan,
238 					       int sg_len)
239 {
240 	struct st_fdma_desc *fdesc;
241 	int i;
242 
243 	fdesc = kzalloc(struct_size(fdesc, node, sg_len), GFP_NOWAIT);
244 	if (!fdesc)
245 		return NULL;
246 
247 	fdesc->fchan = fchan;
248 	fdesc->n_nodes = sg_len;
249 	for (i = 0; i < sg_len; i++) {
250 		fdesc->node[i].desc = dma_pool_alloc(fchan->node_pool,
251 				GFP_NOWAIT, &fdesc->node[i].pdesc);
252 		if (!fdesc->node[i].desc)
253 			goto err;
254 	}
255 	return fdesc;
256 
257 err:
258 	while (--i >= 0)
259 		dma_pool_free(fchan->node_pool, fdesc->node[i].desc,
260 			      fdesc->node[i].pdesc);
261 	kfree(fdesc);
262 	return NULL;
263 }
264 
265 static int st_fdma_alloc_chan_res(struct dma_chan *chan)
266 {
267 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
268 
269 	/* Create the dma pool for descriptor allocation */
270 	fchan->node_pool = dma_pool_create(dev_name(&chan->dev->device),
271 					    fchan->fdev->dev,
272 					    sizeof(struct st_fdma_hw_node),
273 					    __alignof__(struct st_fdma_hw_node),
274 					    0);
275 
276 	if (!fchan->node_pool) {
277 		dev_err(fchan->fdev->dev, "unable to allocate desc pool\n");
278 		return -ENOMEM;
279 	}
280 
281 	dev_dbg(fchan->fdev->dev, "alloc ch_id:%d type:%d\n",
282 		fchan->vchan.chan.chan_id, fchan->cfg.type);
283 
284 	return 0;
285 }
286 
287 static void st_fdma_free_chan_res(struct dma_chan *chan)
288 {
289 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
290 	struct rproc *rproc = fchan->fdev->slim_rproc->rproc;
291 	unsigned long flags;
292 
293 	dev_dbg(fchan->fdev->dev, "%s: freeing chan:%d\n",
294 		__func__, fchan->vchan.chan.chan_id);
295 
296 	if (fchan->cfg.type != ST_FDMA_TYPE_FREE_RUN)
297 		st_fdma_dreq_put(fchan);
298 
299 	spin_lock_irqsave(&fchan->vchan.lock, flags);
300 	fchan->fdesc = NULL;
301 	spin_unlock_irqrestore(&fchan->vchan.lock, flags);
302 
303 	dma_pool_destroy(fchan->node_pool);
304 	fchan->node_pool = NULL;
305 	memset(&fchan->cfg, 0, sizeof(struct st_fdma_cfg));
306 
307 	rproc_shutdown(rproc);
308 }
309 
310 static struct dma_async_tx_descriptor *st_fdma_prep_dma_memcpy(
311 	struct dma_chan *chan,	dma_addr_t dst, dma_addr_t src,
312 	size_t len, unsigned long flags)
313 {
314 	struct st_fdma_chan *fchan;
315 	struct st_fdma_desc *fdesc;
316 	struct st_fdma_hw_node *hw_node;
317 
318 	if (!len)
319 		return NULL;
320 
321 	fchan = to_st_fdma_chan(chan);
322 
323 	/* We only require a single descriptor */
324 	fdesc = st_fdma_alloc_desc(fchan, 1);
325 	if (!fdesc) {
326 		dev_err(fchan->fdev->dev, "no memory for desc\n");
327 		return NULL;
328 	}
329 
330 	hw_node = fdesc->node[0].desc;
331 	hw_node->next = 0;
332 	hw_node->control = FDMA_NODE_CTRL_REQ_MAP_FREE_RUN;
333 	hw_node->control |= FDMA_NODE_CTRL_SRC_INCR;
334 	hw_node->control |= FDMA_NODE_CTRL_DST_INCR;
335 	hw_node->control |= FDMA_NODE_CTRL_INT_EON;
336 	hw_node->nbytes = len;
337 	hw_node->saddr = src;
338 	hw_node->daddr = dst;
339 	hw_node->generic.length = len;
340 	hw_node->generic.sstride = 0;
341 	hw_node->generic.dstride = 0;
342 
343 	return vchan_tx_prep(&fchan->vchan, &fdesc->vdesc, flags);
344 }
345 
346 static int config_reqctrl(struct st_fdma_chan *fchan,
347 			  enum dma_transfer_direction direction)
348 {
349 	u32 maxburst = 0, addr = 0;
350 	enum dma_slave_buswidth width;
351 	int ch_id = fchan->vchan.chan.chan_id;
352 	struct st_fdma_dev *fdev = fchan->fdev;
353 
354 	switch (direction) {
355 
356 	case DMA_DEV_TO_MEM:
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;
361 		break;
362 
363 	case DMA_MEM_TO_DEV:
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;
368 		break;
369 
370 	default:
371 		return -EINVAL;
372 	}
373 
374 	fchan->cfg.req_ctrl &= ~FDMA_REQ_CTRL_OPCODE_MASK;
375 
376 	switch (width) {
377 
378 	case DMA_SLAVE_BUSWIDTH_1_BYTE:
379 		fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST1;
380 		break;
381 
382 	case DMA_SLAVE_BUSWIDTH_2_BYTES:
383 		fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST2;
384 		break;
385 
386 	case DMA_SLAVE_BUSWIDTH_4_BYTES:
387 		fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST4;
388 		break;
389 
390 	case DMA_SLAVE_BUSWIDTH_8_BYTES:
391 		fchan->cfg.req_ctrl |= FDMA_REQ_CTRL_OPCODE_LD_ST8;
392 		break;
393 
394 	default:
395 		return -EINVAL;
396 	}
397 
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);
401 
402 	fchan->cfg.dev_addr = addr;
403 	fchan->cfg.dir = direction;
404 
405 	dev_dbg(fdev->dev, "chan:%d config_reqctrl:%#x req_ctrl:%#lx\n",
406 		ch_id, addr, fchan->cfg.req_ctrl);
407 
408 	return 0;
409 }
410 
411 static void fill_hw_node(struct st_fdma_hw_node *hw_node,
412 			struct st_fdma_chan *fchan,
413 			enum dma_transfer_direction direction)
414 {
415 	if (direction == DMA_MEM_TO_DEV) {
416 		hw_node->control |= FDMA_NODE_CTRL_SRC_INCR;
417 		hw_node->control |= FDMA_NODE_CTRL_DST_STATIC;
418 		hw_node->daddr = fchan->cfg.dev_addr;
419 	} else {
420 		hw_node->control |= FDMA_NODE_CTRL_SRC_STATIC;
421 		hw_node->control |= FDMA_NODE_CTRL_DST_INCR;
422 		hw_node->saddr = fchan->cfg.dev_addr;
423 	}
424 
425 	hw_node->generic.sstride = 0;
426 	hw_node->generic.dstride = 0;
427 }
428 
429 static inline struct st_fdma_chan *st_fdma_prep_common(struct dma_chan *chan,
430 		size_t len, enum dma_transfer_direction direction)
431 {
432 	struct st_fdma_chan *fchan;
433 
434 	if (!chan || !len)
435 		return NULL;
436 
437 	fchan = to_st_fdma_chan(chan);
438 
439 	if (!is_slave_direction(direction)) {
440 		dev_err(fchan->fdev->dev, "bad direction?\n");
441 		return NULL;
442 	}
443 
444 	return fchan;
445 }
446 
447 static struct dma_async_tx_descriptor *st_fdma_prep_dma_cyclic(
448 		struct dma_chan *chan, dma_addr_t buf_addr, size_t len,
449 		size_t period_len, enum dma_transfer_direction direction,
450 		unsigned long flags)
451 {
452 	struct st_fdma_chan *fchan;
453 	struct st_fdma_desc *fdesc;
454 	int sg_len, i;
455 
456 	fchan = st_fdma_prep_common(chan, len, direction);
457 	if (!fchan)
458 		return NULL;
459 
460 	if (!period_len)
461 		return NULL;
462 
463 	if (config_reqctrl(fchan, direction)) {
464 		dev_err(fchan->fdev->dev, "bad width or direction\n");
465 		return NULL;
466 	}
467 
468 	/* the buffer length must be a multiple of period_len */
469 	if (len % period_len != 0) {
470 		dev_err(fchan->fdev->dev, "len is not multiple of period\n");
471 		return NULL;
472 	}
473 
474 	sg_len = len / period_len;
475 	fdesc = st_fdma_alloc_desc(fchan, sg_len);
476 	if (!fdesc) {
477 		dev_err(fchan->fdev->dev, "no memory for desc\n");
478 		return NULL;
479 	}
480 
481 	fdesc->iscyclic = true;
482 
483 	for (i = 0; i < sg_len; i++) {
484 		struct st_fdma_hw_node *hw_node = fdesc->node[i].desc;
485 
486 		hw_node->next = fdesc->node[(i + 1) % sg_len].pdesc;
487 
488 		hw_node->control =
489 			FDMA_NODE_CTRL_REQ_MAP_DREQ(fchan->dreq_line);
490 		hw_node->control |= FDMA_NODE_CTRL_INT_EON;
491 
492 		fill_hw_node(hw_node, fchan, direction);
493 
494 		if (direction == DMA_MEM_TO_DEV)
495 			hw_node->saddr = buf_addr + (i * period_len);
496 		else
497 			hw_node->daddr = buf_addr + (i * period_len);
498 
499 		hw_node->nbytes = period_len;
500 		hw_node->generic.length = period_len;
501 	}
502 
503 	return vchan_tx_prep(&fchan->vchan, &fdesc->vdesc, flags);
504 }
505 
506 static struct dma_async_tx_descriptor *st_fdma_prep_slave_sg(
507 		struct dma_chan *chan, struct scatterlist *sgl,
508 		unsigned int sg_len, enum dma_transfer_direction direction,
509 		unsigned long flags, void *context)
510 {
511 	struct st_fdma_chan *fchan;
512 	struct st_fdma_desc *fdesc;
513 	struct st_fdma_hw_node *hw_node;
514 	struct scatterlist *sg;
515 	int i;
516 
517 	fchan = st_fdma_prep_common(chan, sg_len, direction);
518 	if (!fchan)
519 		return NULL;
520 
521 	if (!sgl)
522 		return NULL;
523 
524 	fdesc = st_fdma_alloc_desc(fchan, sg_len);
525 	if (!fdesc) {
526 		dev_err(fchan->fdev->dev, "no memory for desc\n");
527 		return NULL;
528 	}
529 
530 	fdesc->iscyclic = false;
531 
532 	for_each_sg(sgl, sg, sg_len, i) {
533 		hw_node = fdesc->node[i].desc;
534 
535 		hw_node->next = fdesc->node[(i + 1) % sg_len].pdesc;
536 		hw_node->control = FDMA_NODE_CTRL_REQ_MAP_DREQ(fchan->dreq_line);
537 
538 		fill_hw_node(hw_node, fchan, direction);
539 
540 		if (direction == DMA_MEM_TO_DEV)
541 			hw_node->saddr = sg_dma_address(sg);
542 		else
543 			hw_node->daddr = sg_dma_address(sg);
544 
545 		hw_node->nbytes = sg_dma_len(sg);
546 		hw_node->generic.length = sg_dma_len(sg);
547 	}
548 
549 	/* interrupt at end of last node */
550 	hw_node->control |= FDMA_NODE_CTRL_INT_EON;
551 
552 	return vchan_tx_prep(&fchan->vchan, &fdesc->vdesc, flags);
553 }
554 
555 static size_t st_fdma_desc_residue(struct st_fdma_chan *fchan,
556 				   struct virt_dma_desc *vdesc,
557 				   bool in_progress)
558 {
559 	struct st_fdma_desc *fdesc = fchan->fdesc;
560 	size_t residue = 0;
561 	dma_addr_t cur_addr = 0;
562 	int i;
563 
564 	if (in_progress) {
565 		cur_addr = fchan_read(fchan, FDMA_CH_CMD_OFST);
566 		cur_addr &= FDMA_CH_CMD_DATA_MASK;
567 	}
568 
569 	for (i = fchan->fdesc->n_nodes - 1 ; i >= 0; i--) {
570 		if (cur_addr == fdesc->node[i].pdesc) {
571 			residue += fnode_read(fchan, FDMA_CNTN_OFST);
572 			break;
573 		}
574 		residue += fdesc->node[i].desc->nbytes;
575 	}
576 
577 	return residue;
578 }
579 
580 static enum dma_status st_fdma_tx_status(struct dma_chan *chan,
581 					 dma_cookie_t cookie,
582 					 struct dma_tx_state *txstate)
583 {
584 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
585 	struct virt_dma_desc *vd;
586 	enum dma_status ret;
587 	unsigned long flags;
588 
589 	ret = dma_cookie_status(chan, cookie, txstate);
590 	if (ret == DMA_COMPLETE || !txstate)
591 		return ret;
592 
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);
597 	else if (vd)
598 		txstate->residue = st_fdma_desc_residue(fchan, vd, false);
599 	else
600 		txstate->residue = 0;
601 
602 	spin_unlock_irqrestore(&fchan->vchan.lock, flags);
603 
604 	return ret;
605 }
606 
607 static void st_fdma_issue_pending(struct dma_chan *chan)
608 {
609 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
610 	unsigned long flags;
611 
612 	spin_lock_irqsave(&fchan->vchan.lock, flags);
613 
614 	if (vchan_issue_pending(&fchan->vchan) && !fchan->fdesc)
615 		st_fdma_xfer_desc(fchan);
616 
617 	spin_unlock_irqrestore(&fchan->vchan.lock, flags);
618 }
619 
620 static int st_fdma_pause(struct dma_chan *chan)
621 {
622 	unsigned long flags;
623 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
624 	int ch_id = fchan->vchan.chan.chan_id;
625 	unsigned long cmd = FDMA_CMD_PAUSE(ch_id);
626 
627 	dev_dbg(fchan->fdev->dev, "pause chan:%d\n", ch_id);
628 
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);
633 
634 	return 0;
635 }
636 
637 static int st_fdma_resume(struct dma_chan *chan)
638 {
639 	unsigned long flags;
640 	unsigned long val;
641 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
642 	int ch_id = fchan->vchan.chan.chan_id;
643 
644 	dev_dbg(fchan->fdev->dev, "resume chan:%d\n", ch_id);
645 
646 	spin_lock_irqsave(&fchan->vchan.lock, flags);
647 	if (fchan->fdesc) {
648 		val = fchan_read(fchan, FDMA_CH_CMD_OFST);
649 		val &= FDMA_CH_CMD_DATA_MASK;
650 		fchan_write(fchan, val, FDMA_CH_CMD_OFST);
651 	}
652 	spin_unlock_irqrestore(&fchan->vchan.lock, flags);
653 
654 	return 0;
655 }
656 
657 static int st_fdma_terminate_all(struct dma_chan *chan)
658 {
659 	unsigned long flags;
660 	LIST_HEAD(head);
661 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
662 	int ch_id = fchan->vchan.chan.chan_id;
663 	unsigned long cmd = FDMA_CMD_PAUSE(ch_id);
664 
665 	dev_dbg(fchan->fdev->dev, "terminate chan:%d\n", ch_id);
666 
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);
673 
674 	return 0;
675 }
676 
677 static int st_fdma_slave_config(struct dma_chan *chan,
678 				struct dma_slave_config *slave_cfg)
679 {
680 	struct st_fdma_chan *fchan = to_st_fdma_chan(chan);
681 
682 	memcpy(&fchan->scfg, slave_cfg, sizeof(fchan->scfg));
683 	return 0;
684 }
685 
686 static const struct st_fdma_driverdata fdma_mpe31_stih407_11 = {
687 	.name = "STiH407",
688 	.id = 0,
689 };
690 
691 static const struct st_fdma_driverdata fdma_mpe31_stih407_12 = {
692 	.name = "STiH407",
693 	.id = 1,
694 };
695 
696 static const struct st_fdma_driverdata fdma_mpe31_stih407_13 = {
697 	.name = "STiH407",
698 	.id = 2,
699 };
700 
701 static const struct of_device_id st_fdma_match[] = {
702 	{ .compatible = "st,stih407-fdma-mpe31-11"
703 	  , .data = &fdma_mpe31_stih407_11 },
704 	{ .compatible = "st,stih407-fdma-mpe31-12"
705 	  , .data = &fdma_mpe31_stih407_12 },
706 	{ .compatible = "st,stih407-fdma-mpe31-13"
707 	  , .data = &fdma_mpe31_stih407_13 },
708 	{},
709 };
710 MODULE_DEVICE_TABLE(of, st_fdma_match);
711 
712 static int st_fdma_parse_dt(struct platform_device *pdev,
713 			const struct st_fdma_driverdata *drvdata,
714 			struct st_fdma_dev *fdev)
715 {
716 	snprintf(fdev->fw_name, FW_NAME_SIZE, "fdma_%s_%d.elf",
717 		drvdata->name, drvdata->id);
718 
719 	return of_property_read_u32(pdev->dev.of_node, "dma-channels",
720 				    &fdev->nr_channels);
721 }
722 #define FDMA_DMA_BUSWIDTHS	(BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
723 				 BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
724 				 BIT(DMA_SLAVE_BUSWIDTH_3_BYTES) | \
725 				 BIT(DMA_SLAVE_BUSWIDTH_4_BYTES))
726 
727 static void st_fdma_free(struct st_fdma_dev *fdev)
728 {
729 	struct st_fdma_chan *fchan;
730 	int i;
731 
732 	for (i = 0; i < fdev->nr_channels; i++) {
733 		fchan = &fdev->chans[i];
734 		list_del(&fchan->vchan.chan.device_node);
735 		tasklet_kill(&fchan->vchan.task);
736 	}
737 }
738 
739 static int st_fdma_probe(struct platform_device *pdev)
740 {
741 	struct st_fdma_dev *fdev;
742 	const struct of_device_id *match;
743 	struct device_node *np = pdev->dev.of_node;
744 	const struct st_fdma_driverdata *drvdata;
745 	int ret, i;
746 
747 	match = of_match_device((st_fdma_match), &pdev->dev);
748 	if (!match || !match->data) {
749 		dev_err(&pdev->dev, "No device match found\n");
750 		return -ENODEV;
751 	}
752 
753 	drvdata = match->data;
754 
755 	fdev = devm_kzalloc(&pdev->dev, sizeof(*fdev), GFP_KERNEL);
756 	if (!fdev)
757 		return -ENOMEM;
758 
759 	ret = st_fdma_parse_dt(pdev, drvdata, fdev);
760 	if (ret) {
761 		dev_err(&pdev->dev, "unable to find platform data\n");
762 		goto err;
763 	}
764 
765 	fdev->chans = devm_kcalloc(&pdev->dev, fdev->nr_channels,
766 				   sizeof(struct st_fdma_chan), GFP_KERNEL);
767 	if (!fdev->chans)
768 		return -ENOMEM;
769 
770 	fdev->dev = &pdev->dev;
771 	fdev->drvdata = drvdata;
772 	platform_set_drvdata(pdev, fdev);
773 
774 	fdev->irq = platform_get_irq(pdev, 0);
775 	if (fdev->irq < 0)
776 		return -EINVAL;
777 
778 	ret = devm_request_irq(&pdev->dev, fdev->irq, st_fdma_irq_handler, 0,
779 			       dev_name(&pdev->dev), fdev);
780 	if (ret) {
781 		dev_err(&pdev->dev, "Failed to request irq (%d)\n", ret);
782 		goto err;
783 	}
784 
785 	fdev->slim_rproc = st_slim_rproc_alloc(pdev, fdev->fw_name);
786 	if (IS_ERR(fdev->slim_rproc)) {
787 		ret = PTR_ERR(fdev->slim_rproc);
788 		dev_err(&pdev->dev, "slim_rproc_alloc failed (%d)\n", ret);
789 		goto err;
790 	}
791 
792 	/* Initialise list of FDMA channels */
793 	INIT_LIST_HEAD(&fdev->dma_device.channels);
794 	for (i = 0; i < fdev->nr_channels; i++) {
795 		struct st_fdma_chan *fchan = &fdev->chans[i];
796 
797 		fchan->fdev = fdev;
798 		fchan->vchan.desc_free = st_fdma_free_desc;
799 		vchan_init(&fchan->vchan, &fdev->dma_device);
800 	}
801 
802 	/* Initialise the FDMA dreq (reserve 0 & 31 for FDMA use) */
803 	fdev->dreq_mask = BIT(0) | BIT(31);
804 
805 	dma_cap_set(DMA_SLAVE, fdev->dma_device.cap_mask);
806 	dma_cap_set(DMA_CYCLIC, fdev->dma_device.cap_mask);
807 	dma_cap_set(DMA_MEMCPY, fdev->dma_device.cap_mask);
808 
809 	fdev->dma_device.dev = &pdev->dev;
810 	fdev->dma_device.device_alloc_chan_resources = st_fdma_alloc_chan_res;
811 	fdev->dma_device.device_free_chan_resources = st_fdma_free_chan_res;
812 	fdev->dma_device.device_prep_dma_cyclic	= st_fdma_prep_dma_cyclic;
813 	fdev->dma_device.device_prep_slave_sg = st_fdma_prep_slave_sg;
814 	fdev->dma_device.device_prep_dma_memcpy = st_fdma_prep_dma_memcpy;
815 	fdev->dma_device.device_tx_status = st_fdma_tx_status;
816 	fdev->dma_device.device_issue_pending = st_fdma_issue_pending;
817 	fdev->dma_device.device_terminate_all = st_fdma_terminate_all;
818 	fdev->dma_device.device_config = st_fdma_slave_config;
819 	fdev->dma_device.device_pause = st_fdma_pause;
820 	fdev->dma_device.device_resume = st_fdma_resume;
821 
822 	fdev->dma_device.src_addr_widths = FDMA_DMA_BUSWIDTHS;
823 	fdev->dma_device.dst_addr_widths = FDMA_DMA_BUSWIDTHS;
824 	fdev->dma_device.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
825 	fdev->dma_device.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
826 
827 	ret = dmaenginem_async_device_register(&fdev->dma_device);
828 	if (ret) {
829 		dev_err(&pdev->dev,
830 			"Failed to register DMA device (%d)\n", ret);
831 		goto err_rproc;
832 	}
833 
834 	ret = of_dma_controller_register(np, st_fdma_of_xlate, fdev);
835 	if (ret) {
836 		dev_err(&pdev->dev,
837 			"Failed to register controller (%d)\n", ret);
838 		goto err_rproc;
839 	}
840 
841 	dev_info(&pdev->dev, "ST FDMA engine driver, irq:%d\n", fdev->irq);
842 
843 	return 0;
844 
845 err_rproc:
846 	st_fdma_free(fdev);
847 	st_slim_rproc_put(fdev->slim_rproc);
848 err:
849 	return ret;
850 }
851 
852 static int st_fdma_remove(struct platform_device *pdev)
853 {
854 	struct st_fdma_dev *fdev = platform_get_drvdata(pdev);
855 
856 	devm_free_irq(&pdev->dev, fdev->irq, fdev);
857 	st_slim_rproc_put(fdev->slim_rproc);
858 	of_dma_controller_free(pdev->dev.of_node);
859 
860 	return 0;
861 }
862 
863 static struct platform_driver st_fdma_platform_driver = {
864 	.driver = {
865 		.name = DRIVER_NAME,
866 		.of_match_table = st_fdma_match,
867 	},
868 	.probe = st_fdma_probe,
869 	.remove = st_fdma_remove,
870 };
871 module_platform_driver(st_fdma_platform_driver);
872 
873 MODULE_LICENSE("GPL v2");
874 MODULE_DESCRIPTION("STMicroelectronics FDMA engine driver");
875 MODULE_AUTHOR("Ludovic.barre <Ludovic.barre@st.com>");
876 MODULE_AUTHOR("Peter Griffin <peter.griffin@linaro.org>");
877 MODULE_ALIAS("platform: " DRIVER_NAME);
878