|
@@ -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)
|