Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mmp_pdma.c
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Marvell International Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/types.h>
11 #include <linux/interrupt.h>
12 #include <linux/dma-mapping.h>
13 #include <linux/slab.h>
14 #include <linux/dmaengine.h>
15 #include <linux/platform_device.h>
16 #include <linux/device.h>
18 #include <linux/dmapool.h>
19 #include <linux/of_device.h>
20 #include <linux/of.h>
21 
22 #include "dmaengine.h"
23 
24 #define DCSR 0x0000
25 #define DALGN 0x00a0
26 #define DINT 0x00f0
27 #define DDADR 0x0200
28 #define DSADR 0x0204
29 #define DTADR 0x0208
30 #define DCMD 0x020c
31 
32 #define DCSR_RUN (1 << 31) /* Run Bit (read / write) */
33 #define DCSR_NODESC (1 << 30) /* No-Descriptor Fetch (read / write) */
34 #define DCSR_STOPIRQEN (1 << 29) /* Stop Interrupt Enable (read / write) */
35 #define DCSR_REQPEND (1 << 8) /* Request Pending (read-only) */
36 #define DCSR_STOPSTATE (1 << 3) /* Stop State (read-only) */
37 #define DCSR_ENDINTR (1 << 2) /* End Interrupt (read / write) */
38 #define DCSR_STARTINTR (1 << 1) /* Start Interrupt (read / write) */
39 #define DCSR_BUSERR (1 << 0) /* Bus Error Interrupt (read / write) */
40 
41 #define DCSR_EORIRQEN (1 << 28) /* End of Receive Interrupt Enable (R/W) */
42 #define DCSR_EORJMPEN (1 << 27) /* Jump to next descriptor on EOR */
43 #define DCSR_EORSTOPEN (1 << 26) /* STOP on an EOR */
44 #define DCSR_SETCMPST (1 << 25) /* Set Descriptor Compare Status */
45 #define DCSR_CLRCMPST (1 << 24) /* Clear Descriptor Compare Status */
46 #define DCSR_CMPST (1 << 10) /* The Descriptor Compare Status */
47 #define DCSR_EORINTR (1 << 9) /* The end of Receive */
48 
49 #define DRCMR_MAPVLD (1 << 7) /* Map Valid (read / write) */
50 #define DRCMR_CHLNUM 0x1f /* mask for Channel Number (read / write) */
51 
52 #define DDADR_DESCADDR 0xfffffff0 /* Address of next descriptor (mask) */
53 #define DDADR_STOP (1 << 0) /* Stop (read / write) */
54 
55 #define DCMD_INCSRCADDR (1 << 31) /* Source Address Increment Setting. */
56 #define DCMD_INCTRGADDR (1 << 30) /* Target Address Increment Setting. */
57 #define DCMD_FLOWSRC (1 << 29) /* Flow Control by the source. */
58 #define DCMD_FLOWTRG (1 << 28) /* Flow Control by the target. */
59 #define DCMD_STARTIRQEN (1 << 22) /* Start Interrupt Enable */
60 #define DCMD_ENDIRQEN (1 << 21) /* End Interrupt Enable */
61 #define DCMD_ENDIAN (1 << 18) /* Device Endian-ness. */
62 #define DCMD_BURST8 (1 << 16) /* 8 byte burst */
63 #define DCMD_BURST16 (2 << 16) /* 16 byte burst */
64 #define DCMD_BURST32 (3 << 16) /* 32 byte burst */
65 #define DCMD_WIDTH1 (1 << 14) /* 1 byte width */
66 #define DCMD_WIDTH2 (2 << 14) /* 2 byte width (HalfWord) */
67 #define DCMD_WIDTH4 (3 << 14) /* 4 byte width (Word) */
68 #define DCMD_LENGTH 0x01fff /* length mask (max = 8K - 1) */
69 
70 #define PDMA_ALIGNMENT 3
71 #define PDMA_MAX_DESC_BYTES 0x1000
72 
74  u32 ddadr; /* Points to the next descriptor + flags */
75  u32 dsadr; /* DSADR value for the current transfer */
76  u32 dtadr; /* DTADR value for the current transfer */
77  u32 dcmd; /* DCMD value for the current transfer */
78 } __aligned(32);
79 
82  struct list_head node;
85 };
86 
87 struct mmp_pdma_phy;
88 
89 struct mmp_pdma_chan {
90  struct device *dev;
91  struct dma_chan chan;
93  struct mmp_pdma_phy *phy;
95 
96  /* channel's basic info */
101 
102  /* list for desc */
103  spinlock_t desc_lock; /* Descriptor list lock */
104  struct list_head chain_pending; /* Link descriptors queue for pending */
105  struct list_head chain_running; /* Link descriptors queue for running */
106  bool idle; /* channel statue machine */
107 
108  struct dma_pool *desc_pool; /* Descriptors pool */
109 };
110 
111 struct mmp_pdma_phy {
112  int idx;
113  void __iomem *base;
115 };
116 
119  void __iomem *base;
120  struct device *dev;
122  struct mmp_pdma_phy *phy;
123 };
124 
125 #define tx_to_mmp_pdma_desc(tx) container_of(tx, struct mmp_pdma_desc_sw, async_tx)
126 #define to_mmp_pdma_desc(lh) container_of(lh, struct mmp_pdma_desc_sw, node)
127 #define to_mmp_pdma_chan(dchan) container_of(dchan, struct mmp_pdma_chan, chan)
128 #define to_mmp_pdma_dev(dmadev) container_of(dmadev, struct mmp_pdma_device, device)
129 
130 static void set_desc(struct mmp_pdma_phy *phy, dma_addr_t addr)
131 {
132  u32 reg = (phy->idx << 4) + DDADR;
133 
134  writel(addr, phy->base + reg);
135 }
136 
137 static void enable_chan(struct mmp_pdma_phy *phy)
138 {
139  u32 reg;
140 
141  if (!phy->vchan)
142  return;
143 
144  reg = phy->vchan->drcmr;
145  reg = (((reg) < 64) ? 0x0100 : 0x1100) + (((reg) & 0x3f) << 2);
146  writel(DRCMR_MAPVLD | phy->idx, phy->base + reg);
147 
148  reg = (phy->idx << 2) + DCSR;
149  writel(readl(phy->base + reg) | DCSR_RUN,
150  phy->base + reg);
151 }
152 
153 static void disable_chan(struct mmp_pdma_phy *phy)
154 {
155  u32 reg;
156 
157  if (phy) {
158  reg = (phy->idx << 2) + DCSR;
159  writel(readl(phy->base + reg) & ~DCSR_RUN,
160  phy->base + reg);
161  }
162 }
163 
164 static int clear_chan_irq(struct mmp_pdma_phy *phy)
165 {
166  u32 dcsr;
167  u32 dint = readl(phy->base + DINT);
168  u32 reg = (phy->idx << 2) + DCSR;
169 
170  if (dint & BIT(phy->idx)) {
171  /* clear irq */
172  dcsr = readl(phy->base + reg);
173  writel(dcsr, phy->base + reg);
174  if ((dcsr & DCSR_BUSERR) && (phy->vchan))
175  dev_warn(phy->vchan->dev, "DCSR_BUSERR\n");
176  return 0;
177  }
178  return -EAGAIN;
179 }
180 
181 static irqreturn_t mmp_pdma_chan_handler(int irq, void *dev_id)
182 {
183  struct mmp_pdma_phy *phy = dev_id;
184 
185  if (clear_chan_irq(phy) == 0) {
186  tasklet_schedule(&phy->vchan->tasklet);
187  return IRQ_HANDLED;
188  } else
189  return IRQ_NONE;
190 }
191 
192 static irqreturn_t mmp_pdma_int_handler(int irq, void *dev_id)
193 {
194  struct mmp_pdma_device *pdev = dev_id;
195  struct mmp_pdma_phy *phy;
196  u32 dint = readl(pdev->base + DINT);
197  int i, ret;
198  int irq_num = 0;
199 
200  while (dint) {
201  i = __ffs(dint);
202  dint &= (dint - 1);
203  phy = &pdev->phy[i];
204  ret = mmp_pdma_chan_handler(irq, phy);
205  if (ret == IRQ_HANDLED)
206  irq_num++;
207  }
208 
209  if (irq_num)
210  return IRQ_HANDLED;
211  else
212  return IRQ_NONE;
213 }
214 
215 /* lookup free phy channel as descending priority */
216 static struct mmp_pdma_phy *lookup_phy(struct mmp_pdma_chan *pchan)
217 {
218  int prio, i;
219  struct mmp_pdma_device *pdev = to_mmp_pdma_dev(pchan->chan.device);
220  struct mmp_pdma_phy *phy;
221 
222  /*
223  * dma channel priorities
224  * ch 0 - 3, 16 - 19 <--> (0)
225  * ch 4 - 7, 20 - 23 <--> (1)
226  * ch 8 - 11, 24 - 27 <--> (2)
227  * ch 12 - 15, 28 - 31 <--> (3)
228  */
229  for (prio = 0; prio <= (((pdev->dma_channels - 1) & 0xf) >> 2); prio++) {
230  for (i = 0; i < pdev->dma_channels; i++) {
231  if (prio != ((i & 0xf) >> 2))
232  continue;
233  phy = &pdev->phy[i];
234  if (!phy->vchan) {
235  phy->vchan = pchan;
236  return phy;
237  }
238  }
239  }
240 
241  return NULL;
242 }
243 
244 /* desc->tx_list ==> pending list */
245 static void append_pending_queue(struct mmp_pdma_chan *chan,
246  struct mmp_pdma_desc_sw *desc)
247 {
248  struct mmp_pdma_desc_sw *tail =
249  to_mmp_pdma_desc(chan->chain_pending.prev);
250 
251  if (list_empty(&chan->chain_pending))
252  goto out_splice;
253 
254  /* one irq per queue, even appended */
255  tail->desc.ddadr = desc->async_tx.phys;
256  tail->desc.dcmd &= ~DCMD_ENDIRQEN;
257 
258  /* softly link to pending list */
259 out_splice:
260  list_splice_tail_init(&desc->tx_list, &chan->chain_pending);
261 }
262 
267 static void start_pending_queue(struct mmp_pdma_chan *chan)
268 {
269  struct mmp_pdma_desc_sw *desc;
270 
271  /* still in running, irq will start the pending list */
272  if (!chan->idle) {
273  dev_dbg(chan->dev, "DMA controller still busy\n");
274  return;
275  }
276 
277  if (list_empty(&chan->chain_pending)) {
278  /* chance to re-fetch phy channel with higher prio */
279  if (chan->phy) {
280  chan->phy->vchan = NULL;
281  chan->phy = NULL;
282  }
283  dev_dbg(chan->dev, "no pending list\n");
284  return;
285  }
286 
287  if (!chan->phy) {
288  chan->phy = lookup_phy(chan);
289  if (!chan->phy) {
290  dev_dbg(chan->dev, "no free dma channel\n");
291  return;
292  }
293  }
294 
295  /*
296  * pending -> running
297  * reintilize pending list
298  */
299  desc = list_first_entry(&chan->chain_pending,
300  struct mmp_pdma_desc_sw, node);
301  list_splice_tail_init(&chan->chain_pending, &chan->chain_running);
302 
303  /*
304  * Program the descriptor's address into the DMA controller,
305  * then start the DMA transaction
306  */
307  set_desc(chan->phy, desc->async_tx.phys);
308  enable_chan(chan->phy);
309  chan->idle = false;
310 }
311 
312 
313 /* desc->tx_list ==> pending list */
314 static dma_cookie_t mmp_pdma_tx_submit(struct dma_async_tx_descriptor *tx)
315 {
316  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(tx->chan);
317  struct mmp_pdma_desc_sw *desc = tx_to_mmp_pdma_desc(tx);
318  struct mmp_pdma_desc_sw *child;
319  unsigned long flags;
321 
322  spin_lock_irqsave(&chan->desc_lock, flags);
323 
324  list_for_each_entry(child, &desc->tx_list, node) {
325  cookie = dma_cookie_assign(&child->async_tx);
326  }
327 
328  append_pending_queue(chan, desc);
329 
330  spin_unlock_irqrestore(&chan->desc_lock, flags);
331 
332  return cookie;
333 }
334 
336 {
337  struct mmp_pdma_desc_sw *desc;
339 
340  desc = dma_pool_alloc(chan->desc_pool, GFP_ATOMIC, &pdesc);
341  if (!desc) {
342  dev_err(chan->dev, "out of memory for link descriptor\n");
343  return NULL;
344  }
345 
346  memset(desc, 0, sizeof(*desc));
347  INIT_LIST_HEAD(&desc->tx_list);
349  /* each desc has submit */
350  desc->async_tx.tx_submit = mmp_pdma_tx_submit;
351  desc->async_tx.phys = pdesc;
352 
353  return desc;
354 }
355 
364 static int mmp_pdma_alloc_chan_resources(struct dma_chan *dchan)
365 {
366  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
367 
368  if (chan->desc_pool)
369  return 1;
370 
371  chan->desc_pool =
372  dma_pool_create(dev_name(&dchan->dev->device), chan->dev,
373  sizeof(struct mmp_pdma_desc_sw),
374  __alignof__(struct mmp_pdma_desc_sw), 0);
375  if (!chan->desc_pool) {
376  dev_err(chan->dev, "unable to allocate descriptor pool\n");
377  return -ENOMEM;
378  }
379  if (chan->phy) {
380  chan->phy->vchan = NULL;
381  chan->phy = NULL;
382  }
383  chan->idle = true;
384  chan->dev_addr = 0;
385  return 1;
386 }
387 
388 static void mmp_pdma_free_desc_list(struct mmp_pdma_chan *chan,
389  struct list_head *list)
390 {
391  struct mmp_pdma_desc_sw *desc, *_desc;
392 
393  list_for_each_entry_safe(desc, _desc, list, node) {
394  list_del(&desc->node);
395  dma_pool_free(chan->desc_pool, desc, desc->async_tx.phys);
396  }
397 }
398 
399 static void mmp_pdma_free_chan_resources(struct dma_chan *dchan)
400 {
401  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
402  unsigned long flags;
403 
404  spin_lock_irqsave(&chan->desc_lock, flags);
405  mmp_pdma_free_desc_list(chan, &chan->chain_pending);
406  mmp_pdma_free_desc_list(chan, &chan->chain_running);
407  spin_unlock_irqrestore(&chan->desc_lock, flags);
408 
410  chan->desc_pool = NULL;
411  chan->idle = true;
412  chan->dev_addr = 0;
413  if (chan->phy) {
414  chan->phy->vchan = NULL;
415  chan->phy = NULL;
416  }
417  return;
418 }
419 
420 static struct dma_async_tx_descriptor *
421 mmp_pdma_prep_memcpy(struct dma_chan *dchan,
422  dma_addr_t dma_dst, dma_addr_t dma_src,
423  size_t len, unsigned long flags)
424 {
425  struct mmp_pdma_chan *chan;
426  struct mmp_pdma_desc_sw *first = NULL, *prev = NULL, *new;
427  size_t copy = 0;
428 
429  if (!dchan)
430  return NULL;
431 
432  if (!len)
433  return NULL;
434 
435  chan = to_mmp_pdma_chan(dchan);
436 
437  if (!chan->dir) {
438  chan->dir = DMA_MEM_TO_MEM;
440  chan->dcmd |= DCMD_BURST32;
441  }
442 
443  do {
444  /* Allocate the link descriptor from DMA pool */
445  new = mmp_pdma_alloc_descriptor(chan);
446  if (!new) {
447  dev_err(chan->dev, "no memory for desc\n");
448  goto fail;
449  }
450 
451  copy = min_t(size_t, len, PDMA_MAX_DESC_BYTES);
452 
453  new->desc.dcmd = chan->dcmd | (DCMD_LENGTH & copy);
454  new->desc.dsadr = dma_src;
455  new->desc.dtadr = dma_dst;
456 
457  if (!first)
458  first = new;
459  else
460  prev->desc.ddadr = new->async_tx.phys;
461 
462  new->async_tx.cookie = 0;
463  async_tx_ack(&new->async_tx);
464 
465  prev = new;
466  len -= copy;
467 
468  if (chan->dir == DMA_MEM_TO_DEV) {
469  dma_src += copy;
470  } else if (chan->dir == DMA_DEV_TO_MEM) {
471  dma_dst += copy;
472  } else if (chan->dir == DMA_MEM_TO_MEM) {
473  dma_src += copy;
474  dma_dst += copy;
475  }
476 
477  /* Insert the link descriptor to the LD ring */
478  list_add_tail(&new->node, &first->tx_list);
479  } while (len);
480 
481  first->async_tx.flags = flags; /* client is in control of this ack */
482  first->async_tx.cookie = -EBUSY;
483 
484  /* last desc and fire IRQ */
485  new->desc.ddadr = DDADR_STOP;
486  new->desc.dcmd |= DCMD_ENDIRQEN;
487 
488  return &first->async_tx;
489 
490 fail:
491  if (first)
492  mmp_pdma_free_desc_list(chan, &first->tx_list);
493  return NULL;
494 }
495 
496 static struct dma_async_tx_descriptor *
497 mmp_pdma_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
498  unsigned int sg_len, enum dma_transfer_direction dir,
499  unsigned long flags, void *context)
500 {
501  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
502  struct mmp_pdma_desc_sw *first = NULL, *prev = NULL, *new = NULL;
503  size_t len, avail;
504  struct scatterlist *sg;
506  int i;
507 
508  if ((sgl == NULL) || (sg_len == 0))
509  return NULL;
510 
511  for_each_sg(sgl, sg, sg_len, i) {
512  addr = sg_dma_address(sg);
513  avail = sg_dma_len(sgl);
514 
515  do {
516  len = min_t(size_t, avail, PDMA_MAX_DESC_BYTES);
517 
518  /* allocate and populate the descriptor */
519  new = mmp_pdma_alloc_descriptor(chan);
520  if (!new) {
521  dev_err(chan->dev, "no memory for desc\n");
522  goto fail;
523  }
524 
525  new->desc.dcmd = chan->dcmd | (DCMD_LENGTH & len);
526  if (dir == DMA_MEM_TO_DEV) {
527  new->desc.dsadr = addr;
528  new->desc.dtadr = chan->dev_addr;
529  } else {
530  new->desc.dsadr = chan->dev_addr;
531  new->desc.dtadr = addr;
532  }
533 
534  if (!first)
535  first = new;
536  else
537  prev->desc.ddadr = new->async_tx.phys;
538 
539  new->async_tx.cookie = 0;
540  async_tx_ack(&new->async_tx);
541  prev = new;
542 
543  /* Insert the link descriptor to the LD ring */
544  list_add_tail(&new->node, &first->tx_list);
545 
546  /* update metadata */
547  addr += len;
548  avail -= len;
549  } while (avail);
550  }
551 
552  first->async_tx.cookie = -EBUSY;
553  first->async_tx.flags = flags;
554 
555  /* last desc and fire IRQ */
556  new->desc.ddadr = DDADR_STOP;
557  new->desc.dcmd |= DCMD_ENDIRQEN;
558 
559  return &first->async_tx;
560 
561 fail:
562  if (first)
563  mmp_pdma_free_desc_list(chan, &first->tx_list);
564  return NULL;
565 }
566 
567 static int mmp_pdma_control(struct dma_chan *dchan, enum dma_ctrl_cmd cmd,
568  unsigned long arg)
569 {
570  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
571  struct dma_slave_config *cfg = (void *)arg;
572  unsigned long flags;
573  int ret = 0;
574  u32 maxburst = 0, addr = 0;
576 
577  if (!dchan)
578  return -EINVAL;
579 
580  switch (cmd) {
581  case DMA_TERMINATE_ALL:
582  disable_chan(chan->phy);
583  if (chan->phy) {
584  chan->phy->vchan = NULL;
585  chan->phy = NULL;
586  }
587  spin_lock_irqsave(&chan->desc_lock, flags);
588  mmp_pdma_free_desc_list(chan, &chan->chain_pending);
589  mmp_pdma_free_desc_list(chan, &chan->chain_running);
590  spin_unlock_irqrestore(&chan->desc_lock, flags);
591  chan->idle = true;
592  break;
593  case DMA_SLAVE_CONFIG:
594  if (cfg->direction == DMA_DEV_TO_MEM) {
596  maxburst = cfg->src_maxburst;
597  width = cfg->src_addr_width;
598  addr = cfg->src_addr;
599  } else if (cfg->direction == DMA_MEM_TO_DEV) {
601  maxburst = cfg->dst_maxburst;
602  width = cfg->dst_addr_width;
603  addr = cfg->dst_addr;
604  }
605 
606  if (width == DMA_SLAVE_BUSWIDTH_1_BYTE)
607  chan->dcmd |= DCMD_WIDTH1;
608  else if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
609  chan->dcmd |= DCMD_WIDTH2;
610  else if (width == DMA_SLAVE_BUSWIDTH_4_BYTES)
611  chan->dcmd |= DCMD_WIDTH4;
612 
613  if (maxburst == 8)
614  chan->dcmd |= DCMD_BURST8;
615  else if (maxburst == 16)
616  chan->dcmd |= DCMD_BURST16;
617  else if (maxburst == 32)
618  chan->dcmd |= DCMD_BURST32;
619 
620  if (cfg) {
621  chan->dir = cfg->direction;
622  chan->drcmr = cfg->slave_id;
623  }
624  chan->dev_addr = addr;
625  break;
626  default:
627  return -ENOSYS;
628  }
629 
630  return ret;
631 }
632 
633 static enum dma_status mmp_pdma_tx_status(struct dma_chan *dchan,
634  dma_cookie_t cookie, struct dma_tx_state *txstate)
635 {
636  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
637  enum dma_status ret;
638  unsigned long flags;
639 
640  spin_lock_irqsave(&chan->desc_lock, flags);
641  ret = dma_cookie_status(dchan, cookie, txstate);
642  spin_unlock_irqrestore(&chan->desc_lock, flags);
643 
644  return ret;
645 }
646 
651 static void mmp_pdma_issue_pending(struct dma_chan *dchan)
652 {
653  struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
654  unsigned long flags;
655 
656  spin_lock_irqsave(&chan->desc_lock, flags);
657  start_pending_queue(chan);
658  spin_unlock_irqrestore(&chan->desc_lock, flags);
659 }
660 
661 /*
662  * dma_do_tasklet
663  * Do call back
664  * Start pending list
665  */
666 static void dma_do_tasklet(unsigned long data)
667 {
668  struct mmp_pdma_chan *chan = (struct mmp_pdma_chan *)data;
669  struct mmp_pdma_desc_sw *desc, *_desc;
670  LIST_HEAD(chain_cleanup);
671  unsigned long flags;
672 
673  /* submit pending list; callback for each desc; free desc */
674 
675  spin_lock_irqsave(&chan->desc_lock, flags);
676 
677  /* update the cookie if we have some descriptors to cleanup */
678  if (!list_empty(&chan->chain_running)) {
680 
681  desc = to_mmp_pdma_desc(chan->chain_running.prev);
682  cookie = desc->async_tx.cookie;
683  dma_cookie_complete(&desc->async_tx);
684 
685  dev_dbg(chan->dev, "completed_cookie=%d\n", cookie);
686  }
687 
688  /*
689  * move the descriptors to a temporary list so we can drop the lock
690  * during the entire cleanup operation
691  */
692  list_splice_tail_init(&chan->chain_running, &chain_cleanup);
693 
694  /* the hardware is now idle and ready for more */
695  chan->idle = true;
696 
697  /* Start any pending transactions automatically */
698  start_pending_queue(chan);
699  spin_unlock_irqrestore(&chan->desc_lock, flags);
700 
701  /* Run the callback for each descriptor, in order */
702  list_for_each_entry_safe(desc, _desc, &chain_cleanup, node) {
703  struct dma_async_tx_descriptor *txd = &desc->async_tx;
704 
705  /* Remove from the list of transactions */
706  list_del(&desc->node);
707  /* Run the link descriptor callback function */
708  if (txd->callback)
709  txd->callback(txd->callback_param);
710 
711  dma_pool_free(chan->desc_pool, desc, txd->phys);
712  }
713 }
714 
715 static int __devexit mmp_pdma_remove(struct platform_device *op)
716 {
717  struct mmp_pdma_device *pdev = platform_get_drvdata(op);
718 
720  return 0;
721 }
722 
723 static int __devinit mmp_pdma_chan_init(struct mmp_pdma_device *pdev,
724  int idx, int irq)
725 {
726  struct mmp_pdma_phy *phy = &pdev->phy[idx];
727  struct mmp_pdma_chan *chan;
728  int ret;
729 
730  chan = devm_kzalloc(pdev->dev,
731  sizeof(struct mmp_pdma_chan), GFP_KERNEL);
732  if (chan == NULL)
733  return -ENOMEM;
734 
735  phy->idx = idx;
736  phy->base = pdev->base;
737 
738  if (irq) {
739  ret = devm_request_irq(pdev->dev, irq,
740  mmp_pdma_chan_handler, IRQF_DISABLED, "pdma", phy);
741  if (ret) {
742  dev_err(pdev->dev, "channel request irq fail!\n");
743  return ret;
744  }
745  }
746 
747  spin_lock_init(&chan->desc_lock);
748  chan->dev = pdev->dev;
749  chan->chan.device = &pdev->device;
750  tasklet_init(&chan->tasklet, dma_do_tasklet, (unsigned long)chan);
751  INIT_LIST_HEAD(&chan->chain_pending);
752  INIT_LIST_HEAD(&chan->chain_running);
753 
754  /* register virt channel to dma engine */
755  list_add_tail(&chan->chan.device_node,
756  &pdev->device.channels);
757 
758  return 0;
759 }
760 
761 static struct of_device_id mmp_pdma_dt_ids[] = {
762  { .compatible = "marvell,pdma-1.0", },
763  {}
764 };
765 MODULE_DEVICE_TABLE(of, mmp_pdma_dt_ids);
766 
767 static int __devinit mmp_pdma_probe(struct platform_device *op)
768 {
769  struct mmp_pdma_device *pdev;
770  const struct of_device_id *of_id;
771  struct mmp_dma_platdata *pdata = dev_get_platdata(&op->dev);
772  struct resource *iores;
773  int i, ret, irq = 0;
774  int dma_channels = 0, irq_num = 0;
775 
776  pdev = devm_kzalloc(&op->dev, sizeof(*pdev), GFP_KERNEL);
777  if (!pdev)
778  return -ENOMEM;
779  pdev->dev = &op->dev;
780 
781  iores = platform_get_resource(op, IORESOURCE_MEM, 0);
782  if (!iores)
783  return -EINVAL;
784 
785  pdev->base = devm_request_and_ioremap(pdev->dev, iores);
786  if (!pdev->base)
787  return -EADDRNOTAVAIL;
788 
789  of_id = of_match_device(mmp_pdma_dt_ids, pdev->dev);
790  if (of_id)
791  of_property_read_u32(pdev->dev->of_node,
792  "#dma-channels", &dma_channels);
793  else if (pdata && pdata->dma_channels)
794  dma_channels = pdata->dma_channels;
795  else
796  dma_channels = 32; /* default 32 channel */
797  pdev->dma_channels = dma_channels;
798 
799  for (i = 0; i < dma_channels; i++) {
800  if (platform_get_irq(op, i) > 0)
801  irq_num++;
802  }
803 
804  pdev->phy = devm_kzalloc(pdev->dev,
805  dma_channels * sizeof(struct mmp_pdma_chan), GFP_KERNEL);
806  if (pdev->phy == NULL)
807  return -ENOMEM;
808 
809  INIT_LIST_HEAD(&pdev->device.channels);
810 
811  if (irq_num != dma_channels) {
812  /* all chan share one irq, demux inside */
813  irq = platform_get_irq(op, 0);
814  ret = devm_request_irq(pdev->dev, irq,
815  mmp_pdma_int_handler, IRQF_DISABLED, "pdma", pdev);
816  if (ret)
817  return ret;
818  }
819 
820  for (i = 0; i < dma_channels; i++) {
821  irq = (irq_num != dma_channels) ? 0 : platform_get_irq(op, i);
822  ret = mmp_pdma_chan_init(pdev, i, irq);
823  if (ret)
824  return ret;
825  }
826 
827  dma_cap_set(DMA_SLAVE, pdev->device.cap_mask);
828  dma_cap_set(DMA_MEMCPY, pdev->device.cap_mask);
829  dma_cap_set(DMA_SLAVE, pdev->device.cap_mask);
830  pdev->device.dev = &op->dev;
831  pdev->device.device_alloc_chan_resources = mmp_pdma_alloc_chan_resources;
832  pdev->device.device_free_chan_resources = mmp_pdma_free_chan_resources;
833  pdev->device.device_tx_status = mmp_pdma_tx_status;
834  pdev->device.device_prep_dma_memcpy = mmp_pdma_prep_memcpy;
835  pdev->device.device_prep_slave_sg = mmp_pdma_prep_slave_sg;
836  pdev->device.device_issue_pending = mmp_pdma_issue_pending;
837  pdev->device.device_control = mmp_pdma_control;
838  pdev->device.copy_align = PDMA_ALIGNMENT;
839 
840  if (pdev->dev->coherent_dma_mask)
841  dma_set_mask(pdev->dev, pdev->dev->coherent_dma_mask);
842  else
843  dma_set_mask(pdev->dev, DMA_BIT_MASK(64));
844 
845  ret = dma_async_device_register(&pdev->device);
846  if (ret) {
847  dev_err(pdev->device.dev, "unable to register\n");
848  return ret;
849  }
850 
851  dev_info(pdev->device.dev, "initialized\n");
852  return 0;
853 }
854 
855 static const struct platform_device_id mmp_pdma_id_table[] = {
856  { "mmp-pdma", },
857  { },
858 };
859 
860 static struct platform_driver mmp_pdma_driver = {
861  .driver = {
862  .name = "mmp-pdma",
863  .owner = THIS_MODULE,
864  .of_match_table = mmp_pdma_dt_ids,
865  },
866  .id_table = mmp_pdma_id_table,
867  .probe = mmp_pdma_probe,
868  .remove = __devexit_p(mmp_pdma_remove),
869 };
870 
871 module_platform_driver(mmp_pdma_driver);
872 
873 MODULE_DESCRIPTION("MARVELL MMP Periphera DMA Driver");
874 MODULE_AUTHOR("Marvell International Ltd.");
875 MODULE_LICENSE("GPL v2");