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>
This commit is contained in:
Tony Lindgren 2013-01-11 11:24:19 -08:00
parent a6cf912c60
commit be1f94812c
3 changed files with 36 additions and 23 deletions

View file

@ -24,7 +24,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/dma-mapping.h>
#include <linux/omap-dma.h> #include <linux/omap-dma.h>
#include <mach/tc.h> #include <mach/tc.h>
@ -270,11 +270,17 @@ static u32 configure_dma_errata(void)
return errata; 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) static int __init omap1_system_dma_init(void)
{ {
struct omap_system_dma_plat_info *p; struct omap_system_dma_plat_info *p;
struct omap_dma_dev_attr *d; struct omap_dma_dev_attr *d;
struct platform_device *pdev; struct platform_device *pdev, *dma_pdev;
int ret; int ret;
pdev = platform_device_alloc("omap_dma_system", 0); 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_start = CPC;
dma_common_ch_end = COLOR; 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; return ret;
exit_release_pdev:
platform_device_del(pdev);
exit_release_chan: exit_release_chan:
kfree(d->chan); kfree(d->chan);
exit_release_d: exit_release_d:

View file

@ -27,7 +27,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/omap-dma.h> #include <linux/omap-dma.h>
#include "soc.h" #include "soc.h"
@ -288,9 +288,26 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
return 0; 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) 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); 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); omap_arch_initcall(omap2_system_dma_init);

View file

@ -661,32 +661,14 @@ bool omap_dma_filter_fn(struct dma_chan *chan, void *param)
} }
EXPORT_SYMBOL_GPL(omap_dma_filter_fn); 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) static int omap_dma_init(void)
{ {
int rc = platform_driver_register(&omap_dma_driver); return 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;
} }
subsys_initcall(omap_dma_init); subsys_initcall(omap_dma_init);
static void __exit omap_dma_exit(void) static void __exit omap_dma_exit(void)
{ {
platform_device_unregister(pdev);
platform_driver_unregister(&omap_dma_driver); platform_driver_unregister(&omap_dma_driver);
} }
module_exit(omap_dma_exit); module_exit(omap_dma_exit);