Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-mmp/devices.c
10817 views
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
16
int __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
71