Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+36 -23
+16 -2
arch/arm/mach-omap1/dma.c
··· 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 ··· 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); ··· 386 380 dma_common_ch_start = CPC; 387 381 dma_common_ch_end = COLOR; 388 382 383 + dma_pdev = platform_device_register_full(&omap_dma_dev_info); 384 + if (IS_ERR(dma_pdev)) { 385 + ret = PTR_ERR(dma_pdev); 386 + goto exit_release_pdev; 387 + } 388 + 389 389 return ret; 390 390 391 + exit_release_pdev: 392 + platform_device_del(pdev); 391 393 exit_release_chan: 392 394 kfree(d->chan); 393 395 exit_release_d:
+19 -2
arch/arm/mach-omap2/dma.c
··· 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" ··· 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);
+1 -19
drivers/dma/omap-dma.c
··· 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);