1/* 2 * linux/arch/arm/mach-mmp/devices.c 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9#include <linux/init.h> 10#include <linux/platform_device.h> 11#include <linux/dma-mapping.h> 12 13#include <asm/irq.h> 14#include <mach/devices.h> 15 16int __init pxa_register_device(struct pxa_device_desc *desc, 17 void *data, size_t size) 18{ 19 struct platform_device *pdev; 20 struct resource res[2 + MAX_RESOURCE_DMA]; 21 int i, ret = 0, nres = 0; 22 23 pdev = platform_device_alloc(desc->drv_name, desc->id); 24 if (pdev == NULL) 25 return -ENOMEM; 26 27 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); 28 29 memset(res, 0, sizeof(res)); 30 31 if (desc->start != -1ul && desc->size > 0) { 32 res[nres].start = desc->start; 33 res[nres].end = desc->start + desc->size - 1; 34 res[nres].flags = IORESOURCE_MEM; 35 nres++; 36 } 37 38 if (desc->irq != NO_IRQ) { 39 res[nres].start = desc->irq; 40 res[nres].end = desc->irq; 41 res[nres].flags = IORESOURCE_IRQ; 42 nres++; 43 } 44 45 for (i = 0; i < MAX_RESOURCE_DMA; i++, nres++) { 46 if (desc->dma[i] == 0) 47 break; 48 49 res[nres].start = desc->dma[i]; 50 res[nres].end = desc->dma[i]; 51 res[nres].flags = IORESOURCE_DMA; 52 } 53 54 ret = platform_device_add_resources(pdev, res, nres); 55 if (ret) { 56 platform_device_put(pdev); 57 return ret; 58 } 59 60 if (data && size) { 61 ret = platform_device_add_data(pdev, data, size); 62 if (ret) { 63 platform_device_put(pdev); 64 return ret; 65 } 66 } 67 68 return platform_device_add(pdev); 69} 70