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