Commit 6332c107 authored by Uwe Kleine-König's avatar Uwe Kleine-König

ARM: imx: allow specifying a dma mask when creating a platform device

Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
parent e0830004
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -36,9 +37,10 @@ int __init mxc_register_device(struct platform_device *pdev, void *data) ...@@ -36,9 +37,10 @@ int __init mxc_register_device(struct platform_device *pdev, void *data)
return ret; return ret;
} }
struct platform_device *__init imx_add_platform_device(const char *name, int id, struct platform_device *__init imx_add_platform_device_dmamask(
const char *name, int id,
const struct resource *res, unsigned int num_resources, const struct resource *res, unsigned int num_resources,
const void *data, size_t size_data) const void *data, size_t size_data, u64 dmamask)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
struct platform_device *pdev; struct platform_device *pdev;
...@@ -47,6 +49,23 @@ struct platform_device *__init imx_add_platform_device(const char *name, int id, ...@@ -47,6 +49,23 @@ struct platform_device *__init imx_add_platform_device(const char *name, int id,
if (!pdev) if (!pdev)
goto err; goto err;
if (dmamask) {
/*
* This memory isn't freed when the device is put,
* I don't have a nice idea for that though. Conceptually
* dma_mask in struct device should not be a pointer.
* See http://thread.gmane.org/gmane.linux.kernel.pci/9081
*/
pdev->dev.dma_mask =
kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
if (!pdev->dev.dma_mask)
/* ret is still -ENOMEM; */
goto err;
*pdev->dev.dma_mask = dmamask;
pdev->dev.coherent_dma_mask = dmamask;
}
if (res) { if (res) {
ret = platform_device_add_resources(pdev, res, num_resources); ret = platform_device_add_resources(pdev, res, num_resources);
if (ret) if (ret)
......
...@@ -10,9 +10,19 @@ ...@@ -10,9 +10,19 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/init.h> #include <linux/init.h>
struct platform_device *imx_add_platform_device(const char *name, int id, struct platform_device *imx_add_platform_device_dmamask(
const char *name, int id,
const struct resource *res, unsigned int num_resources, const struct resource *res, unsigned int num_resources,
const void *data, size_t size_data); const void *data, size_t size_data, u64 dmamask);
static inline struct platform_device *imx_add_platform_device(
const char *name, int id,
const struct resource *res, unsigned int num_resources,
const void *data, size_t size_data)
{
return imx_add_platform_device_dmamask(
name, id, res, num_resources, data, size_data, 0);
}
#include <linux/fec.h> #include <linux/fec.h>
struct imx_fec_data { struct imx_fec_data {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment