Commit be1f94812c2cc0aaf696d39fe23104763ea52b5b

Authored by Tony Lindgren
1 parent a6cf912c60

ARM: OMAP: Fix dmaengine init for multiplatform

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>

Showing 3 changed files with 36 additions and 23 deletions Side-by-side Diff

arch/arm/mach-omap1/dma.c
... ... @@ -24,7 +24,7 @@
24 24 #include <linux/init.h>
25 25 #include <linux/device.h>
26 26 #include <linux/io.h>
27   -
  27 +#include <linux/dma-mapping.h>
28 28 #include <linux/omap-dma.h>
29 29 #include <mach/tc.h>
30 30  
31 31  
... ... @@ -270,11 +270,17 @@
270 270 return errata;
271 271 }
272 272  
  273 +static const struct platform_device_info omap_dma_dev_info = {
  274 + .name = "omap-dma-engine",
  275 + .id = -1,
  276 + .dma_mask = DMA_BIT_MASK(32),
  277 +};
  278 +
273 279 static int __init omap1_system_dma_init(void)
274 280 {
275 281 struct omap_system_dma_plat_info *p;
276 282 struct omap_dma_dev_attr *d;
277   - struct platform_device *pdev;
  283 + struct platform_device *pdev, *dma_pdev;
278 284 int ret;
279 285  
280 286 pdev = platform_device_alloc("omap_dma_system", 0);
281 287  
... ... @@ -380,8 +386,16 @@
380 386 dma_common_ch_start = CPC;
381 387 dma_common_ch_end = COLOR;
382 388  
  389 + dma_pdev = platform_device_register_full(&omap_dma_dev_info);
  390 + if (IS_ERR(dma_pdev)) {
  391 + ret = PTR_ERR(dma_pdev);
  392 + goto exit_release_pdev;
  393 + }
  394 +
383 395 return ret;
384 396  
  397 +exit_release_pdev:
  398 + platform_device_del(pdev);
385 399 exit_release_chan:
386 400 kfree(d->chan);
387 401 exit_release_d:
arch/arm/mach-omap2/dma.c
... ... @@ -27,7 +27,7 @@
27 27 #include <linux/module.h>
28 28 #include <linux/init.h>
29 29 #include <linux/device.h>
30   -
  30 +#include <linux/dma-mapping.h>
31 31 #include <linux/omap-dma.h>
32 32  
33 33 #include "soc.h"
34 34  
35 35  
... ... @@ -288,10 +288,27 @@
288 288 return 0;
289 289 }
290 290  
  291 +static const struct platform_device_info omap_dma_dev_info = {
  292 + .name = "omap-dma-engine",
  293 + .id = -1,
  294 + .dma_mask = DMA_BIT_MASK(32),
  295 +};
  296 +
291 297 static int __init omap2_system_dma_init(void)
292 298 {
293   - return omap_hwmod_for_each_by_class("dma",
  299 + struct platform_device *pdev;
  300 + int res;
  301 +
  302 + res = omap_hwmod_for_each_by_class("dma",
294 303 omap2_system_dma_init_dev, NULL);
  304 + if (res)
  305 + return res;
  306 +
  307 + pdev = platform_device_register_full(&omap_dma_dev_info);
  308 + if (IS_ERR(pdev))
  309 + return PTR_ERR(pdev);
  310 +
  311 + return res;
295 312 }
296 313 omap_arch_initcall(omap2_system_dma_init);
drivers/dma/omap-dma.c
... ... @@ -661,32 +661,14 @@
661 661 }
662 662 EXPORT_SYMBOL_GPL(omap_dma_filter_fn);
663 663  
664   -static struct platform_device *pdev;
665   -
666   -static const struct platform_device_info omap_dma_dev_info = {
667   - .name = "omap-dma-engine",
668   - .id = -1,
669   - .dma_mask = DMA_BIT_MASK(32),
670   -};
671   -
672 664 static int omap_dma_init(void)
673 665 {
674   - int rc = platform_driver_register(&omap_dma_driver);
675   -
676   - if (rc == 0) {
677   - pdev = platform_device_register_full(&omap_dma_dev_info);
678   - if (IS_ERR(pdev)) {
679   - platform_driver_unregister(&omap_dma_driver);
680   - rc = PTR_ERR(pdev);
681   - }
682   - }
683   - return rc;
  666 + return platform_driver_register(&omap_dma_driver);
684 667 }
685 668 subsys_initcall(omap_dma_init);
686 669  
687 670 static void __exit omap_dma_exit(void)
688 671 {
689   - platform_device_unregister(pdev);
690 672 platform_driver_unregister(&omap_dma_driver);
691 673 }
692 674 module_exit(omap_dma_exit);