70 строки
1.5 KiB
C
70 строки
1.5 KiB
C
|
/*
|
||
|
* 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);
|
||
|
}
|