|
@@ -1235,3 +1235,76 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
|
|
|
|
|
|
printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
|
|
|
|
|
|
+ s3c2410_dma_config(no, cp->xfer_unit);
|
|
|
+ s3c2410_dma_devconfig(no, cp->source, cp->dev_addr);
|
|
|
+
|
|
|
+ /* re-select the dma source for this channel */
|
|
|
+
|
|
|
+ if (cp->map != NULL)
|
|
|
+ dma_sel.select(cp, cp->map);
|
|
|
+}
|
|
|
+
|
|
|
+static void s3c2410_dma_resume(void)
|
|
|
+{
|
|
|
+ struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
|
|
|
+ int channel;
|
|
|
+
|
|
|
+ for (channel = dma_channels - 1; channel >= 0; cp--, channel--)
|
|
|
+ s3c2410_dma_resume_chan(cp);
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+#define s3c2410_dma_suspend NULL
|
|
|
+#define s3c2410_dma_resume NULL
|
|
|
+#endif /* CONFIG_PM */
|
|
|
+
|
|
|
+struct syscore_ops dma_syscore_ops = {
|
|
|
+ .suspend = s3c2410_dma_suspend,
|
|
|
+ .resume = s3c2410_dma_resume,
|
|
|
+};
|
|
|
+
|
|
|
+/* kmem cache implementation */
|
|
|
+
|
|
|
+static void s3c2410_dma_cache_ctor(void *p)
|
|
|
+{
|
|
|
+ memset(p, 0, sizeof(struct s3c2410_dma_buf));
|
|
|
+}
|
|
|
+
|
|
|
+/* initialisation code */
|
|
|
+
|
|
|
+static int __init s3c24xx_dma_syscore_init(void)
|
|
|
+{
|
|
|
+ register_syscore_ops(&dma_syscore_ops);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+late_initcall(s3c24xx_dma_syscore_init);
|
|
|
+
|
|
|
+int __init s3c24xx_dma_init(unsigned int channels, unsigned int irq,
|
|
|
+ unsigned int stride)
|
|
|
+{
|
|
|
+ struct s3c2410_dma_chan *cp;
|
|
|
+ int channel;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ printk("S3C24XX DMA Driver, Copyright 2003-2006 Simtec Electronics\n");
|
|
|
+
|
|
|
+ dma_channels = channels;
|
|
|
+
|
|
|
+ dma_base = ioremap(S3C24XX_PA_DMA, stride * channels);
|
|
|
+ if (dma_base == NULL) {
|
|
|
+ printk(KERN_ERR "dma failed to remap register block\n");
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ dma_kmem = kmem_cache_create("dma_desc",
|
|
|
+ sizeof(struct s3c2410_dma_buf), 0,
|
|
|
+ SLAB_HWCACHE_ALIGN,
|
|
|
+ s3c2410_dma_cache_ctor);
|
|
|
+
|
|
|
+ if (dma_kmem == NULL) {
|
|
|
+ printk(KERN_ERR "dma failed to make kmem cache\n");
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto err;
|
|
|
+ }
|