aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/sh/include/asm/io.h6
-rw-r--r--arch/sh/mm/ioremap.c2
-rw-r--r--arch/sh/mm/ioremap_fixed.c22
3 files changed, 8 insertions, 22 deletions
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h
index 13696dfccc16..70269813cef1 100644
--- a/arch/sh/include/asm/io.h
+++ b/arch/sh/include/asm/io.h
@@ -239,12 +239,14 @@ void __iomem *__ioremap_caller(unsigned long offset, unsigned long size,
239void __iounmap(void __iomem *addr); 239void __iounmap(void __iomem *addr);
240 240
241#ifdef CONFIG_IOREMAP_FIXED 241#ifdef CONFIG_IOREMAP_FIXED
242extern void __iomem *ioremap_fixed(resource_size_t, unsigned long, pgprot_t); 242extern void __iomem *ioremap_fixed(resource_size_t, unsigned long,
243 unsigned long, pgprot_t);
243extern int iounmap_fixed(void __iomem *); 244extern int iounmap_fixed(void __iomem *);
244extern void ioremap_fixed_init(void); 245extern void ioremap_fixed_init(void);
245#else 246#else
246static inline void __iomem * 247static inline void __iomem *
247ioremap_fixed(resource_size t phys_addr, unsigned long size, pgprot_t prot) 248ioremap_fixed(resource_size t phys_addr, unsigned long offset,
249 unsigned long size, pgprot_t prot)
248{ 250{
249 BUG(); 251 BUG();
250} 252}
diff --git a/arch/sh/mm/ioremap.c b/arch/sh/mm/ioremap.c
index 85b420d00622..bb03308e8408 100644
--- a/arch/sh/mm/ioremap.c
+++ b/arch/sh/mm/ioremap.c
@@ -68,7 +68,7 @@ __ioremap_caller(unsigned long phys_addr, unsigned long size,
68 * If we can't yet use the regular approach, go the fixmap route. 68 * If we can't yet use the regular approach, go the fixmap route.
69 */ 69 */
70 if (!mem_init_done) 70 if (!mem_init_done)
71 return ioremap_fixed(phys_addr, size, pgprot); 71 return ioremap_fixed(phys_addr, offset, size, pgprot);
72 72
73 /* 73 /*
74 * Ok, go for it.. 74 * Ok, go for it..
diff --git a/arch/sh/mm/ioremap_fixed.c b/arch/sh/mm/ioremap_fixed.c
index 425f6c6bf250..551b513e8fce 100644
--- a/arch/sh/mm/ioremap_fixed.c
+++ b/arch/sh/mm/ioremap_fixed.c
@@ -45,12 +45,11 @@ void __init ioremap_fixed_init(void)
45} 45}
46 46
47void __init __iomem * 47void __init __iomem *
48ioremap_fixed(resource_size_t phys_addr, unsigned long size, pgprot_t prot) 48ioremap_fixed(resource_size_t phys_addr, unsigned long offset,
49 unsigned long size, pgprot_t prot)
49{ 50{
50 enum fixed_addresses idx0, idx; 51 enum fixed_addresses idx0, idx;
51 resource_size_t last_addr;
52 struct ioremap_map *map; 52 struct ioremap_map *map;
53 unsigned long offset;
54 unsigned int nrpages; 53 unsigned int nrpages;
55 int i, slot; 54 int i, slot;
56 55
@@ -67,18 +66,6 @@ ioremap_fixed(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
67 if (slot < 0) 66 if (slot < 0)
68 return NULL; 67 return NULL;
69 68
70 /* Don't allow wraparound or zero size */
71 last_addr = phys_addr + size - 1;
72 if (!size || last_addr < phys_addr)
73 return NULL;
74
75 /*
76 * Fixmap mappings have to be page-aligned
77 */
78 offset = phys_addr & ~PAGE_MASK;
79 phys_addr &= PAGE_MASK;
80 size = PAGE_ALIGN(last_addr + 1) - phys_addr;
81
82 /* 69 /*
83 * Mappings have to fit in the FIX_IOREMAP area. 70 * Mappings have to fit in the FIX_IOREMAP area.
84 */ 71 */
@@ -111,7 +98,6 @@ int iounmap_fixed(void __iomem *addr)
111 unsigned long offset; 98 unsigned long offset;
112 unsigned int nrpages; 99 unsigned int nrpages;
113 int i, slot; 100 int i, slot;
114 pgprot_t prot;
115 101
116 slot = -1; 102 slot = -1;
117 for (i = 0; i < FIX_N_IOREMAPS; i++) { 103 for (i = 0; i < FIX_N_IOREMAPS; i++) {
@@ -133,11 +119,9 @@ int iounmap_fixed(void __iomem *addr)
133 offset = virt_addr & ~PAGE_MASK; 119 offset = virt_addr & ~PAGE_MASK;
134 nrpages = PAGE_ALIGN(offset + map->size - 1) >> PAGE_SHIFT; 120 nrpages = PAGE_ALIGN(offset + map->size - 1) >> PAGE_SHIFT;
135 121
136 pgprot_val(prot) = _PAGE_WIRED;
137
138 idx = FIX_IOREMAP_BEGIN + slot + nrpages; 122 idx = FIX_IOREMAP_BEGIN + slot + nrpages;
139 while (nrpages > 0) { 123 while (nrpages > 0) {
140 __clear_fixmap(idx, prot); 124 __clear_fixmap(idx, __pgprot(_PAGE_WIRED));
141 --idx; 125 --idx;
142 --nrpages; 126 --nrpages;
143 } 127 }