ARM: imx: allow specifying a dma mask when creating a platform device
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Tue, 2 Nov 2010 10:56:54 +0000 (11:56 +0100)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 17 Nov 2010 09:01:21 +0000 (10:01 +0100)
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
arch/arm/plat-mxc/devices.c
arch/arm/plat-mxc/include/mach/devices-common.h

index 735776d8495636fd8e7429fc2d21b9797bd575ff..e9bcefe79a43d6edb1a18e8ade4b8b3f6bb83619 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/err.h>
 #include <linux/platform_device.h>
@@ -36,9 +37,10 @@ int __init mxc_register_device(struct platform_device *pdev, void *data)
        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 void *data, size_t size_data)
+               const void *data, size_t size_data, u64 dmamask)
 {
        int ret = -ENOMEM;
        struct platform_device *pdev;
@@ -47,6 +49,23 @@ struct platform_device *__init imx_add_platform_device(const char *name, int id,
        if (!pdev)
                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) {
                ret = platform_device_add_resources(pdev, res, num_resources);
                if (ret)
index 4eb45fa53ac5e43f7627d0217782e6131f3b6770..a5e97b8b3b793f0f4f49612950f453f839eaa509 100644 (file)
 #include <linux/platform_device.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 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>
 struct imx_fec_data {