aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/sh/boards/mach-cayman/irq.c2
-rw-r--r--arch/sh/boards/mach-cayman/setup.c2
-rw-r--r--arch/sh/drivers/pci/pci-sh5.c4
-rw-r--r--arch/sh/include/asm/io.h7
-rw-r--r--arch/sh/kernel/cpu/irq/intc-sh5.c2
-rw-r--r--arch/sh/kernel/cpu/sh5/Makefile3
-rw-r--r--arch/sh/kernel/cpu/sh5/clock-sh5.c2
-rw-r--r--arch/sh/kernel/cpu/sh5/entry.S8
-rw-r--r--arch/sh/kernel/cpu/sh5/setup-sh5.c46
-rw-r--r--arch/sh/kernel/time_64.c4
-rw-r--r--arch/sh/mm/ioremap_64.c265
11 files changed, 155 insertions, 190 deletions
diff --git a/arch/sh/boards/mach-cayman/irq.c b/arch/sh/boards/mach-cayman/irq.c
index da62ad516994..dbb00c991324 100644
--- a/arch/sh/boards/mach-cayman/irq.c
+++ b/arch/sh/boards/mach-cayman/irq.c
@@ -161,7 +161,7 @@ void init_cayman_irq(void)
161{ 161{
162 int i; 162 int i;
163 163
164 epld_virt = onchip_remap(EPLD_BASE, 1024, "EPLD"); 164 epld_virt = (unsigned long)ioremap_nocache(EPLD_BASE, 1024);
165 if (!epld_virt) { 165 if (!epld_virt) {
166 printk(KERN_ERR "Cayman IRQ: Unable to remap EPLD\n"); 166 printk(KERN_ERR "Cayman IRQ: Unable to remap EPLD\n");
167 return; 167 return;
diff --git a/arch/sh/boards/mach-cayman/setup.c b/arch/sh/boards/mach-cayman/setup.c
index e7f9cc5f2ff1..7e8216ac31bd 100644
--- a/arch/sh/boards/mach-cayman/setup.c
+++ b/arch/sh/boards/mach-cayman/setup.c
@@ -102,7 +102,7 @@ static int __init smsc_superio_setup(void)
102{ 102{
103 unsigned char devid, devrev; 103 unsigned char devid, devrev;
104 104
105 smsc_superio_virt = onchip_remap(SMSC_SUPERIO_BASE, 1024, "SMSC SuperIO"); 105 smsc_superio_virt = (unsigned long)ioremap_nocache(SMSC_SUPERIO_BASE, 1024);
106 if (!smsc_superio_virt) { 106 if (!smsc_superio_virt) {
107 panic("Unable to remap SMSC SuperIO\n"); 107 panic("Unable to remap SMSC SuperIO\n");
108 } 108 }
diff --git a/arch/sh/drivers/pci/pci-sh5.c b/arch/sh/drivers/pci/pci-sh5.c
index cf431852213c..873ed2b44055 100644
--- a/arch/sh/drivers/pci/pci-sh5.c
+++ b/arch/sh/drivers/pci/pci-sh5.c
@@ -119,12 +119,12 @@ static int __init sh5pci_init(void)
119 return -EINVAL; 119 return -EINVAL;
120 } 120 }
121 121
122 pcicr_virt = onchip_remap(SH5PCI_ICR_BASE, 1024, "PCICR"); 122 pcicr_virt = (unsigned long)ioremap_nocache(SH5PCI_ICR_BASE, 1024);
123 if (!pcicr_virt) { 123 if (!pcicr_virt) {
124 panic("Unable to remap PCICR\n"); 124 panic("Unable to remap PCICR\n");
125 } 125 }
126 126
127 PCI_IO_AREA = onchip_remap(SH5PCI_IO_BASE, 0x10000, "PCIIO"); 127 PCI_IO_AREA = (unsigned long)ioremap_nocache(SH5PCI_IO_BASE, 0x10000);
128 if (!PCI_IO_AREA) { 128 if (!PCI_IO_AREA) {
129 panic("Unable to remap PCIIO\n"); 129 panic("Unable to remap PCIIO\n");
130 } 130 }
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h
index ef217344afcb..c7c360b58667 100644
--- a/arch/sh/include/asm/io.h
+++ b/arch/sh/include/asm/io.h
@@ -224,11 +224,6 @@ void __iomem *__ioremap(unsigned long offset, unsigned long size,
224 unsigned long flags); 224 unsigned long flags);
225void __iounmap(void __iomem *addr); 225void __iounmap(void __iomem *addr);
226 226
227/* arch/sh/mm/ioremap_64.c */
228unsigned long onchip_remap(unsigned long addr, unsigned long size,
229 const char *name);
230extern void onchip_unmap(unsigned long vaddr);
231
232static inline void __iomem * 227static inline void __iomem *
233__ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) 228__ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
234{ 229{
@@ -263,8 +258,6 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
263 return __ioremap(offset, size, flags); 258 return __ioremap(offset, size, flags);
264} 259}
265#else 260#else
266#define onchip_remap(addr, size, name) (addr)
267#define onchip_unmap(addr) do { } while (0)
268#define __ioremap_mode(offset, size, flags) ((void __iomem *)(offset)) 261#define __ioremap_mode(offset, size, flags) ((void __iomem *)(offset))
269#define __iounmap(addr) do { } while (0) 262#define __iounmap(addr) do { } while (0)
270#endif /* CONFIG_MMU */ 263#endif /* CONFIG_MMU */
diff --git a/arch/sh/kernel/cpu/irq/intc-sh5.c b/arch/sh/kernel/cpu/irq/intc-sh5.c
index d8679a4d93a4..02d8137547e8 100644
--- a/arch/sh/kernel/cpu/irq/intc-sh5.c
+++ b/arch/sh/kernel/cpu/irq/intc-sh5.c
@@ -188,7 +188,7 @@ void __init plat_irq_setup(void)
188 unsigned long reg; 188 unsigned long reg;
189 int i; 189 int i;
190 190
191 intc_virt = onchip_remap(INTC_BASE, 1024, "INTC"); 191 intc_virt = (unsigned long)ioremap_nocache(INTC_BASE, 1024);
192 if (!intc_virt) { 192 if (!intc_virt) {
193 panic("Unable to remap INTC\n"); 193 panic("Unable to remap INTC\n");
194 } 194 }
diff --git a/arch/sh/kernel/cpu/sh5/Makefile b/arch/sh/kernel/cpu/sh5/Makefile
index ce4602ea23a8..a184a31e686e 100644
--- a/arch/sh/kernel/cpu/sh5/Makefile
+++ b/arch/sh/kernel/cpu/sh5/Makefile
@@ -6,6 +6,9 @@ obj-y := entry.o probe.o switchto.o
6obj-$(CONFIG_SH_FPU) += fpu.o 6obj-$(CONFIG_SH_FPU) += fpu.o
7obj-$(CONFIG_KALLSYMS) += unwind.o 7obj-$(CONFIG_KALLSYMS) += unwind.o
8 8
9# CPU subtype setup
10obj-$(CONFIG_CPU_SH5) += setup-sh5.o
11
9# Primary on-chip clocks (common) 12# Primary on-chip clocks (common)
10clock-$(CONFIG_CPU_SH5) := clock-sh5.o 13clock-$(CONFIG_CPU_SH5) := clock-sh5.o
11 14
diff --git a/arch/sh/kernel/cpu/sh5/clock-sh5.c b/arch/sh/kernel/cpu/sh5/clock-sh5.c
index 52c49248833a..5486324880e1 100644
--- a/arch/sh/kernel/cpu/sh5/clock-sh5.c
+++ b/arch/sh/kernel/cpu/sh5/clock-sh5.c
@@ -71,7 +71,7 @@ static struct clk_ops *sh5_clk_ops[] = {
71 71
72void __init arch_init_clk_ops(struct clk_ops **ops, int idx) 72void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
73{ 73{
74 cprc_base = onchip_remap(CPRC_BASE, 1024, "CPRC"); 74 cprc_base = (unsigned long)ioremap_nocache(CPRC_BASE, 1024);
75 BUG_ON(!cprc_base); 75 BUG_ON(!cprc_base);
76 76
77 if (idx < ARRAY_SIZE(sh5_clk_ops)) 77 if (idx < ARRAY_SIZE(sh5_clk_ops))
diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S
index 7e49cb812f8b..516297515b25 100644
--- a/arch/sh/kernel/cpu/sh5/entry.S
+++ b/arch/sh/kernel/cpu/sh5/entry.S
@@ -1410,8 +1410,8 @@ peek_real_address_q:
1410 r2(out) : result quadword 1410 r2(out) : result quadword
1411 1411
1412 This is provided as a cheapskate way of manipulating device 1412 This is provided as a cheapskate way of manipulating device
1413 registers for debugging (to avoid the need to onchip_remap the debug 1413 registers for debugging (to avoid the need to ioremap the debug
1414 module, and to avoid the need to onchip_remap the watchpoint 1414 module, and to avoid the need to ioremap the watchpoint
1415 controller in a way that identity maps sufficient bits to avoid the 1415 controller in a way that identity maps sufficient bits to avoid the
1416 SH5-101 cut2 silicon defect). 1416 SH5-101 cut2 silicon defect).
1417 1417
@@ -1459,8 +1459,8 @@ poke_real_address_q:
1459 r3 : quadword value to write. 1459 r3 : quadword value to write.
1460 1460
1461 This is provided as a cheapskate way of manipulating device 1461 This is provided as a cheapskate way of manipulating device
1462 registers for debugging (to avoid the need to onchip_remap the debug 1462 registers for debugging (to avoid the need to ioremap the debug
1463 module, and to avoid the need to onchip_remap the watchpoint 1463 module, and to avoid the need to ioremap the watchpoint
1464 controller in a way that identity maps sufficient bits to avoid the 1464 controller in a way that identity maps sufficient bits to avoid the
1465 SH5-101 cut2 silicon defect). 1465 SH5-101 cut2 silicon defect).
1466 1466
diff --git a/arch/sh/kernel/cpu/sh5/setup-sh5.c b/arch/sh/kernel/cpu/sh5/setup-sh5.c
new file mode 100644
index 000000000000..d8d59fea1082
--- /dev/null
+++ b/arch/sh/kernel/cpu/sh5/setup-sh5.c
@@ -0,0 +1,46 @@
1/*
2 * SH5-101/SH5-103 CPU Setup
3 *
4 * Copyright (C) 2009 Paul Mundt
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10#include <linux/platform_device.h>
11#include <linux/init.h>
12#include <linux/serial.h>
13#include <linux/serial_sci.h>
14#include <linux/io.h>
15#include <linux/mm.h>
16#include <asm/addrspace.h>
17
18static struct plat_sci_port sci_platform_data[] = {
19 {
20 .mapbase = PHYS_PERIPHERAL_BLOCK + 0x01030000,
21 .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
22 .type = PORT_SCIF,
23 .irqs = { 39, 40, 42, 0 },
24 }, {
25 .flags = 0,
26 }
27};
28
29static struct platform_device sci_device = {
30 .name = "sh-sci",
31 .id = -1,
32 .dev = {
33 .platform_data = sci_platform_data,
34 },
35};
36
37static struct platform_device *sh5_devices[] __initdata = {
38 &sci_device,
39};
40
41static int __init sh5_devices_setup(void)
42{
43 return platform_add_devices(sh5_devices,
44 ARRAY_SIZE(sh5_devices));
45}
46__initcall(sh5_devices_setup);
diff --git a/arch/sh/kernel/time_64.c b/arch/sh/kernel/time_64.c
index f4f5e8ad5bec..7bfeaa09b947 100644
--- a/arch/sh/kernel/time_64.c
+++ b/arch/sh/kernel/time_64.c
@@ -243,12 +243,12 @@ void __init time_init(void)
243 unsigned long interval; 243 unsigned long interval;
244 struct clk *clk; 244 struct clk *clk;
245 245
246 tmu_base = onchip_remap(TMU_BASE, 1024, "TMU"); 246 tmu_base = (unsigned long)ioremap_nocache(TMU_BASE, 1024);
247 if (!tmu_base) { 247 if (!tmu_base) {
248 panic("Unable to remap TMU\n"); 248 panic("Unable to remap TMU\n");
249 } 249 }
250 250
251 rtc_base = onchip_remap(RTC_BASE, 1024, "RTC"); 251 rtc_base = (unsigned long)ioremap_nocache(RTC_BASE, 1024);
252 if (!rtc_base) { 252 if (!rtc_base) {
253 panic("Unable to remap RTC\n"); 253 panic("Unable to remap RTC\n");
254 } 254 }
diff --git a/arch/sh/mm/ioremap_64.c b/arch/sh/mm/ioremap_64.c
index 31e1bb5effbe..2331229f8126 100644
--- a/arch/sh/mm/ioremap_64.c
+++ b/arch/sh/mm/ioremap_64.c
@@ -27,88 +27,17 @@
27#include <asm/tlbflush.h> 27#include <asm/tlbflush.h>
28#include <asm/mmu.h> 28#include <asm/mmu.h>
29 29
30static void shmedia_mapioaddr(unsigned long, unsigned long);
31static unsigned long shmedia_ioremap(struct resource *, u32, int);
32
33/*
34 * Generic mapping function (not visible outside):
35 */
36
37/*
38 * Remap an arbitrary physical address space into the kernel virtual
39 * address space. Needed when the kernel wants to access high addresses
40 * directly.
41 *
42 * NOTE! We need to allow non-page-aligned mappings too: we will obviously
43 * have to convert them into an offset in a page-aligned mapping, but the
44 * caller shouldn't need to know that small detail.
45 */
46void *__ioremap(unsigned long phys_addr, unsigned long size,
47 unsigned long flags)
48{
49 void * addr;
50 struct vm_struct * area;
51 unsigned long offset, last_addr;
52 pgprot_t pgprot;
53
54 /* Don't allow wraparound or zero size */
55 last_addr = phys_addr + size - 1;
56 if (!size || last_addr < phys_addr)
57 return NULL;
58
59 pgprot = __pgprot(_PAGE_PRESENT | _PAGE_READ |
60 _PAGE_WRITE | _PAGE_DIRTY |
61 _PAGE_ACCESSED | _PAGE_SHARED | flags);
62
63 /*
64 * Mappings have to be page-aligned
65 */
66 offset = phys_addr & ~PAGE_MASK;
67 phys_addr &= PAGE_MASK;
68 size = PAGE_ALIGN(last_addr + 1) - phys_addr;
69
70 /*
71 * Ok, go for it..
72 */
73 area = get_vm_area(size, VM_IOREMAP);
74 if (!area)
75 return NULL;
76 pr_debug("Get vm_area returns %p addr %p\n", area, area->addr);
77 area->phys_addr = phys_addr;
78 addr = area->addr;
79 if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
80 phys_addr, pgprot)) {
81 vunmap(addr);
82 return NULL;
83 }
84 return (void *) (offset + (char *)addr);
85}
86EXPORT_SYMBOL(__ioremap);
87
88void __iounmap(void *addr)
89{
90 struct vm_struct *area;
91
92 vfree((void *) (PAGE_MASK & (unsigned long) addr));
93 area = remove_vm_area((void *) (PAGE_MASK & (unsigned long) addr));
94 if (!area) {
95 printk(KERN_ERR "iounmap: bad address %p\n", addr);
96 return;
97 }
98
99 kfree(area);
100}
101EXPORT_SYMBOL(__iounmap);
102
103static struct resource shmedia_iomap = { 30static struct resource shmedia_iomap = {
104 .name = "shmedia_iomap", 31 .name = "shmedia_iomap",
105 .start = IOBASE_VADDR + PAGE_SIZE, 32 .start = IOBASE_VADDR + PAGE_SIZE,
106 .end = IOBASE_END - 1, 33 .end = IOBASE_END - 1,
107}; 34};
108 35
109static void shmedia_mapioaddr(unsigned long pa, unsigned long va); 36static void shmedia_mapioaddr(unsigned long pa, unsigned long va,
37 unsigned long flags);
110static void shmedia_unmapioaddr(unsigned long vaddr); 38static void shmedia_unmapioaddr(unsigned long vaddr);
111static unsigned long shmedia_ioremap(struct resource *res, u32 pa, int sz); 39static void __iomem *shmedia_ioremap(struct resource *res, u32 pa,
40 int sz, unsigned long flags);
112 41
113/* 42/*
114 * We have the same problem as the SPARC, so lets have the same comment: 43 * We have the same problem as the SPARC, so lets have the same comment:
@@ -130,18 +59,18 @@ static struct xresource xresv[XNRES];
130 59
131static struct xresource *xres_alloc(void) 60static struct xresource *xres_alloc(void)
132{ 61{
133 struct xresource *xrp; 62 struct xresource *xrp;
134 int n; 63 int n;
135 64
136 xrp = xresv; 65 xrp = xresv;
137 for (n = 0; n < XNRES; n++) { 66 for (n = 0; n < XNRES; n++) {
138 if (xrp->xflag == 0) { 67 if (xrp->xflag == 0) {
139 xrp->xflag = 1; 68 xrp->xflag = 1;
140 return xrp; 69 return xrp;
141 } 70 }
142 xrp++; 71 xrp++;
143 } 72 }
144 return NULL; 73 return NULL;
145} 74}
146 75
147static void xres_free(struct xresource *xrp) 76static void xres_free(struct xresource *xrp)
@@ -161,76 +90,71 @@ static struct resource *shmedia_find_resource(struct resource *root,
161 return NULL; 90 return NULL;
162} 91}
163 92
164static unsigned long shmedia_alloc_io(unsigned long phys, unsigned long size, 93static void __iomem *shmedia_alloc_io(unsigned long phys, unsigned long size,
165 const char *name) 94 const char *name, unsigned long flags)
166{ 95{
167 static int printed_full = 0; 96 static int printed_full;
168 struct xresource *xres; 97 struct xresource *xres;
169 struct resource *res; 98 struct resource *res;
170 char *tack; 99 char *tack;
171 int tlen; 100 int tlen;
172 101
173 if (name == NULL) name = "???"; 102 if (name == NULL)
174 103 name = "???";
175 if ((xres = xres_alloc()) != 0) { 104
176 tack = xres->xname; 105 xres = xres_alloc();
177 res = &xres->xres; 106 if (xres != 0) {
178 } else { 107 tack = xres->xname;
179 if (!printed_full) { 108 res = &xres->xres;
180 printk("%s: done with statics, switching to kmalloc\n", 109 } else {
181 __func__); 110 if (!printed_full) {
182 printed_full = 1; 111 printk(KERN_NOTICE "%s: done with statics, "
183 } 112 "switching to kmalloc\n", __func__);
184 tlen = strlen(name); 113 printed_full = 1;
185 tack = kmalloc(sizeof (struct resource) + tlen + 1, GFP_KERNEL); 114 }
186 if (!tack) 115 tlen = strlen(name);
187 return -ENOMEM; 116 tack = kmalloc(sizeof(struct resource) + tlen + 1, GFP_KERNEL);
188 memset(tack, 0, sizeof(struct resource)); 117 if (!tack)
189 res = (struct resource *) tack; 118 return NULL;
190 tack += sizeof (struct resource); 119 memset(tack, 0, sizeof(struct resource));
191 } 120 res = (struct resource *) tack;
192 121 tack += sizeof(struct resource);
193 strncpy(tack, name, XNMLN); 122 }
194 tack[XNMLN] = 0; 123
195 res->name = tack; 124 strncpy(tack, name, XNMLN);
196 125 tack[XNMLN] = 0;
197 return shmedia_ioremap(res, phys, size); 126 res->name = tack;
127
128 return shmedia_ioremap(res, phys, size, flags);
198} 129}
199 130
200static unsigned long shmedia_ioremap(struct resource *res, u32 pa, int sz) 131static void __iomem *shmedia_ioremap(struct resource *res, u32 pa, int sz,
132 unsigned long flags)
201{ 133{
202 unsigned long offset = ((unsigned long) pa) & (~PAGE_MASK); 134 unsigned long offset = ((unsigned long) pa) & (~PAGE_MASK);
203 unsigned long round_sz = (offset + sz + PAGE_SIZE-1) & PAGE_MASK; 135 unsigned long round_sz = (offset + sz + PAGE_SIZE-1) & PAGE_MASK;
204 unsigned long va; 136 unsigned long va;
205 unsigned int psz; 137 unsigned int psz;
206 138
207 if (allocate_resource(&shmedia_iomap, res, round_sz, 139 if (allocate_resource(&shmedia_iomap, res, round_sz,
208 shmedia_iomap.start, shmedia_iomap.end, 140 shmedia_iomap.start, shmedia_iomap.end,
209 PAGE_SIZE, NULL, NULL) != 0) { 141 PAGE_SIZE, NULL, NULL) != 0) {
210 panic("alloc_io_res(%s): cannot occupy\n", 142 panic("alloc_io_res(%s): cannot occupy\n",
211 (res->name != NULL)? res->name: "???"); 143 (res->name != NULL) ? res->name : "???");
212 } 144 }
213 145
214 va = res->start; 146 va = res->start;
215 pa &= PAGE_MASK; 147 pa &= PAGE_MASK;
216 148
217 psz = (res->end - res->start + (PAGE_SIZE - 1)) / PAGE_SIZE; 149 psz = (res->end - res->start + (PAGE_SIZE - 1)) / PAGE_SIZE;
218 150
219 /* log at boot time ... */ 151 for (psz = res->end - res->start + 1; psz != 0; psz -= PAGE_SIZE) {
220 printk("mapioaddr: %6s [%2d page%s] va 0x%08lx pa 0x%08x\n", 152 shmedia_mapioaddr(pa, va, flags);
221 ((res->name != NULL) ? res->name : "???"), 153 va += PAGE_SIZE;
222 psz, psz == 1 ? " " : "s", va, pa); 154 pa += PAGE_SIZE;
223 155 }
224 for (psz = res->end - res->start + 1; psz != 0; psz -= PAGE_SIZE) {
225 shmedia_mapioaddr(pa, va);
226 va += PAGE_SIZE;
227 pa += PAGE_SIZE;
228 }
229
230 res->start += offset;
231 res->end = res->start + sz - 1; /* not strictly necessary.. */
232 156
233 return res->start; 157 return (void __iomem *)(unsigned long)(res->start + offset);
234} 158}
235 159
236static void shmedia_free_io(struct resource *res) 160static void shmedia_free_io(struct resource *res)
@@ -249,14 +173,12 @@ static void shmedia_free_io(struct resource *res)
249 173
250static __init_refok void *sh64_get_page(void) 174static __init_refok void *sh64_get_page(void)
251{ 175{
252 extern int after_bootmem;
253 void *page; 176 void *page;
254 177
255 if (after_bootmem) { 178 if (after_bootmem)
256 page = (void *)get_zeroed_page(GFP_ATOMIC); 179 page = (void *)get_zeroed_page(GFP_KERNEL);
257 } else { 180 else
258 page = alloc_bootmem_pages(PAGE_SIZE); 181 page = alloc_bootmem_pages(PAGE_SIZE);
259 }
260 182
261 if (!page || ((unsigned long)page & ~PAGE_MASK)) 183 if (!page || ((unsigned long)page & ~PAGE_MASK))
262 panic("sh64_get_page: Out of memory already?\n"); 184 panic("sh64_get_page: Out of memory already?\n");
@@ -264,17 +186,20 @@ static __init_refok void *sh64_get_page(void)
264 return page; 186 return page;
265} 187}
266 188
267static void shmedia_mapioaddr(unsigned long pa, unsigned long va) 189static void shmedia_mapioaddr(unsigned long pa, unsigned long va,
190 unsigned long flags)
268{ 191{
269 pgd_t *pgdp; 192 pgd_t *pgdp;
270 pud_t *pudp; 193 pud_t *pudp;
271 pmd_t *pmdp; 194 pmd_t *pmdp;
272 pte_t *ptep, pte; 195 pte_t *ptep, pte;
273 pgprot_t prot; 196 pgprot_t prot;
274 unsigned long flags = 1; /* 1 = CB0-1 device */
275 197
276 pr_debug("shmedia_mapiopage pa %08lx va %08lx\n", pa, va); 198 pr_debug("shmedia_mapiopage pa %08lx va %08lx\n", pa, va);
277 199
200 if (!flags)
201 flags = 1; /* 1 = CB0-1 device */
202
278 pgdp = pgd_offset_k(va); 203 pgdp = pgd_offset_k(va);
279 if (pgd_none(*pgdp) || !pgd_present(*pgdp)) { 204 if (pgd_none(*pgdp) || !pgd_present(*pgdp)) {
280 pudp = (pud_t *)sh64_get_page(); 205 pudp = (pud_t *)sh64_get_page();
@@ -288,7 +213,7 @@ static void shmedia_mapioaddr(unsigned long pa, unsigned long va)
288 } 213 }
289 214
290 pmdp = pmd_offset(pudp, va); 215 pmdp = pmd_offset(pudp, va);
291 if (pmd_none(*pmdp) || !pmd_present(*pmdp) ) { 216 if (pmd_none(*pmdp) || !pmd_present(*pmdp)) {
292 ptep = (pte_t *)sh64_get_page(); 217 ptep = (pte_t *)sh64_get_page();
293 set_pmd(pmdp, __pmd((unsigned long)ptep + _PAGE_TABLE)); 218 set_pmd(pmdp, __pmd((unsigned long)ptep + _PAGE_TABLE));
294 } 219 }
@@ -336,17 +261,19 @@ static void shmedia_unmapioaddr(unsigned long vaddr)
336 pte_clear(&init_mm, vaddr, ptep); 261 pte_clear(&init_mm, vaddr, ptep);
337} 262}
338 263
339unsigned long onchip_remap(unsigned long phys, unsigned long size, const char *name) 264void __iomem *__ioremap(unsigned long offset, unsigned long size,
265 unsigned long flags)
340{ 266{
341 if (size < PAGE_SIZE) 267 char name[14];
342 size = PAGE_SIZE;
343 268
344 return shmedia_alloc_io(phys, size, name); 269 sprintf(name, "phys_%08x", (u32)offset);
270 return shmedia_alloc_io(offset, size, name, flags);
345} 271}
346EXPORT_SYMBOL(onchip_remap); 272EXPORT_SYMBOL(__ioremap);
347 273
348void onchip_unmap(unsigned long vaddr) 274void __iounmap(void __iomem *virtual)
349{ 275{
276 unsigned long vaddr = (unsigned long)virtual & PAGE_MASK;
350 struct resource *res; 277 struct resource *res;
351 unsigned int psz; 278 unsigned int psz;
352 279
@@ -357,10 +284,7 @@ void onchip_unmap(unsigned long vaddr)
357 return; 284 return;
358 } 285 }
359 286
360 psz = (res->end - res->start + (PAGE_SIZE - 1)) / PAGE_SIZE; 287 psz = (res->end - res->start + (PAGE_SIZE - 1)) / PAGE_SIZE;
361
362 printk(KERN_DEBUG "unmapioaddr: %6s [%2d page%s] freed\n",
363 res->name, psz, psz == 1 ? " " : "s");
364 288
365 shmedia_free_io(res); 289 shmedia_free_io(res);
366 290
@@ -371,9 +295,8 @@ void onchip_unmap(unsigned long vaddr)
371 kfree(res); 295 kfree(res);
372 } 296 }
373} 297}
374EXPORT_SYMBOL(onchip_unmap); 298EXPORT_SYMBOL(__iounmap);
375 299
376#ifdef CONFIG_PROC_FS
377static int 300static int
378ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof, 301ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof,
379 void *data) 302 void *data)
@@ -385,7 +308,10 @@ ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof,
385 for (r = ((struct resource *)data)->child; r != NULL; r = r->sibling) { 308 for (r = ((struct resource *)data)->child; r != NULL; r = r->sibling) {
386 if (p + 32 >= e) /* Better than nothing */ 309 if (p + 32 >= e) /* Better than nothing */
387 break; 310 break;
388 if ((nm = r->name) == 0) nm = "???"; 311 nm = r->name;
312 if (nm == NULL)
313 nm = "???";
314
389 p += sprintf(p, "%08lx-%08lx: %s\n", 315 p += sprintf(p, "%08lx-%08lx: %s\n",
390 (unsigned long)r->start, 316 (unsigned long)r->start,
391 (unsigned long)r->end, nm); 317 (unsigned long)r->end, nm);
@@ -393,14 +319,11 @@ ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof,
393 319
394 return p-buf; 320 return p-buf;
395} 321}
396#endif /* CONFIG_PROC_FS */
397 322
398static int __init register_proc_onchip(void) 323static int __init register_proc_onchip(void)
399{ 324{
400#ifdef CONFIG_PROC_FS 325 create_proc_read_entry("io_map", 0, 0, ioremap_proc_info,
401 create_proc_read_entry("io_map",0,0, ioremap_proc_info, &shmedia_iomap); 326 &shmedia_iomap);
402#endif
403 return 0; 327 return 0;
404} 328}
405 329late_initcall(register_proc_onchip);
406__initcall(register_proc_onchip);