diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index 90284ffda58a7b43e45d4617ab8cdde1a1411a80..6789d0b4a43e74a254e842eb44ad47bbfbc9294f 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig @@ -133,7 +133,7 @@ config COH901318 config DMA_BCM2835 tristate "BCM2835 DMA engine support" - depends on ARCH_BCM2835 + depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709 select DMA_ENGINE select DMA_VIRTUAL_CHANNELS diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c index 630dfbb01a40e6a7431b9bd566492b3f954c8bfe..bf7ba96a39f99a61f2fec373c2f7257ff6cd87fc 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #define BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED 14 #define BCM2835_DMA_CHAN_NAME_SIZE 8 +#define BCM2835_DMA_BULK_MASK BIT(0) /** * struct bcm2835_dmadev - BCM2835 DMA controller @@ -906,6 +908,9 @@ static int bcm2835_dma_probe(struct platform_device *pdev) base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(base)) return PTR_ERR(base); + rc = bcm_dmaman_probe(pdev, base, BCM2835_DMA_BULK_MASK); + if (rc) + dev_err(&pdev->dev, "Failed to initialize the legacy API\n"); od->base = base; @@ -951,6 +956,9 @@ static int bcm2835_dma_probe(struct platform_device *pdev) goto err_no_dma; } + /* Channel 0 is used by the legacy API */ + chans_available &= ~BCM2835_DMA_BULK_MASK; + /* get irqs for each channel that we support */ for (i = 0; i <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) { /* skip masked out channels */ @@ -1025,6 +1033,7 @@ static int bcm2835_dma_remove(struct platform_device *pdev) { struct bcm2835_dmadev *od = platform_get_drvdata(pdev); + bcm_dmaman_remove(pdev); dma_async_device_unregister(&od->ddev); bcm2835_dma_free(od); @@ -1040,7 +1049,22 @@ static struct platform_driver bcm2835_dma_driver = { }, }; -module_platform_driver(bcm2835_dma_driver); +static int bcm2835_dma_init(void) +{ + return platform_driver_register(&bcm2835_dma_driver); +} + +static void bcm2835_dma_exit(void) +{ + platform_driver_unregister(&bcm2835_dma_driver); +} + +/* + * Load after serial driver (arch_initcall) so we see the messages if it fails, + * but before drivers (module_init) that need a DMA channel. + */ +subsys_initcall(bcm2835_dma_init); +module_exit(bcm2835_dma_exit); MODULE_ALIAS("platform:bcm2835-dma"); MODULE_DESCRIPTION("BCM2835 DMA engine driver");