diff options
| author | Tony Lindgren <tony@atomide.com> | 2013-01-11 11:24:19 -0800 | 
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2013-01-11 11:24:19 -0800 | 
| commit | be1f94812c2cc0aaf696d39fe23104763ea52b5b (patch) | |
| tree | 2f9789af80ad91ad976a824548c0c2aa4d9b591f | |
| parent | a6cf912c6047077a6eb860ed8dbfa342376ee395 (diff) | |
| download | olio-linux-3.10-be1f94812c2cc0aaf696d39fe23104763ea52b5b.tar.xz olio-linux-3.10-be1f94812c2cc0aaf696d39fe23104763ea52b5b.zip | |
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>
| -rw-r--r-- | arch/arm/mach-omap1/dma.c | 18 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/dma.c | 21 | ||||
| -rw-r--r-- | drivers/dma/omap-dma.c | 20 | 
3 files changed, 36 insertions, 23 deletions
| diff --git a/arch/arm/mach-omap1/dma.c b/arch/arm/mach-omap1/dma.c index e190611e4b4..1a4e887f028 100644 --- a/arch/arm/mach-omap1/dma.c +++ b/arch/arm/mach-omap1/dma.c @@ -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: diff --git a/arch/arm/mach-omap2/dma.c b/arch/arm/mach-omap2/dma.c index e034ab69a04..5cd8d7668be 100644 --- a/arch/arm/mach-omap2/dma.c +++ b/arch/arm/mach-omap2/dma.c @@ -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); diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c index 5a31264f2bd..c4b4fd2acc4 100644 --- a/drivers/dma/omap-dma.c +++ b/drivers/dma/omap-dma.c @@ -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); |