Commit be1f94812c2cc0aaf696d39fe23104763ea52b5b
1 parent
a6cf912c60
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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); |