xref: /linux/drivers/dma/dw-edma/dw-edma-core.c (revision 02680c23d7b3febe45ea3d4f9818c2b2dc89020a)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2018-2019 Synopsys, Inc. and/or its affiliates.
4  * Synopsys DesignWare eDMA core driver
5  *
6  * Author: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
7  */
8 
9 #include <linux/module.h>
10 #include <linux/device.h>
11 #include <linux/kernel.h>
12 #include <linux/pm_runtime.h>
13 #include <linux/dmaengine.h>
14 #include <linux/err.h>
15 #include <linux/interrupt.h>
16 #include <linux/irq.h>
17 #include <linux/dma/edma.h>
18 #include <linux/dma-mapping.h>
19 
20 #include "dw-edma-core.h"
21 #include "dw-edma-v0-core.h"
22 #include "../dmaengine.h"
23 #include "../virt-dma.h"
24 
25 static inline
26 struct device *dchan2dev(struct dma_chan *dchan)
27 {
28 	return &dchan->dev->device;
29 }
30 
31 static inline
32 struct device *chan2dev(struct dw_edma_chan *chan)
33 {
34 	return &chan->vc.chan.dev->device;
35 }
36 
37 static inline
38 struct dw_edma_desc *vd2dw_edma_desc(struct virt_dma_desc *vd)
39 {
40 	return container_of(vd, struct dw_edma_desc, vd);
41 }
42 
43 static struct dw_edma_burst *dw_edma_alloc_burst(struct dw_edma_chunk *chunk)
44 {
45 	struct dw_edma_burst *burst;
46 
47 	burst = kzalloc(sizeof(*burst), GFP_NOWAIT);
48 	if (unlikely(!burst))
49 		return NULL;
50 
51 	INIT_LIST_HEAD(&burst->list);
52 	if (chunk->burst) {
53 		/* Create and add new element into the linked list */
54 		chunk->bursts_alloc++;
55 		list_add_tail(&burst->list, &chunk->burst->list);
56 	} else {
57 		/* List head */
58 		chunk->bursts_alloc = 0;
59 		chunk->burst = burst;
60 	}
61 
62 	return burst;
63 }
64 
65 static struct dw_edma_chunk *dw_edma_alloc_chunk(struct dw_edma_desc *desc)
66 {
67 	struct dw_edma_chan *chan = desc->chan;
68 	struct dw_edma *dw = chan->chip->dw;
69 	struct dw_edma_chunk *chunk;
70 
71 	chunk = kzalloc(sizeof(*chunk), GFP_NOWAIT);
72 	if (unlikely(!chunk))
73 		return NULL;
74 
75 	INIT_LIST_HEAD(&chunk->list);
76 	chunk->chan = chan;
77 	/* Toggling change bit (CB) in each chunk, this is a mechanism to
78 	 * inform the eDMA HW block that this is a new linked list ready
79 	 * to be consumed.
80 	 *  - Odd chunks originate CB equal to 0
81 	 *  - Even chunks originate CB equal to 1
82 	 */
83 	chunk->cb = !(desc->chunks_alloc % 2);
84 	if (chan->dir == EDMA_DIR_WRITE) {
85 		chunk->ll_region.paddr = dw->ll_region_wr[chan->id].paddr;
86 		chunk->ll_region.vaddr = dw->ll_region_wr[chan->id].vaddr;
87 	} else {
88 		chunk->ll_region.paddr = dw->ll_region_rd[chan->id].paddr;
89 		chunk->ll_region.vaddr = dw->ll_region_rd[chan->id].vaddr;
90 	}
91 
92 	if (desc->chunk) {
93 		/* Create and add new element into the linked list */
94 		if (!dw_edma_alloc_burst(chunk)) {
95 			kfree(chunk);
96 			return NULL;
97 		}
98 		desc->chunks_alloc++;
99 		list_add_tail(&chunk->list, &desc->chunk->list);
100 	} else {
101 		/* List head */
102 		chunk->burst = NULL;
103 		desc->chunks_alloc = 0;
104 		desc->chunk = chunk;
105 	}
106 
107 	return chunk;
108 }
109 
110 static struct dw_edma_desc *dw_edma_alloc_desc(struct dw_edma_chan *chan)
111 {
112 	struct dw_edma_desc *desc;
113 
114 	desc = kzalloc(sizeof(*desc), GFP_NOWAIT);
115 	if (unlikely(!desc))
116 		return NULL;
117 
118 	desc->chan = chan;
119 	if (!dw_edma_alloc_chunk(desc)) {
120 		kfree(desc);
121 		return NULL;
122 	}
123 
124 	return desc;
125 }
126 
127 static void dw_edma_free_burst(struct dw_edma_chunk *chunk)
128 {
129 	struct dw_edma_burst *child, *_next;
130 
131 	/* Remove all the list elements */
132 	list_for_each_entry_safe(child, _next, &chunk->burst->list, list) {
133 		list_del(&child->list);
134 		kfree(child);
135 		chunk->bursts_alloc--;
136 	}
137 
138 	/* Remove the list head */
139 	kfree(child);
140 	chunk->burst = NULL;
141 }
142 
143 static void dw_edma_free_chunk(struct dw_edma_desc *desc)
144 {
145 	struct dw_edma_chunk *child, *_next;
146 
147 	if (!desc->chunk)
148 		return;
149 
150 	/* Remove all the list elements */
151 	list_for_each_entry_safe(child, _next, &desc->chunk->list, list) {
152 		dw_edma_free_burst(child);
153 		list_del(&child->list);
154 		kfree(child);
155 		desc->chunks_alloc--;
156 	}
157 
158 	/* Remove the list head */
159 	kfree(child);
160 	desc->chunk = NULL;
161 }
162 
163 static void dw_edma_free_desc(struct dw_edma_desc *desc)
164 {
165 	dw_edma_free_chunk(desc);
166 	kfree(desc);
167 }
168 
169 static void vchan_free_desc(struct virt_dma_desc *vdesc)
170 {
171 	dw_edma_free_desc(vd2dw_edma_desc(vdesc));
172 }
173 
174 static void dw_edma_start_transfer(struct dw_edma_chan *chan)
175 {
176 	struct dw_edma_chunk *child;
177 	struct dw_edma_desc *desc;
178 	struct virt_dma_desc *vd;
179 
180 	vd = vchan_next_desc(&chan->vc);
181 	if (!vd)
182 		return;
183 
184 	desc = vd2dw_edma_desc(vd);
185 	if (!desc)
186 		return;
187 
188 	child = list_first_entry_or_null(&desc->chunk->list,
189 					 struct dw_edma_chunk, list);
190 	if (!child)
191 		return;
192 
193 	dw_edma_v0_core_start(child, !desc->xfer_sz);
194 	desc->xfer_sz += child->ll_region.sz;
195 	dw_edma_free_burst(child);
196 	list_del(&child->list);
197 	kfree(child);
198 	desc->chunks_alloc--;
199 }
200 
201 static int dw_edma_device_config(struct dma_chan *dchan,
202 				 struct dma_slave_config *config)
203 {
204 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
205 
206 	memcpy(&chan->config, config, sizeof(*config));
207 	chan->configured = true;
208 
209 	return 0;
210 }
211 
212 static int dw_edma_device_pause(struct dma_chan *dchan)
213 {
214 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
215 	int err = 0;
216 
217 	if (!chan->configured)
218 		err = -EPERM;
219 	else if (chan->status != EDMA_ST_BUSY)
220 		err = -EPERM;
221 	else if (chan->request != EDMA_REQ_NONE)
222 		err = -EPERM;
223 	else
224 		chan->request = EDMA_REQ_PAUSE;
225 
226 	return err;
227 }
228 
229 static int dw_edma_device_resume(struct dma_chan *dchan)
230 {
231 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
232 	int err = 0;
233 
234 	if (!chan->configured) {
235 		err = -EPERM;
236 	} else if (chan->status != EDMA_ST_PAUSE) {
237 		err = -EPERM;
238 	} else if (chan->request != EDMA_REQ_NONE) {
239 		err = -EPERM;
240 	} else {
241 		chan->status = EDMA_ST_BUSY;
242 		dw_edma_start_transfer(chan);
243 	}
244 
245 	return err;
246 }
247 
248 static int dw_edma_device_terminate_all(struct dma_chan *dchan)
249 {
250 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
251 	int err = 0;
252 	LIST_HEAD(head);
253 
254 	if (!chan->configured) {
255 		/* Do nothing */
256 	} else if (chan->status == EDMA_ST_PAUSE) {
257 		chan->status = EDMA_ST_IDLE;
258 		chan->configured = false;
259 	} else if (chan->status == EDMA_ST_IDLE) {
260 		chan->configured = false;
261 	} else if (dw_edma_v0_core_ch_status(chan) == DMA_COMPLETE) {
262 		/*
263 		 * The channel is in a false BUSY state, probably didn't
264 		 * receive or lost an interrupt
265 		 */
266 		chan->status = EDMA_ST_IDLE;
267 		chan->configured = false;
268 	} else if (chan->request > EDMA_REQ_PAUSE) {
269 		err = -EPERM;
270 	} else {
271 		chan->request = EDMA_REQ_STOP;
272 	}
273 
274 	return err;
275 }
276 
277 static void dw_edma_device_issue_pending(struct dma_chan *dchan)
278 {
279 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
280 	unsigned long flags;
281 
282 	spin_lock_irqsave(&chan->vc.lock, flags);
283 	if (chan->configured && chan->request == EDMA_REQ_NONE &&
284 	    chan->status == EDMA_ST_IDLE && vchan_issue_pending(&chan->vc)) {
285 		chan->status = EDMA_ST_BUSY;
286 		dw_edma_start_transfer(chan);
287 	}
288 	spin_unlock_irqrestore(&chan->vc.lock, flags);
289 }
290 
291 static enum dma_status
292 dw_edma_device_tx_status(struct dma_chan *dchan, dma_cookie_t cookie,
293 			 struct dma_tx_state *txstate)
294 {
295 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
296 	struct dw_edma_desc *desc;
297 	struct virt_dma_desc *vd;
298 	unsigned long flags;
299 	enum dma_status ret;
300 	u32 residue = 0;
301 
302 	ret = dma_cookie_status(dchan, cookie, txstate);
303 	if (ret == DMA_COMPLETE)
304 		return ret;
305 
306 	if (ret == DMA_IN_PROGRESS && chan->status == EDMA_ST_PAUSE)
307 		ret = DMA_PAUSED;
308 
309 	if (!txstate)
310 		goto ret_residue;
311 
312 	spin_lock_irqsave(&chan->vc.lock, flags);
313 	vd = vchan_find_desc(&chan->vc, cookie);
314 	if (vd) {
315 		desc = vd2dw_edma_desc(vd);
316 		if (desc)
317 			residue = desc->alloc_sz - desc->xfer_sz;
318 	}
319 	spin_unlock_irqrestore(&chan->vc.lock, flags);
320 
321 ret_residue:
322 	dma_set_residue(txstate, residue);
323 
324 	return ret;
325 }
326 
327 static struct dma_async_tx_descriptor *
328 dw_edma_device_transfer(struct dw_edma_transfer *xfer)
329 {
330 	struct dw_edma_chan *chan = dchan2dw_edma_chan(xfer->dchan);
331 	enum dma_transfer_direction dir = xfer->direction;
332 	phys_addr_t src_addr, dst_addr;
333 	struct scatterlist *sg = NULL;
334 	struct dw_edma_chunk *chunk;
335 	struct dw_edma_burst *burst;
336 	struct dw_edma_desc *desc;
337 	u32 cnt = 0;
338 	int i;
339 
340 	if (!chan->configured)
341 		return NULL;
342 
343 	switch (chan->config.direction) {
344 	case DMA_DEV_TO_MEM: /* local DMA */
345 		if (dir == DMA_DEV_TO_MEM && chan->dir == EDMA_DIR_READ)
346 			break;
347 		return NULL;
348 	case DMA_MEM_TO_DEV: /* local DMA */
349 		if (dir == DMA_MEM_TO_DEV && chan->dir == EDMA_DIR_WRITE)
350 			break;
351 		return NULL;
352 	default: /* remote DMA */
353 		if (dir == DMA_MEM_TO_DEV && chan->dir == EDMA_DIR_READ)
354 			break;
355 		if (dir == DMA_DEV_TO_MEM && chan->dir == EDMA_DIR_WRITE)
356 			break;
357 		return NULL;
358 	}
359 
360 	if (xfer->type == EDMA_XFER_CYCLIC) {
361 		if (!xfer->xfer.cyclic.len || !xfer->xfer.cyclic.cnt)
362 			return NULL;
363 	} else if (xfer->type == EDMA_XFER_SCATTER_GATHER) {
364 		if (xfer->xfer.sg.len < 1)
365 			return NULL;
366 	} else if (xfer->type == EDMA_XFER_INTERLEAVED) {
367 		if (!xfer->xfer.il->numf)
368 			return NULL;
369 		if (xfer->xfer.il->numf > 0 && xfer->xfer.il->frame_size > 0)
370 			return NULL;
371 	} else {
372 		return NULL;
373 	}
374 
375 	desc = dw_edma_alloc_desc(chan);
376 	if (unlikely(!desc))
377 		goto err_alloc;
378 
379 	chunk = dw_edma_alloc_chunk(desc);
380 	if (unlikely(!chunk))
381 		goto err_alloc;
382 
383 	if (xfer->type == EDMA_XFER_INTERLEAVED) {
384 		src_addr = xfer->xfer.il->src_start;
385 		dst_addr = xfer->xfer.il->dst_start;
386 	} else {
387 		src_addr = chan->config.src_addr;
388 		dst_addr = chan->config.dst_addr;
389 	}
390 
391 	if (xfer->type == EDMA_XFER_CYCLIC) {
392 		cnt = xfer->xfer.cyclic.cnt;
393 	} else if (xfer->type == EDMA_XFER_SCATTER_GATHER) {
394 		cnt = xfer->xfer.sg.len;
395 		sg = xfer->xfer.sg.sgl;
396 	} else if (xfer->type == EDMA_XFER_INTERLEAVED) {
397 		if (xfer->xfer.il->numf > 0)
398 			cnt = xfer->xfer.il->numf;
399 		else
400 			cnt = xfer->xfer.il->frame_size;
401 	}
402 
403 	for (i = 0; i < cnt; i++) {
404 		if (xfer->type == EDMA_XFER_SCATTER_GATHER && !sg)
405 			break;
406 
407 		if (chunk->bursts_alloc == chan->ll_max) {
408 			chunk = dw_edma_alloc_chunk(desc);
409 			if (unlikely(!chunk))
410 				goto err_alloc;
411 		}
412 
413 		burst = dw_edma_alloc_burst(chunk);
414 		if (unlikely(!burst))
415 			goto err_alloc;
416 
417 		if (xfer->type == EDMA_XFER_CYCLIC)
418 			burst->sz = xfer->xfer.cyclic.len;
419 		else if (xfer->type == EDMA_XFER_SCATTER_GATHER)
420 			burst->sz = sg_dma_len(sg);
421 		else if (xfer->type == EDMA_XFER_INTERLEAVED)
422 			burst->sz = xfer->xfer.il->sgl[i].size;
423 
424 		chunk->ll_region.sz += burst->sz;
425 		desc->alloc_sz += burst->sz;
426 
427 		if (chan->dir == EDMA_DIR_WRITE) {
428 			burst->sar = src_addr;
429 			if (xfer->type == EDMA_XFER_CYCLIC) {
430 				burst->dar = xfer->xfer.cyclic.paddr;
431 			} else if (xfer->type == EDMA_XFER_SCATTER_GATHER) {
432 				src_addr += sg_dma_len(sg);
433 				burst->dar = sg_dma_address(sg);
434 				/* Unlike the typical assumption by other
435 				 * drivers/IPs the peripheral memory isn't
436 				 * a FIFO memory, in this case, it's a
437 				 * linear memory and that why the source
438 				 * and destination addresses are increased
439 				 * by the same portion (data length)
440 				 */
441 			}
442 		} else {
443 			burst->dar = dst_addr;
444 			if (xfer->type == EDMA_XFER_CYCLIC) {
445 				burst->sar = xfer->xfer.cyclic.paddr;
446 			} else if (xfer->type == EDMA_XFER_SCATTER_GATHER) {
447 				dst_addr += sg_dma_len(sg);
448 				burst->sar = sg_dma_address(sg);
449 				/* Unlike the typical assumption by other
450 				 * drivers/IPs the peripheral memory isn't
451 				 * a FIFO memory, in this case, it's a
452 				 * linear memory and that why the source
453 				 * and destination addresses are increased
454 				 * by the same portion (data length)
455 				 */
456 			}
457 		}
458 
459 		if (xfer->type == EDMA_XFER_SCATTER_GATHER) {
460 			sg = sg_next(sg);
461 		} else if (xfer->type == EDMA_XFER_INTERLEAVED &&
462 			   xfer->xfer.il->frame_size > 0) {
463 			struct dma_interleaved_template *il = xfer->xfer.il;
464 			struct data_chunk *dc = &il->sgl[i];
465 
466 			if (il->src_sgl) {
467 				src_addr += burst->sz;
468 				src_addr += dmaengine_get_src_icg(il, dc);
469 			}
470 
471 			if (il->dst_sgl) {
472 				dst_addr += burst->sz;
473 				dst_addr += dmaengine_get_dst_icg(il, dc);
474 			}
475 		}
476 	}
477 
478 	return vchan_tx_prep(&chan->vc, &desc->vd, xfer->flags);
479 
480 err_alloc:
481 	if (desc)
482 		dw_edma_free_desc(desc);
483 
484 	return NULL;
485 }
486 
487 static struct dma_async_tx_descriptor *
488 dw_edma_device_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
489 			     unsigned int len,
490 			     enum dma_transfer_direction direction,
491 			     unsigned long flags, void *context)
492 {
493 	struct dw_edma_transfer xfer;
494 
495 	xfer.dchan = dchan;
496 	xfer.direction = direction;
497 	xfer.xfer.sg.sgl = sgl;
498 	xfer.xfer.sg.len = len;
499 	xfer.flags = flags;
500 	xfer.type = EDMA_XFER_SCATTER_GATHER;
501 
502 	return dw_edma_device_transfer(&xfer);
503 }
504 
505 static struct dma_async_tx_descriptor *
506 dw_edma_device_prep_dma_cyclic(struct dma_chan *dchan, dma_addr_t paddr,
507 			       size_t len, size_t count,
508 			       enum dma_transfer_direction direction,
509 			       unsigned long flags)
510 {
511 	struct dw_edma_transfer xfer;
512 
513 	xfer.dchan = dchan;
514 	xfer.direction = direction;
515 	xfer.xfer.cyclic.paddr = paddr;
516 	xfer.xfer.cyclic.len = len;
517 	xfer.xfer.cyclic.cnt = count;
518 	xfer.flags = flags;
519 	xfer.type = EDMA_XFER_CYCLIC;
520 
521 	return dw_edma_device_transfer(&xfer);
522 }
523 
524 static struct dma_async_tx_descriptor *
525 dw_edma_device_prep_interleaved_dma(struct dma_chan *dchan,
526 				    struct dma_interleaved_template *ilt,
527 				    unsigned long flags)
528 {
529 	struct dw_edma_transfer xfer;
530 
531 	xfer.dchan = dchan;
532 	xfer.direction = ilt->dir;
533 	xfer.xfer.il = ilt;
534 	xfer.flags = flags;
535 	xfer.type = EDMA_XFER_INTERLEAVED;
536 
537 	return dw_edma_device_transfer(&xfer);
538 }
539 
540 static void dw_edma_done_interrupt(struct dw_edma_chan *chan)
541 {
542 	struct dw_edma_desc *desc;
543 	struct virt_dma_desc *vd;
544 	unsigned long flags;
545 
546 	dw_edma_v0_core_clear_done_int(chan);
547 
548 	spin_lock_irqsave(&chan->vc.lock, flags);
549 	vd = vchan_next_desc(&chan->vc);
550 	if (vd) {
551 		switch (chan->request) {
552 		case EDMA_REQ_NONE:
553 			desc = vd2dw_edma_desc(vd);
554 			if (desc->chunks_alloc) {
555 				chan->status = EDMA_ST_BUSY;
556 				dw_edma_start_transfer(chan);
557 			} else {
558 				list_del(&vd->node);
559 				vchan_cookie_complete(vd);
560 				chan->status = EDMA_ST_IDLE;
561 			}
562 			break;
563 
564 		case EDMA_REQ_STOP:
565 			list_del(&vd->node);
566 			vchan_cookie_complete(vd);
567 			chan->request = EDMA_REQ_NONE;
568 			chan->status = EDMA_ST_IDLE;
569 			break;
570 
571 		case EDMA_REQ_PAUSE:
572 			chan->request = EDMA_REQ_NONE;
573 			chan->status = EDMA_ST_PAUSE;
574 			break;
575 
576 		default:
577 			break;
578 		}
579 	}
580 	spin_unlock_irqrestore(&chan->vc.lock, flags);
581 }
582 
583 static void dw_edma_abort_interrupt(struct dw_edma_chan *chan)
584 {
585 	struct virt_dma_desc *vd;
586 	unsigned long flags;
587 
588 	dw_edma_v0_core_clear_abort_int(chan);
589 
590 	spin_lock_irqsave(&chan->vc.lock, flags);
591 	vd = vchan_next_desc(&chan->vc);
592 	if (vd) {
593 		list_del(&vd->node);
594 		vchan_cookie_complete(vd);
595 	}
596 	spin_unlock_irqrestore(&chan->vc.lock, flags);
597 	chan->request = EDMA_REQ_NONE;
598 	chan->status = EDMA_ST_IDLE;
599 }
600 
601 static irqreturn_t dw_edma_interrupt(int irq, void *data, bool write)
602 {
603 	struct dw_edma_irq *dw_irq = data;
604 	struct dw_edma *dw = dw_irq->dw;
605 	unsigned long total, pos, val;
606 	unsigned long off;
607 	u32 mask;
608 
609 	if (write) {
610 		total = dw->wr_ch_cnt;
611 		off = 0;
612 		mask = dw_irq->wr_mask;
613 	} else {
614 		total = dw->rd_ch_cnt;
615 		off = dw->wr_ch_cnt;
616 		mask = dw_irq->rd_mask;
617 	}
618 
619 	val = dw_edma_v0_core_status_done_int(dw, write ?
620 							  EDMA_DIR_WRITE :
621 							  EDMA_DIR_READ);
622 	val &= mask;
623 	for_each_set_bit(pos, &val, total) {
624 		struct dw_edma_chan *chan = &dw->chan[pos + off];
625 
626 		dw_edma_done_interrupt(chan);
627 	}
628 
629 	val = dw_edma_v0_core_status_abort_int(dw, write ?
630 							   EDMA_DIR_WRITE :
631 							   EDMA_DIR_READ);
632 	val &= mask;
633 	for_each_set_bit(pos, &val, total) {
634 		struct dw_edma_chan *chan = &dw->chan[pos + off];
635 
636 		dw_edma_abort_interrupt(chan);
637 	}
638 
639 	return IRQ_HANDLED;
640 }
641 
642 static inline irqreturn_t dw_edma_interrupt_write(int irq, void *data)
643 {
644 	return dw_edma_interrupt(irq, data, true);
645 }
646 
647 static inline irqreturn_t dw_edma_interrupt_read(int irq, void *data)
648 {
649 	return dw_edma_interrupt(irq, data, false);
650 }
651 
652 static irqreturn_t dw_edma_interrupt_common(int irq, void *data)
653 {
654 	dw_edma_interrupt(irq, data, true);
655 	dw_edma_interrupt(irq, data, false);
656 
657 	return IRQ_HANDLED;
658 }
659 
660 static int dw_edma_alloc_chan_resources(struct dma_chan *dchan)
661 {
662 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
663 
664 	if (chan->status != EDMA_ST_IDLE)
665 		return -EBUSY;
666 
667 	pm_runtime_get(chan->chip->dev);
668 
669 	return 0;
670 }
671 
672 static void dw_edma_free_chan_resources(struct dma_chan *dchan)
673 {
674 	unsigned long timeout = jiffies + msecs_to_jiffies(5000);
675 	struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan);
676 	int ret;
677 
678 	while (time_before(jiffies, timeout)) {
679 		ret = dw_edma_device_terminate_all(dchan);
680 		if (!ret)
681 			break;
682 
683 		if (time_after_eq(jiffies, timeout))
684 			return;
685 
686 		cpu_relax();
687 	}
688 
689 	pm_runtime_put(chan->chip->dev);
690 }
691 
692 static int dw_edma_channel_setup(struct dw_edma_chip *chip, bool write,
693 				 u32 wr_alloc, u32 rd_alloc)
694 {
695 	struct dw_edma_region *dt_region;
696 	struct device *dev = chip->dev;
697 	struct dw_edma *dw = chip->dw;
698 	struct dw_edma_chan *chan;
699 	struct dw_edma_irq *irq;
700 	struct dma_device *dma;
701 	u32 alloc, off_alloc;
702 	u32 i, j, cnt;
703 	int err = 0;
704 	u32 pos;
705 
706 	if (write) {
707 		i = 0;
708 		cnt = dw->wr_ch_cnt;
709 		dma = &dw->wr_edma;
710 		alloc = wr_alloc;
711 		off_alloc = 0;
712 	} else {
713 		i = dw->wr_ch_cnt;
714 		cnt = dw->rd_ch_cnt;
715 		dma = &dw->rd_edma;
716 		alloc = rd_alloc;
717 		off_alloc = wr_alloc;
718 	}
719 
720 	INIT_LIST_HEAD(&dma->channels);
721 	for (j = 0; (alloc || dw->nr_irqs == 1) && j < cnt; j++, i++) {
722 		chan = &dw->chan[i];
723 
724 		dt_region = devm_kzalloc(dev, sizeof(*dt_region), GFP_KERNEL);
725 		if (!dt_region)
726 			return -ENOMEM;
727 
728 		chan->vc.chan.private = dt_region;
729 
730 		chan->chip = chip;
731 		chan->id = j;
732 		chan->dir = write ? EDMA_DIR_WRITE : EDMA_DIR_READ;
733 		chan->configured = false;
734 		chan->request = EDMA_REQ_NONE;
735 		chan->status = EDMA_ST_IDLE;
736 
737 		if (write)
738 			chan->ll_max = (dw->ll_region_wr[j].sz / EDMA_LL_SZ);
739 		else
740 			chan->ll_max = (dw->ll_region_rd[j].sz / EDMA_LL_SZ);
741 		chan->ll_max -= 1;
742 
743 		dev_vdbg(dev, "L. List:\tChannel %s[%u] max_cnt=%u\n",
744 			 write ? "write" : "read", j, chan->ll_max);
745 
746 		if (dw->nr_irqs == 1)
747 			pos = 0;
748 		else
749 			pos = off_alloc + (j % alloc);
750 
751 		irq = &dw->irq[pos];
752 
753 		if (write)
754 			irq->wr_mask |= BIT(j);
755 		else
756 			irq->rd_mask |= BIT(j);
757 
758 		irq->dw = dw;
759 		memcpy(&chan->msi, &irq->msi, sizeof(chan->msi));
760 
761 		dev_vdbg(dev, "MSI:\t\tChannel %s[%u] addr=0x%.8x%.8x, data=0x%.8x\n",
762 			 write ? "write" : "read", j,
763 			 chan->msi.address_hi, chan->msi.address_lo,
764 			 chan->msi.data);
765 
766 		chan->vc.desc_free = vchan_free_desc;
767 		vchan_init(&chan->vc, dma);
768 
769 		if (write) {
770 			dt_region->paddr = dw->dt_region_wr[j].paddr;
771 			dt_region->vaddr = dw->dt_region_wr[j].vaddr;
772 			dt_region->sz = dw->dt_region_wr[j].sz;
773 		} else {
774 			dt_region->paddr = dw->dt_region_rd[j].paddr;
775 			dt_region->vaddr = dw->dt_region_rd[j].vaddr;
776 			dt_region->sz = dw->dt_region_rd[j].sz;
777 		}
778 
779 		dw_edma_v0_core_device_config(chan);
780 	}
781 
782 	/* Set DMA channel capabilities */
783 	dma_cap_zero(dma->cap_mask);
784 	dma_cap_set(DMA_SLAVE, dma->cap_mask);
785 	dma_cap_set(DMA_CYCLIC, dma->cap_mask);
786 	dma_cap_set(DMA_PRIVATE, dma->cap_mask);
787 	dma_cap_set(DMA_INTERLEAVE, dma->cap_mask);
788 	dma->directions = BIT(write ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV);
789 	dma->src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
790 	dma->dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
791 	dma->residue_granularity = DMA_RESIDUE_GRANULARITY_DESCRIPTOR;
792 	dma->chancnt = cnt;
793 
794 	/* Set DMA channel callbacks */
795 	dma->dev = chip->dev;
796 	dma->device_alloc_chan_resources = dw_edma_alloc_chan_resources;
797 	dma->device_free_chan_resources = dw_edma_free_chan_resources;
798 	dma->device_config = dw_edma_device_config;
799 	dma->device_pause = dw_edma_device_pause;
800 	dma->device_resume = dw_edma_device_resume;
801 	dma->device_terminate_all = dw_edma_device_terminate_all;
802 	dma->device_issue_pending = dw_edma_device_issue_pending;
803 	dma->device_tx_status = dw_edma_device_tx_status;
804 	dma->device_prep_slave_sg = dw_edma_device_prep_slave_sg;
805 	dma->device_prep_dma_cyclic = dw_edma_device_prep_dma_cyclic;
806 	dma->device_prep_interleaved_dma = dw_edma_device_prep_interleaved_dma;
807 
808 	dma_set_max_seg_size(dma->dev, U32_MAX);
809 
810 	/* Register DMA device */
811 	err = dma_async_device_register(dma);
812 
813 	return err;
814 }
815 
816 static inline void dw_edma_dec_irq_alloc(int *nr_irqs, u32 *alloc, u16 cnt)
817 {
818 	if (*nr_irqs && *alloc < cnt) {
819 		(*alloc)++;
820 		(*nr_irqs)--;
821 	}
822 }
823 
824 static inline void dw_edma_add_irq_mask(u32 *mask, u32 alloc, u16 cnt)
825 {
826 	while (*mask * alloc < cnt)
827 		(*mask)++;
828 }
829 
830 static int dw_edma_irq_request(struct dw_edma_chip *chip,
831 			       u32 *wr_alloc, u32 *rd_alloc)
832 {
833 	struct device *dev = chip->dev;
834 	struct dw_edma *dw = chip->dw;
835 	u32 wr_mask = 1;
836 	u32 rd_mask = 1;
837 	int i, err = 0;
838 	u32 ch_cnt;
839 	int irq;
840 
841 	ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt;
842 
843 	if (dw->nr_irqs < 1)
844 		return -EINVAL;
845 
846 	if (dw->nr_irqs == 1) {
847 		/* Common IRQ shared among all channels */
848 		irq = dw->ops->irq_vector(dev, 0);
849 		err = request_irq(irq, dw_edma_interrupt_common,
850 				  IRQF_SHARED, dw->name, &dw->irq[0]);
851 		if (err) {
852 			dw->nr_irqs = 0;
853 			return err;
854 		}
855 
856 		if (irq_get_msi_desc(irq))
857 			get_cached_msi_msg(irq, &dw->irq[0].msi);
858 	} else {
859 		/* Distribute IRQs equally among all channels */
860 		int tmp = dw->nr_irqs;
861 
862 		while (tmp && (*wr_alloc + *rd_alloc) < ch_cnt) {
863 			dw_edma_dec_irq_alloc(&tmp, wr_alloc, dw->wr_ch_cnt);
864 			dw_edma_dec_irq_alloc(&tmp, rd_alloc, dw->rd_ch_cnt);
865 		}
866 
867 		dw_edma_add_irq_mask(&wr_mask, *wr_alloc, dw->wr_ch_cnt);
868 		dw_edma_add_irq_mask(&rd_mask, *rd_alloc, dw->rd_ch_cnt);
869 
870 		for (i = 0; i < (*wr_alloc + *rd_alloc); i++) {
871 			irq = dw->ops->irq_vector(dev, i);
872 			err = request_irq(irq,
873 					  i < *wr_alloc ?
874 						dw_edma_interrupt_write :
875 						dw_edma_interrupt_read,
876 					  IRQF_SHARED, dw->name,
877 					  &dw->irq[i]);
878 			if (err) {
879 				dw->nr_irqs = i;
880 				return err;
881 			}
882 
883 			if (irq_get_msi_desc(irq))
884 				get_cached_msi_msg(irq, &dw->irq[i].msi);
885 		}
886 
887 		dw->nr_irqs = i;
888 	}
889 
890 	return err;
891 }
892 
893 int dw_edma_probe(struct dw_edma_chip *chip)
894 {
895 	struct device *dev;
896 	struct dw_edma *dw;
897 	u32 wr_alloc = 0;
898 	u32 rd_alloc = 0;
899 	int i, err;
900 
901 	if (!chip)
902 		return -EINVAL;
903 
904 	dev = chip->dev;
905 	if (!dev)
906 		return -EINVAL;
907 
908 	dw = chip->dw;
909 	if (!dw || !dw->irq || !dw->ops || !dw->ops->irq_vector)
910 		return -EINVAL;
911 
912 	raw_spin_lock_init(&dw->lock);
913 
914 	dw->wr_ch_cnt = min_t(u16, dw->wr_ch_cnt,
915 			      dw_edma_v0_core_ch_count(dw, EDMA_DIR_WRITE));
916 	dw->wr_ch_cnt = min_t(u16, dw->wr_ch_cnt, EDMA_MAX_WR_CH);
917 
918 	dw->rd_ch_cnt = min_t(u16, dw->rd_ch_cnt,
919 			      dw_edma_v0_core_ch_count(dw, EDMA_DIR_READ));
920 	dw->rd_ch_cnt = min_t(u16, dw->rd_ch_cnt, EDMA_MAX_RD_CH);
921 
922 	if (!dw->wr_ch_cnt && !dw->rd_ch_cnt)
923 		return -EINVAL;
924 
925 	dev_vdbg(dev, "Channels:\twrite=%d, read=%d\n",
926 		 dw->wr_ch_cnt, dw->rd_ch_cnt);
927 
928 	/* Allocate channels */
929 	dw->chan = devm_kcalloc(dev, dw->wr_ch_cnt + dw->rd_ch_cnt,
930 				sizeof(*dw->chan), GFP_KERNEL);
931 	if (!dw->chan)
932 		return -ENOMEM;
933 
934 	snprintf(dw->name, sizeof(dw->name), "dw-edma-core:%d", chip->id);
935 
936 	/* Disable eDMA, only to establish the ideal initial conditions */
937 	dw_edma_v0_core_off(dw);
938 
939 	/* Request IRQs */
940 	err = dw_edma_irq_request(chip, &wr_alloc, &rd_alloc);
941 	if (err)
942 		return err;
943 
944 	/* Setup write channels */
945 	err = dw_edma_channel_setup(chip, true, wr_alloc, rd_alloc);
946 	if (err)
947 		goto err_irq_free;
948 
949 	/* Setup read channels */
950 	err = dw_edma_channel_setup(chip, false, wr_alloc, rd_alloc);
951 	if (err)
952 		goto err_irq_free;
953 
954 	/* Power management */
955 	pm_runtime_enable(dev);
956 
957 	/* Turn debugfs on */
958 	dw_edma_v0_core_debugfs_on(chip);
959 
960 	return 0;
961 
962 err_irq_free:
963 	for (i = (dw->nr_irqs - 1); i >= 0; i--)
964 		free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]);
965 
966 	dw->nr_irqs = 0;
967 
968 	return err;
969 }
970 EXPORT_SYMBOL_GPL(dw_edma_probe);
971 
972 int dw_edma_remove(struct dw_edma_chip *chip)
973 {
974 	struct dw_edma_chan *chan, *_chan;
975 	struct device *dev = chip->dev;
976 	struct dw_edma *dw = chip->dw;
977 	int i;
978 
979 	/* Disable eDMA */
980 	dw_edma_v0_core_off(dw);
981 
982 	/* Free irqs */
983 	for (i = (dw->nr_irqs - 1); i >= 0; i--)
984 		free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]);
985 
986 	/* Power management */
987 	pm_runtime_disable(dev);
988 
989 	/* Deregister eDMA device */
990 	dma_async_device_unregister(&dw->wr_edma);
991 	list_for_each_entry_safe(chan, _chan, &dw->wr_edma.channels,
992 				 vc.chan.device_node) {
993 		tasklet_kill(&chan->vc.task);
994 		list_del(&chan->vc.chan.device_node);
995 	}
996 
997 	dma_async_device_unregister(&dw->rd_edma);
998 	list_for_each_entry_safe(chan, _chan, &dw->rd_edma.channels,
999 				 vc.chan.device_node) {
1000 		tasklet_kill(&chan->vc.task);
1001 		list_del(&chan->vc.chan.device_node);
1002 	}
1003 
1004 	/* Turn debugfs off */
1005 	dw_edma_v0_core_debugfs_off(chip);
1006 
1007 	return 0;
1008 }
1009 EXPORT_SYMBOL_GPL(dw_edma_remove);
1010 
1011 MODULE_LICENSE("GPL v2");
1012 MODULE_DESCRIPTION("Synopsys DesignWare eDMA controller core driver");
1013 MODULE_AUTHOR("Gustavo Pimentel <gustavo.pimentel@synopsys.com>");
1014