Skip to content

Commit

Permalink
ARM: OMAP: Fix dmaengine init for multiplatform
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tony Lindgren committed Jan 11, 2013
1 parent a6cf912 commit be1f948
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 23 deletions.
18 changes: 16 additions & 2 deletions arch/arm/mach-omap1/dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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:
Expand Down
21 changes: 19 additions & 2 deletions arch/arm/mach-omap2/dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
20 changes: 1 addition & 19 deletions drivers/dma/omap-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit be1f948

Please sign in to comment.