sh: Add memory chunks to SH-Mobile UIO devices
This patch adds physically contiguous memory chunks to the UIO devices. The same strategy can be used in the future for the CEU as well. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Родитель
714750dd5c
Коммит
1eca5c9272
|
@ -66,6 +66,9 @@ static struct resource vpu_resources[] = {
|
|||
.end = 0xfe9022eb,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
|
@ -91,6 +94,9 @@ static struct resource veu_resources[] = {
|
|||
.end = 0xfe9200b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu_device = {
|
||||
|
@ -132,6 +138,8 @@ static struct platform_device *sh7343_devices[] __initdata = {
|
|||
|
||||
static int __init sh7343_devices_setup(void)
|
||||
{
|
||||
platform_resource_setup_memory(&vpu_device, "vpu", 1 << 20);
|
||||
platform_resource_setup_memory(&veu_device, "veu", 2 << 20);
|
||||
return platform_add_devices(sh7343_devices,
|
||||
ARRAY_SIZE(sh7343_devices));
|
||||
}
|
||||
|
|
|
@ -48,6 +48,9 @@ static struct resource vpu_resources[] = {
|
|||
.end = 0xfe902807,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
|
@ -73,6 +76,9 @@ static struct resource veu0_resources[] = {
|
|||
.end = 0xfe9200b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu0_device = {
|
||||
|
@ -98,6 +104,9 @@ static struct resource veu1_resources[] = {
|
|||
.end = 0xfe9240b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu1_device = {
|
||||
|
@ -139,6 +148,9 @@ static struct platform_device *sh7366_devices[] __initdata = {
|
|||
|
||||
static int __init sh7366_devices_setup(void)
|
||||
{
|
||||
platform_resource_setup_memory(&vpu_device, "vpu", 2 << 20);
|
||||
platform_resource_setup_memory(&veu0_device, "veu0", 2 << 20);
|
||||
platform_resource_setup_memory(&veu1_device, "veu1", 2 << 20);
|
||||
return platform_add_devices(sh7366_devices,
|
||||
ARRAY_SIZE(sh7366_devices));
|
||||
}
|
||||
|
|
|
@ -73,6 +73,9 @@ static struct resource vpu_resources[] = {
|
|||
.end = 0xfe9022eb,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
|
@ -98,6 +101,9 @@ static struct resource veu_resources[] = {
|
|||
.end = 0xfe9200b7,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu_device = {
|
||||
|
@ -152,6 +158,8 @@ static struct platform_device *sh7722_devices[] __initdata = {
|
|||
|
||||
static int __init sh7722_devices_setup(void)
|
||||
{
|
||||
platform_resource_setup_memory(&vpu_device, "vpu", 1 << 20);
|
||||
platform_resource_setup_memory(&veu_device, "veu", 2 << 20);
|
||||
return platform_add_devices(sh7722_devices,
|
||||
ARRAY_SIZE(sh7722_devices));
|
||||
}
|
||||
|
|
|
@ -28,6 +28,9 @@ static struct resource vpu_resources[] = {
|
|||
.end = 0xfe902807,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpu_device = {
|
||||
|
@ -53,6 +56,9 @@ static struct resource veu0_resources[] = {
|
|||
.end = 0xfe92027b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu0_device = {
|
||||
|
@ -78,6 +84,9 @@ static struct resource veu1_resources[] = {
|
|||
.end = 0xfe92427b,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
/* place holder for contiguous memory */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device veu1_device = {
|
||||
|
@ -221,6 +230,9 @@ static struct platform_device *sh7723_devices[] __initdata = {
|
|||
|
||||
static int __init sh7723_devices_setup(void)
|
||||
{
|
||||
platform_resource_setup_memory(&vpu_device, "vpu", 2 << 20);
|
||||
platform_resource_setup_memory(&veu0_device, "veu0", 2 << 20);
|
||||
platform_resource_setup_memory(&veu1_device, "veu1", 2 << 20);
|
||||
return platform_add_devices(sh7723_devices,
|
||||
ARRAY_SIZE(sh7723_devices));
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* for more details.
|
||||
*/
|
||||
#include <linux/mm.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/addrspace.h>
|
||||
|
@ -185,3 +186,32 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
|||
}
|
||||
}
|
||||
EXPORT_SYMBOL(dma_cache_sync);
|
||||
|
||||
int platform_resource_setup_memory(struct platform_device *pdev,
|
||||
char *name, unsigned long memsize)
|
||||
{
|
||||
struct resource *r;
|
||||
dma_addr_t dma_handle;
|
||||
void *buf;
|
||||
|
||||
r = pdev->resource + pdev->num_resources - 1;
|
||||
if (r->flags) {
|
||||
pr_warning("%s: unable to find empty space for resource\n",
|
||||
name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
pr_warning("%s: unable to allocate memory\n", name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(buf, 0, memsize);
|
||||
|
||||
r->flags = IORESOURCE_MEM;
|
||||
r->start = dma_handle;
|
||||
r->end = r->start + memsize - 1;
|
||||
r->name = name;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -5,3 +5,8 @@
|
|||
*/
|
||||
#include <asm-generic/device.h>
|
||||
|
||||
struct platform_device;
|
||||
/* allocate contiguous memory chunk and fill in struct resource */
|
||||
int platform_resource_setup_memory(struct platform_device *pdev,
|
||||
char *name, unsigned long memsize);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче