sh: Add memory chunks to SH-Mobile UIO devices
PATCH 1/1 sh: Add memory chunks to SH-Mobile UIO devices
From: Magnus Damm <[email protected]>
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 <[email protected]>
---
arch/sh/kernel/cpu/sh4a/setup-sh7343.c | 8 ++++++++ arch/sh/kernel/cpu/sh4a/setup-sh7366.c | 12 ++++++++++++ arch/sh/kernel/cpu/sh4a/setup-sh7722.c | 8 ++++++++ arch/sh/kernel/cpu/sh4a/setup-sh7723.c | 12 ++++++++++++ arch/sh/mm/consistent.c | 30 ++++++++++++++++++++++++++++++ include/asm-sh/device.h | 5 +++++ 6 files changed, 75 insertions(+)
arch/sh/kernel/cpu/sh4a/setup-sh7343.c +8 -0
@@ -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_destatic 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)); }
arch/sh/kernel/cpu/sh4a/setup-sh7366.c +12 -0
@@ -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_destatic 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)); }
arch/sh/kernel/cpu/sh4a/setup-sh7722.c +8 -0
@@ -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_destatic 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)); }
arch/sh/kernel/cpu/sh4a/setup-sh7723.c +12 -0
@@ -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_destatic 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)); }
arch/sh/mm/consistent.c +30 -0
@@ -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, } }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 ; +}
include/asm-sh/device.h +5 -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); +