* (at your option) any later version.
  */
 
+#include <linux/debugfs.h>
 #include <linux/kernel.h>
 #include <linux/io.h>
 #include <linux/init.h>
        BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | \
        BIT(DMA_SLAVE_BUSWIDTH_8_BYTES)
 
+#ifdef CONFIG_DEBUG_FS
+static int pl330_debugfs_show(struct seq_file *s, void *data)
+{
+       struct pl330_dmac *pl330 = s->private;
+       int chans, pchs, ch, pr;
+
+       chans = pl330->pcfg.num_chan;
+       pchs = pl330->num_peripherals;
+
+       seq_puts(s, "PL330 physical channels:\n");
+       seq_puts(s, "THREAD:\t\tCHANNEL:\n");
+       seq_puts(s, "--------\t-----\n");
+       for (ch = 0; ch < chans; ch++) {
+               struct pl330_thread *thrd = &pl330->channels[ch];
+               int found = -1;
+
+               for (pr = 0; pr < pchs; pr++) {
+                       struct dma_pl330_chan *pch = &pl330->peripherals[pr];
+
+                       if (!pch->thread || thrd->id != pch->thread->id)
+                               continue;
+
+                       found = pr;
+               }
+
+               seq_printf(s, "%d\t\t", thrd->id);
+               if (found == -1)
+                       seq_puts(s, "--\n");
+               else
+                       seq_printf(s, "%d\n", found);
+       }
+
+       return 0;
+}
+
+DEFINE_SHOW_ATTRIBUTE(pl330_debugfs);
+
+static inline void init_pl330_debugfs(struct pl330_dmac *pl330)
+{
+       debugfs_create_file(dev_name(pl330->ddma.dev),
+                           S_IFREG | 0444, NULL, pl330,
+                           &pl330_debugfs_fops);
+}
+#else
+static inline void init_pl330_debugfs(struct pl330_dmac *pl330)
+{
+}
+#endif
+
 /*
  * Runtime PM callbacks are provided by amba/bus.c driver.
  *
                dev_err(&adev->dev, "unable to set the seg size\n");
 
 
+       init_pl330_debugfs(pl330);
        dev_info(&adev->dev,
                "Loaded driver for PL330 DMAC-%x\n", adev->periphid);
        dev_info(&adev->dev,