diff options
Diffstat (limited to 'drivers/dma/omap-dma.c')
| -rw-r--r-- | drivers/dma/omap-dma.c | 38 | 
1 files changed, 36 insertions, 2 deletions
diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c index 08b43bf3715..ec3fc4fd916 100644 --- a/drivers/dma/omap-dma.c +++ b/drivers/dma/omap-dma.c @@ -16,6 +16,8 @@  #include <linux/platform_device.h>  #include <linux/slab.h>  #include <linux/spinlock.h> +#include <linux/of_dma.h> +#include <linux/of_device.h>  #include "virt-dma.h" @@ -67,6 +69,10 @@ static const unsigned es_bytes[] = {  	[OMAP_DMA_DATA_TYPE_S32] = 4,  }; +static struct of_dma_filter_info omap_dma_info = { +	.filter_fn = omap_dma_filter_fn, +}; +  static inline struct omap_dmadev *to_omap_dma_dev(struct dma_device *d)  {  	return container_of(d, struct omap_dmadev, ddev); @@ -629,8 +635,22 @@ static int omap_dma_probe(struct platform_device *pdev)  		pr_warn("OMAP-DMA: failed to register slave DMA engine device: %d\n",  			rc);  		omap_dma_free(od); -	} else { -		platform_set_drvdata(pdev, od); +		return rc; +	} + +	platform_set_drvdata(pdev, od); + +	if (pdev->dev.of_node) { +		omap_dma_info.dma_cap = od->ddev.cap_mask; + +		/* Device-tree DMA controller registration */ +		rc = of_dma_controller_register(pdev->dev.of_node, +				of_dma_simple_xlate, &omap_dma_info); +		if (rc) { +			pr_warn("OMAP-DMA: failed to register DMA controller\n"); +			dma_async_device_unregister(&od->ddev); +			omap_dma_free(od); +		}  	}  	dev_info(&pdev->dev, "OMAP DMA engine driver\n"); @@ -642,18 +662,32 @@ static int omap_dma_remove(struct platform_device *pdev)  {  	struct omap_dmadev *od = platform_get_drvdata(pdev); +	if (pdev->dev.of_node) +		of_dma_controller_free(pdev->dev.of_node); +  	dma_async_device_unregister(&od->ddev);  	omap_dma_free(od);  	return 0;  } +static const struct of_device_id omap_dma_match[] = { +	{ .compatible = "ti,omap2420-sdma", }, +	{ .compatible = "ti,omap2430-sdma", }, +	{ .compatible = "ti,omap3430-sdma", }, +	{ .compatible = "ti,omap3630-sdma", }, +	{ .compatible = "ti,omap4430-sdma", }, +	{}, +}; +MODULE_DEVICE_TABLE(of, omap_dma_match); +  static struct platform_driver omap_dma_driver = {  	.probe	= omap_dma_probe,  	.remove	= omap_dma_remove,  	.driver = {  		.name = "omap-dma-engine",  		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(omap_dma_match),  	},  };  |