summaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-mxc/devices.c
diff options
context:
space:
mode:
authorUwe Kleine-König2010-11-02 11:56:54 +0100
committerUwe Kleine-König2010-11-17 10:01:21 +0100
commit6332c1071811a1d588cfc93330d87a57a7460a1b (patch)
treeb9e5a427bd583dc2cca240b190152d1a06ebd99a /arch/arm/plat-mxc/devices.c
parentARM: imx: dynamically allocate imx_udc device (diff)
downloadkernel-qcow2-linux-6332c1071811a1d588cfc93330d87a57a7460a1b.tar.gz
kernel-qcow2-linux-6332c1071811a1d588cfc93330d87a57a7460a1b.tar.xz
kernel-qcow2-linux-6332c1071811a1d588cfc93330d87a57a7460a1b.zip
ARM: imx: allow specifying a dma mask when creating a platform device
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Diffstat (limited to 'arch/arm/plat-mxc/devices.c')
-rw-r--r--arch/arm/plat-mxc/devices.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/arch/arm/plat-mxc/devices.c b/arch/arm/plat-mxc/devices.c
index 735776d84956..e9bcefe79a43 100644
--- a/arch/arm/plat-mxc/devices.c
+++ b/arch/arm/plat-mxc/devices.c
@@ -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)