]> Pileus Git - ~andy/linux/commitdiff
ARM: OMAP: Fix dmaengine init for multiplatform
authorTony Lindgren <tony@atomide.com>
Fri, 11 Jan 2013 19:24:19 +0000 (11:24 -0800)
committerTony Lindgren <tony@atomide.com>
Fri, 11 Jan 2013 19:24:19 +0000 (11:24 -0800)
Otherwise omap dmaengine will initialized when booted
on other SoCs. Fix this by initializing the platform
device in arch/arm/*omap*/dma.c instead.

Cc: Russell King <linux@arm.linux.org.uk>
Cc: Dan Williams <djbw@fb.com>
Cc: Vinod Koul <vinod.koul@intel.com>
Tested-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/dma.c
arch/arm/mach-omap2/dma.c
drivers/dma/omap-dma.c

index e190611e4b46654545c9f647dc014e97f201b056..1a4e887f028d59b9e4c84584a5fc5418a4693e41 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/io.h>
-
+#include <linux/dma-mapping.h>
 #include <linux/omap-dma.h>
 #include <mach/tc.h>
 
@@ -270,11 +270,17 @@ static u32 configure_dma_errata(void)
        return errata;
 }
 
+static const struct platform_device_info omap_dma_dev_info = {
+       .name = "omap-dma-engine",
+       .id = -1,
+       .dma_mask = DMA_BIT_MASK(32),
+};
+
 static int __init omap1_system_dma_init(void)
 {
        struct omap_system_dma_plat_info        *p;
        struct omap_dma_dev_attr                *d;
-       struct platform_device                  *pdev;
+       struct platform_device                  *pdev, *dma_pdev;
        int ret;
 
        pdev = platform_device_alloc("omap_dma_system", 0);
@@ -380,8 +386,16 @@ static int __init omap1_system_dma_init(void)
        dma_common_ch_start     = CPC;
        dma_common_ch_end       = COLOR;
 
+       dma_pdev = platform_device_register_full(&omap_dma_dev_info);
+       if (IS_ERR(dma_pdev)) {
+               ret = PTR_ERR(dma_pdev);
+               goto exit_release_pdev;
+       }
+
        return ret;
 
+exit_release_pdev:
+       platform_device_del(pdev);
 exit_release_chan:
        kfree(d->chan);
 exit_release_d:
index e034ab69a0460e211c5268279068bc180be163fa..5cd8d7668becab52e84868c71c8db9bd3c22a6e7 100644 (file)
@@ -27,7 +27,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/device.h>
-
+#include <linux/dma-mapping.h>
 #include <linux/omap-dma.h>
 
 #include "soc.h"
@@ -288,9 +288,26 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
        return 0;
 }
 
+static const struct platform_device_info omap_dma_dev_info = {
+       .name = "omap-dma-engine",
+       .id = -1,
+       .dma_mask = DMA_BIT_MASK(32),
+};
+
 static int __init omap2_system_dma_init(void)
 {
-       return omap_hwmod_for_each_by_class("dma",
+       struct platform_device *pdev;
+       int res;
+
+       res = omap_hwmod_for_each_by_class("dma",
                        omap2_system_dma_init_dev, NULL);
+       if (res)
+               return res;
+
+       pdev = platform_device_register_full(&omap_dma_dev_info);
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
+
+       return res;
 }
 omap_arch_initcall(omap2_system_dma_init);
index 5a31264f2bd176a57c0e221317f8d7efaa9184cc..c4b4fd2acc42b8fc605ccc70a71907ab3668794c 100644 (file)
@@ -661,32 +661,14 @@ bool omap_dma_filter_fn(struct dma_chan *chan, void *param)
 }
 EXPORT_SYMBOL_GPL(omap_dma_filter_fn);
 
-static struct platform_device *pdev;
-
-static const struct platform_device_info omap_dma_dev_info = {
-       .name = "omap-dma-engine",
-       .id = -1,
-       .dma_mask = DMA_BIT_MASK(32),
-};
-
 static int omap_dma_init(void)
 {
-       int rc = platform_driver_register(&omap_dma_driver);
-
-       if (rc == 0) {
-               pdev = platform_device_register_full(&omap_dma_dev_info);
-               if (IS_ERR(pdev)) {
-                       platform_driver_unregister(&omap_dma_driver);
-                       rc = PTR_ERR(pdev);
-               }
-       }
-       return rc;
+       return platform_driver_register(&omap_dma_driver);
 }
 subsys_initcall(omap_dma_init);
 
 static void __exit omap_dma_exit(void)
 {
-       platform_device_unregister(pdev);
        platform_driver_unregister(&omap_dma_driver);
 }
 module_exit(omap_dma_exit);