/* * linux/arch/arm/mach-mmp/devices.c * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <linux/init.h> #include <linux/platform_device.h> #include <linux/dma-mapping.h> #include <asm/irq.h> #include <mach/devices.h> int __init pxa_register_device(struct pxa_device_desc *desc, void *data, size_t size) { struct platform_device *pdev; struct resource res[2 + MAX_RESOURCE_DMA]; int i, ret = 0, nres = 0; pdev = platform_device_alloc(desc->drv_name, desc->id); if (pdev == NULL) return -ENOMEM; pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); memset(res, 0, sizeof(res)); if (desc->start != -1ul && desc->size > 0) { res[nres].start = desc->start; res[nres].end = desc->start + desc->size - 1; res[nres].flags = IORESOURCE_MEM; nres++; } if (desc->irq != NO_IRQ) { res[nres].start = desc->irq; res[nres].end = desc->irq; res[nres].flags = IORESOURCE_IRQ; nres++; } for (i = 0; i < MAX_RESOURCE_DMA; i++, nres++) { if (desc->dma[i] == 0) break; res[nres].start = desc->dma[i]; res[nres].end = desc->dma[i]; res[nres].flags = IORESOURCE_DMA; } ret = platform_device_add_resources(pdev, res, nres); if (ret) { platform_device_put(pdev); return ret; } if (data && size) { ret = platform_device_add_data(pdev, data, size); if (ret) { platform_device_put(pdev); return ret; } } return platform_device_add(pdev); }