Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sh: ioremap() overhaul.

ioremap() overhaul. Add support for transparent PMB mapping, get rid of
p3_ioremap(), etc. Also drop ioremap() and iounmap() routines from the
machvec, as everyone can use the generic ioremap() API instead. For PCI
memory apertures and other special cases, use the pci_iomap() API, as
boards are already required to get the mapping right there.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>

+376 -325
+99 -137
arch/sh/boards/landisk/io.c
··· 17 17 18 18 #include <linux/kernel.h> 19 19 #include <linux/types.h> 20 - #include <asm/io.h> 21 20 #include <asm/landisk/iodata_landisk.h> 22 21 #include <asm/addrspace.h> 22 + #include <asm/io.h> 23 23 24 24 #include <linux/module.h> 25 25 #include <linux/pci.h> ··· 42 42 43 43 #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) 44 44 45 - #define maybebadio(name,port) \ 46 - printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ 47 - #name, (port), (__u32) __builtin_return_address(0)) 48 - 49 45 static inline void delay(void) 50 46 { 51 47 ctrl_inw(0xa0000000); ··· 62 66 return ((unsigned long)area6_io_base + PA_SIDE_OFFSET + 63 67 ((port - 0x170) << 1)); 64 68 else 65 - maybebadio(port2adr, (unsigned long)port); 69 + maybebadio((unsigned long)port); 66 70 67 71 return port; 68 72 } ··· 85 89 * should be way beyond the window, and is used w/o translation for 86 90 * compatibility. 87 91 */ 88 - unsigned char landisk_inb(unsigned long port) 92 + u8 landisk_inb(unsigned long port) 89 93 { 90 94 if (PXSEG(port)) 91 - return *(volatile unsigned char *)port; 95 + return ctrl_inb(port); 92 96 else if (CHECK_SH7751_PCIIO(port)) 93 - return *(volatile unsigned char *)PCI_IOMAP(port); 94 - else 95 - return (*(volatile unsigned short *)port2adr(port) & 0xff); 97 + return ctrl_inb(PCI_IOMAP(port)); 98 + 99 + return ctrl_inw(port2adr(port)) & 0xff; 96 100 } 97 101 98 - unsigned char landisk_inb_p(unsigned long port) 102 + u8 landisk_inb_p(unsigned long port) 99 103 { 100 - unsigned char v; 104 + u8 v; 101 105 102 106 if (PXSEG(port)) 103 - v = *(volatile unsigned char *)port; 107 + v = ctrl_inb(port); 104 108 else if (CHECK_SH7751_PCIIO(port)) 105 - v = *(volatile unsigned char *)PCI_IOMAP(port); 109 + v = ctrl_inb(PCI_IOMAP(port)); 106 110 else 107 - v = (*(volatile unsigned short *)port2adr(port) & 0xff); 111 + v = ctrl_inw(port2adr(port)) & 0xff; 112 + 108 113 delay(); 109 114 110 115 return v; 111 116 } 112 117 113 - unsigned short landisk_inw(unsigned long port) 118 + u16 landisk_inw(unsigned long port) 114 119 { 115 120 if (PXSEG(port)) 116 - return *(volatile unsigned short *)port; 121 + return ctrl_inw(port); 117 122 else if (CHECK_SH7751_PCIIO(port)) 118 - return *(volatile unsigned short *)PCI_IOMAP(port); 123 + return ctrl_inw(PCI_IOMAP(port)); 119 124 else 120 - maybebadio(inw, port); 125 + maybebadio(port); 121 126 122 127 return 0; 123 128 } 124 129 125 - unsigned int landisk_inl(unsigned long port) 130 + u32 landisk_inl(unsigned long port) 126 131 { 127 132 if (PXSEG(port)) 128 - return *(volatile unsigned long *)port; 133 + return ctrl_inl(port); 129 134 else if (CHECK_SH7751_PCIIO(port)) 130 - return *(volatile unsigned long *)PCI_IOMAP(port); 135 + return ctrl_inl(PCI_IOMAP(port)); 131 136 else 132 - maybebadio(inl, port); 137 + maybebadio(port); 133 138 134 139 return 0; 135 140 } 136 141 137 - void landisk_outb(unsigned char value, unsigned long port) 142 + void landisk_outb(u8 value, unsigned long port) 138 143 { 139 - 140 144 if (PXSEG(port)) 141 - *(volatile unsigned char *)port = value; 145 + ctrl_outb(value, port); 142 146 else if (CHECK_SH7751_PCIIO(port)) 143 - *(volatile unsigned char *)PCI_IOMAP(port) = value; 147 + ctrl_outb(value, PCI_IOMAP(port)); 144 148 else 145 - *(volatile unsigned short *)port2adr(port) = value; 149 + ctrl_outw(value, port2adr(port)); 146 150 } 147 151 148 - void landisk_outb_p(unsigned char value, unsigned long port) 152 + void landisk_outb_p(u8 value, unsigned long port) 149 153 { 150 154 if (PXSEG(port)) 151 - *(volatile unsigned char *)port = value; 155 + ctrl_outb(value, port); 152 156 else if (CHECK_SH7751_PCIIO(port)) 153 - *(volatile unsigned char *)PCI_IOMAP(port) = value; 157 + ctrl_outb(value, PCI_IOMAP(port)); 154 158 else 155 - *(volatile unsigned short *)port2adr(port) = value; 159 + ctrl_outw(value, port2adr(port)); 156 160 delay(); 157 161 } 158 162 159 - void landisk_outw(unsigned short value, unsigned long port) 163 + void landisk_outw(u16 value, unsigned long port) 160 164 { 161 165 if (PXSEG(port)) 162 - *(volatile unsigned short *)port = value; 166 + ctrl_outw(value, port); 163 167 else if (CHECK_SH7751_PCIIO(port)) 164 - *(volatile unsigned short *)PCI_IOMAP(port) = value; 168 + ctrl_outw(value, PCI_IOMAP(port)); 165 169 else 166 - maybebadio(outw, port); 170 + maybebadio(port); 167 171 } 168 172 169 - void landisk_outl(unsigned int value, unsigned long port) 173 + void landisk_outl(u32 value, unsigned long port) 170 174 { 171 175 if (PXSEG(port)) 172 - *(volatile unsigned long *)port = value; 176 + ctrl_outl(value, port); 173 177 else if (CHECK_SH7751_PCIIO(port)) 174 - *(volatile unsigned long *)PCI_IOMAP(port) = value; 178 + ctrl_outl(value, PCI_IOMAP(port)); 175 179 else 176 - maybebadio(outl, port); 180 + maybebadio(port); 177 181 } 178 182 179 - void landisk_insb(unsigned long port, void *addr, unsigned long count) 183 + void landisk_insb(unsigned long port, void *dst, unsigned long count) 180 184 { 181 - if (PXSEG(port)) 182 - while (count--) 183 - *((unsigned char *)addr)++ = 184 - *(volatile unsigned char *)port; 185 - else if (CHECK_SH7751_PCIIO(port)) { 186 - volatile __u8 *bp = (__u8 *) PCI_IOMAP(port); 185 + volatile u16 *p; 186 + u8 *buf = dst; 187 187 188 - while (count--) 189 - *((volatile unsigned char *)addr)++ = *bp; 188 + if (PXSEG(port)) { 189 + while (count--) 190 + *buf++ = *(volatile u8 *)port; 191 + } else if (CHECK_SH7751_PCIIO(port)) { 192 + volatile u8 *bp = (volatile u8 *)PCI_IOMAP(port); 193 + 194 + while (count--) 195 + *buf++ = *bp; 190 196 } else { 191 - volatile __u16 *p = (volatile unsigned short *)port2adr(port); 192 - 193 - while (count--) 194 - *((unsigned char *)addr)++ = *p; 197 + p = (volatile u16 *)port2adr(port); 198 + while (count--) 199 + *buf++ = *p & 0xff; 195 200 } 196 201 } 197 202 198 - void landisk_insw(unsigned long port, void *addr, unsigned long count) 203 + void landisk_insw(unsigned long port, void *dst, unsigned long count) 199 204 { 200 - volatile __u16 *p; 205 + volatile u16 *p; 206 + u16 *buf = dst; 201 207 202 208 if (PXSEG(port)) 203 - p = (volatile unsigned short *)port; 209 + p = (volatile u16 *)port; 204 210 else if (CHECK_SH7751_PCIIO(port)) 205 - p = (volatile unsigned short *)PCI_IOMAP(port); 211 + p = (volatile u16 *)PCI_IOMAP(port); 206 212 else 207 - p = (volatile unsigned short *)port2adr(port); 213 + p = (volatile u16 *)port2adr(port); 208 214 while (count--) 209 - *((__u16 *) addr)++ = *p; 215 + *buf++ = *p; 210 216 } 211 217 212 - void landisk_insl(unsigned long port, void *addr, unsigned long count) 218 + void landisk_insl(unsigned long port, void *dst, unsigned long count) 213 219 { 220 + u32 *buf = dst; 221 + 214 222 if (CHECK_SH7751_PCIIO(port)) { 215 - volatile __u32 *p = (__u32 *) PCI_IOMAP(port); 223 + volatile u32 *p = (volatile u32 *)PCI_IOMAP(port); 216 224 217 - while (count--) 218 - *((__u32 *) addr)++ = *p; 225 + while (count--) 226 + *buf++ = *p; 219 227 } else 220 - maybebadio(insl, port); 228 + maybebadio(port); 221 229 } 222 230 223 - void landisk_outsb(unsigned long port, const void *addr, unsigned long count) 231 + void landisk_outsb(unsigned long port, const void *src, unsigned long count) 224 232 { 233 + volatile u16 *p; 234 + const u8 *buf = src; 235 + 225 236 if (PXSEG(port)) 226 - while (count--) 227 - *(volatile unsigned char *)port = 228 - *((unsigned char *)addr)++; 237 + while (count--) 238 + ctrl_outb(*buf++, port); 229 239 else if (CHECK_SH7751_PCIIO(port)) { 230 - volatile __u8 *bp = (__u8 *) PCI_IOMAP(port); 240 + volatile u8 *bp = (volatile u8 *)PCI_IOMAP(port); 231 241 232 - while (count--) 233 - *bp = *((volatile unsigned char *)addr)++; 242 + while (count--) 243 + *bp = *buf++; 234 244 } else { 235 - volatile __u16 *p = (volatile unsigned short *)port2adr(port); 236 - 237 - while (count--) 238 - *p = *((unsigned char *)addr)++; 245 + p = (volatile u16 *)port2adr(port); 246 + while (count--) 247 + *p = *buf++; 239 248 } 240 249 } 241 250 242 - void landisk_outsw(unsigned long port, const void *addr, unsigned long count) 251 + void landisk_outsw(unsigned long port, const void *src, unsigned long count) 243 252 { 244 - volatile __u16 *p; 253 + volatile u16 *p; 254 + const u16 *buf = src; 245 255 246 256 if (PXSEG(port)) 247 - p = (volatile unsigned short *)port; 257 + p = (volatile u16 *)port; 248 258 else if (CHECK_SH7751_PCIIO(port)) 249 - p = (volatile unsigned short *)PCI_IOMAP(port); 259 + p = (volatile u16 *)PCI_IOMAP(port); 250 260 else 251 - p = (volatile unsigned short *)port2adr(port); 252 - while (count--) 253 - *p = *((__u16 *) addr)++; 261 + p = (volatile u16 *)port2adr(port); 262 + 263 + while (count--) 264 + *p = *buf++; 254 265 } 255 266 256 - void landisk_outsl(unsigned long port, const void *addr, unsigned long count) 267 + void landisk_outsl(unsigned long port, const void *src, unsigned long count) 257 268 { 269 + const u32 *buf = src; 270 + 258 271 if (CHECK_SH7751_PCIIO(port)) { 259 - volatile __u32 *p = (__u32 *) PCI_IOMAP(port); 272 + volatile u32 *p = (volatile u32 *)PCI_IOMAP(port); 260 273 261 - while (count--) 262 - *p = *((__u32 *) addr)++; 274 + while (count--) 275 + *p = *buf++; 263 276 } else 264 - maybebadio(outsl, port); 277 + maybebadio(port); 265 278 } 266 279 267 - /* For read/write calls, just copy generic (pass-thru); PCIMBR is */ 268 - /* already set up. For a larger memory space, these would need to */ 269 - /* reset PCIMBR as needed on a per-call basis... */ 270 - 271 - unsigned char landisk_readb(unsigned long addr) 280 + void __iomem *landisk_ioport_map(unsigned long port, unsigned int size) 272 281 { 273 - return *(volatile unsigned char *)addr; 274 - } 282 + if (PXSEG(port)) 283 + return (void __iomem *)port; 284 + else if (CHECK_SH7751_PCIIO(port)) 285 + return (void __iomem *)PCI_IOMAP(port); 275 286 276 - unsigned short landisk_readw(unsigned long addr) 277 - { 278 - return *(volatile unsigned short *)addr; 279 - } 280 - 281 - unsigned int landisk_readl(unsigned long addr) 282 - { 283 - return *(volatile unsigned long *)addr; 284 - } 285 - 286 - void landisk_writeb(unsigned char b, unsigned long addr) 287 - { 288 - *(volatile unsigned char *)addr = b; 289 - } 290 - 291 - void landisk_writew(unsigned short b, unsigned long addr) 292 - { 293 - *(volatile unsigned short *)addr = b; 294 - } 295 - 296 - void landisk_writel(unsigned int b, unsigned long addr) 297 - { 298 - *(volatile unsigned long *)addr = b; 299 - } 300 - 301 - void *landisk_ioremap(unsigned long offset, unsigned long size) 302 - { 303 - if (offset >= 0xfd000000) 304 - return (void *)offset; 305 - else 306 - return (void *)P2SEGADDR(offset); 307 - } 308 - 309 - void landisk_iounmap(void *addr) 310 - { 311 - } 312 - 313 - /* Map ISA bus address to the real address. Only for PCMCIA. */ 314 - 315 - unsigned long landisk_isa_port2addr(unsigned long offset) 316 - { 317 - return port2adr(offset); 287 + return (void __iomem *)port2adr(port); 318 288 }
+101 -140
arch/sh/boards/landisk/setup.c
··· 1 1 /* 2 2 * arch/sh/boards/landisk/setup.c 3 3 * 4 + * Copyright (C) 2000 Kazumoto Kojima 4 5 * Copyright (C) 2002 Paul Mundt 5 - * 6 - * May be copied or modified under the terms of the GNU General Public 7 - * License. See linux/COPYING for more information. 8 - * 9 - * Setup code for an unknown machine (internal peripherials only) 10 - */ 11 - /* 12 - * linux/arch/sh/kernel/setup_landisk.c 13 - * 14 - * Copyright (C) 2000 Kazumoto Kojima 15 6 * 16 7 * I-O DATA Device, Inc. LANDISK Support. 17 8 * 18 9 * Modified for LANDISK by 19 10 * Atom Create Engineering Co., Ltd. 2002. 20 - */ 21 - /* 11 + * 22 12 * modifed by kogiidena 23 13 * 2005.09.16 14 + * 15 + * This file is subject to the terms and conditions of the GNU General Public 16 + * License. See the file "COPYING" in the main directory of this archive 17 + * for more details. 24 18 */ 25 - 26 19 #include <linux/config.h> 27 20 #include <linux/init.h> 28 - #include <linux/irq.h> 29 21 #include <linux/pm.h> 30 - 31 - #include <linux/hdreg.h> 32 - #include <linux/ide.h> 33 - #include <linux/pci.h> 34 - 22 + #include <linux/mm.h> 35 23 #include <asm/machvec.h> 36 24 #include <asm/rtc.h> 37 - #include <asm/machvec_init.h> 38 - #include <asm/io.h> 39 25 #include <asm/landisk/iodata_landisk.h> 40 - #include <asm/landisk/io.h> 26 + #include <asm/io.h> 41 27 42 - #include <linux/mm.h> 43 - #include <linux/vmalloc.h> 44 - 45 - extern void (*board_time_init) (void); 46 28 void landisk_time_init(void); 47 - extern void init_landisk_IRQ(void); 29 + void init_landisk_IRQ(void); 48 30 49 31 int landisk_ledparam; 50 32 int landisk_buzzerparam; 51 33 int landisk_arch; 52 34 53 - /* defined in mm/ioremap.c */ 54 - extern void *p3_ioremap(unsigned long phys_addr, unsigned long size, 55 - unsigned long flags); 35 + /* cycle the led's in the clasic knightrider/sun pattern */ 36 + static void heartbeat_landisk(void) 37 + { 38 + static unsigned int cnt = 0, blink = 0x00, period = 25; 39 + volatile u8 *p = (volatile u8 *)PA_LED; 40 + char data; 41 + 42 + if ((landisk_ledparam & 0x080) == 0) 43 + return; 44 + 45 + cnt += 1; 46 + 47 + if (cnt < period) 48 + return; 49 + 50 + cnt = 0; 51 + blink++; 52 + 53 + data = (blink & 0x01) ? (landisk_ledparam >> 16) : 0; 54 + data |= (blink & 0x02) ? (landisk_ledparam >> 8) : 0; 55 + data |= landisk_ledparam; 56 + 57 + /* buzzer */ 58 + if (landisk_buzzerparam & 0x1) { 59 + data |= 0x80; 60 + } else { 61 + data &= 0x7f; 62 + } 63 + *p = data; 64 + 65 + if (((landisk_ledparam & 0x007f7f00) == 0) && 66 + (landisk_buzzerparam == 0)) 67 + landisk_ledparam &= (~0x0080); 68 + 69 + landisk_buzzerparam >>= 1; 70 + } 56 71 57 72 /* 58 - * Initialize the board 73 + * The Machine Vector 59 74 */ 75 + struct sh_machine_vector mv_landisk __initmv = { 76 + .mv_nr_irqs = 72, 77 + .mv_inb = landisk_inb, 78 + .mv_inw = landisk_inw, 79 + .mv_inl = landisk_inl, 80 + .mv_outb = landisk_outb, 81 + .mv_outw = landisk_outw, 82 + .mv_outl = landisk_outl, 83 + .mv_inb_p = landisk_inb_p, 84 + .mv_inw_p = landisk_inw, 85 + .mv_inl_p = landisk_inl, 86 + .mv_outb_p = landisk_outb_p, 87 + .mv_outw_p = landisk_outw, 88 + .mv_outl_p = landisk_outl, 89 + .mv_insb = landisk_insb, 90 + .mv_insw = landisk_insw, 91 + .mv_insl = landisk_insl, 92 + .mv_outsb = landisk_outsb, 93 + .mv_outsw = landisk_outsw, 94 + .mv_outsl = landisk_outsl, 95 + .mv_ioport_map = landisk_ioport_map, 96 + .mv_init_irq = init_landisk_IRQ, 97 + #ifdef CONFIG_HEARTBEAT 98 + .mv_heartbeat = heartbeat_landisk, 99 + #endif 100 + }; 101 + ALIAS_MV(landisk) 60 102 61 103 const char *get_system_type(void) 62 104 { 63 - return "LANDISK"; 105 + return "LANDISK"; 64 106 } 65 107 66 108 static void landisk_power_off(void) 67 109 { 68 - ctrl_outb(0x01, PA_SHUTDOWN); 110 + ctrl_outb(0x01, PA_SHUTDOWN); 69 111 } 70 112 71 - void check_usl5p(void) 113 + static void check_usl5p(void) 72 114 { 73 - volatile unsigned char *p = (volatile unsigned char *)PA_LED; 74 - unsigned char tmp1, tmp2; 75 - tmp1 = *p; 76 - *p = 0x40; 77 - tmp2 = *p; 78 - *p = tmp1; 79 - landisk_arch = (tmp2 == 0x40) ? 1 : 0; 80 - if (landisk_arch == 1) { /* arch == usl-5p */ 81 - landisk_ledparam = 0x00000380; 82 - landisk_ledparam |= (tmp1 & 0x07c); 83 - } else { /* arch == landisk */ 84 - landisk_ledparam = 0x02000180; 85 - landisk_ledparam |= 0x04; 86 - } 87 - return; 115 + volatile u8 *p = (volatile u8 *)PA_LED; 116 + u8 tmp1, tmp2; 117 + 118 + tmp1 = *p; 119 + *p = 0x40; 120 + tmp2 = *p; 121 + *p = tmp1; 122 + 123 + landisk_arch = (tmp2 == 0x40); 124 + if (landisk_arch == 1) { 125 + /* arch == usl-5p */ 126 + landisk_ledparam = 0x00000380; 127 + landisk_ledparam |= (tmp1 & 0x07c); 128 + } else { 129 + /* arch == landisk */ 130 + landisk_ledparam = 0x02000180; 131 + landisk_ledparam |= 0x04; 132 + } 88 133 } 89 134 90 135 void __init platform_setup(void) 91 136 { 137 + landisk_buzzerparam = 0; 138 + check_usl5p(); 92 139 93 - landisk_buzzerparam = 0; 94 - check_usl5p(); 95 - 96 - printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); 97 - board_time_init = landisk_time_init; 98 - pm_power_off = landisk_power_off; 99 - 140 + printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); 141 + board_time_init = landisk_time_init; 142 + pm_power_off = landisk_power_off; 100 143 } 101 144 102 145 void *area5_io_base; 103 146 void *area6_io_base; 104 147 105 - int __init cf_init(void) 148 + static int __init landisk_cf_init(void) 106 149 { 107 150 pgprot_t prot; 108 151 unsigned long paddrbase, psize; ··· 176 133 return 0; 177 134 } 178 135 179 - __initcall(cf_init); 180 - 181 - #include <linux/sched.h> 182 - 183 - /* Cycle the LED's in the clasic knightrider/Sun pattern */ 184 - 185 - void heartbeat_landisk(void) 186 - { 187 - static unsigned int cnt = 0, blink = 0x00, period = 25; 188 - volatile unsigned char *p = (volatile unsigned char *)PA_LED; 189 - char data; 190 - 191 - if ((landisk_ledparam & 0x080) == 0) { 192 - return; 193 - } 194 - cnt += 1; 195 - if (cnt < period) { 196 - return; 197 - } 198 - cnt = 0; 199 - blink++; 200 - 201 - data = (blink & 0x01) ? (landisk_ledparam >> 16) : 0; 202 - data |= (blink & 0x02) ? (landisk_ledparam >> 8) : 0; 203 - data |= landisk_ledparam; 204 - 205 - /* buzzer */ 206 - if (landisk_buzzerparam & 0x1) { 207 - data |= 0x80; 208 - } else { 209 - data &= 0x7f; 210 - } 211 - *p = data; 212 - 213 - if (((landisk_ledparam & 0x007f7f00) == 0) 214 - && (landisk_buzzerparam == 0)) { 215 - landisk_ledparam &= (~0x0080); 216 - } 217 - landisk_buzzerparam >>= 1; 218 - } 219 - 220 - /* 221 - * The Machine Vector 222 - */ 223 - 224 - struct sh_machine_vector mv_landisk __initmv = { 225 - .mv_nr_irqs = 72, 226 - .mv_inb = landisk_inb, 227 - .mv_inw = landisk_inw, 228 - .mv_inl = landisk_inl, 229 - .mv_outb = landisk_outb, 230 - .mv_outw = landisk_outw, 231 - .mv_outl = landisk_outl, 232 - .mv_inb_p = landisk_inb_p, 233 - .mv_inw_p = landisk_inw, 234 - .mv_inl_p = landisk_inl, 235 - .mv_outb_p = landisk_outb_p, 236 - .mv_outw_p = landisk_outw, 237 - .mv_outl_p = landisk_outl, 238 - .mv_insb = landisk_insb, 239 - .mv_insw = landisk_insw, 240 - .mv_insl = landisk_insl, 241 - .mv_outsb = landisk_outsb, 242 - .mv_outsw = landisk_outsw, 243 - .mv_outsl = landisk_outsl, 244 - .mv_readb = landisk_readb, 245 - .mv_readw = landisk_readw, 246 - .mv_readl = landisk_readl, 247 - .mv_writeb = landisk_writeb, 248 - .mv_writew = landisk_writew, 249 - .mv_writel = landisk_writel, 250 - .mv_ioremap = landisk_ioremap, 251 - .mv_iounmap = landisk_iounmap, 252 - .mv_isa_port2addr = landisk_isa_port2addr, 253 - .mv_init_irq = init_landisk_IRQ, 254 - 255 - #ifdef CONFIG_HEARTBEAT 256 - .mv_heartbeat = heartbeat_landisk, 257 - #endif 258 - 259 - }; 260 - 261 - ALIAS_MV(landisk) 136 + __initcall(landisk_cf_init);
-9
arch/sh/boards/renesas/hs7751rvoip/io.c
··· 294 294 maybebadio(outsl, port); 295 295 } 296 296 297 - void *hs7751rvoip_ioremap(unsigned long offset, unsigned long size) 298 - { 299 - if (offset >= 0xfd000000) 300 - return (void *)offset; 301 - else 302 - return (void *)P2SEGADDR(offset); 303 - } 304 - EXPORT_SYMBOL(hs7751rvoip_ioremap); 305 - 306 297 unsigned long hs7751rvoip_isa_port2addr(unsigned long offset) 307 298 { 308 299 return port2adr(offset);
-1
arch/sh/boards/renesas/hs7751rvoip/setup.c
··· 60 60 .mv_outsw = hs7751rvoip_outsw, 61 61 .mv_outsl = hs7751rvoip_outsl, 62 62 63 - .mv_ioremap = hs7751rvoip_ioremap, 64 63 .mv_isa_port2addr = hs7751rvoip_isa_port2addr, 65 64 .mv_init_irq = hs7751rvoip_init_irq, 66 65 };
-9
arch/sh/boards/renesas/rts7751r2d/io.c
··· 321 321 maybebadio(port); 322 322 } 323 323 324 - void *rts7751r2d_ioremap(unsigned long offset, unsigned long size) 325 - { 326 - if (offset >= 0xfd000000) 327 - return (void *)offset; 328 - else 329 - return (void *)P2SEGADDR(offset); 330 - } 331 - EXPORT_SYMBOL(rts7751r2d_ioremap); 332 - 333 324 unsigned long rts7751r2d_isa_port2addr(unsigned long offset) 334 325 { 335 326 return port2adr(offset);
-2
arch/sh/boards/renesas/rts7751r2d/mach.c
··· 19 19 20 20 extern void heartbeat_rts7751r2d(void); 21 21 extern void init_rts7751r2d_IRQ(void); 22 - extern void *rts7751r2d_ioremap(unsigned long, unsigned long); 23 22 extern int rts7751r2d_irq_demux(int irq); 24 23 25 24 extern void *voyagergx_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t); ··· 52 53 .mv_outsw = rts7751r2d_outsw, 53 54 .mv_outsl = rts7751r2d_outsl, 54 55 55 - .mv_ioremap = rts7751r2d_ioremap, 56 56 .mv_init_irq = init_rts7751r2d_IRQ, 57 57 #ifdef CONFIG_HEARTBEAT 58 58 .mv_heartbeat = heartbeat_rts7751r2d,
+1 -8
arch/sh/boards/titan/io.c
··· 138 138 maybebadio(port); 139 139 } 140 140 141 - void *titan_ioremap(unsigned long offset, unsigned long size) { 142 - if (CHECK_SH7751_PCIIO(offset) || CHECK_SH7751_PCIMEMIO(offset)) 143 - return (void *)offset; 144 - } 145 - 146 141 void __iomem *titan_ioport_map(unsigned long port, unsigned int size) 147 142 { 148 - if (PXSEG(port)) 143 + if (PXSEG(port) || CHECK_SH7751_PCIMEMIO(port)) 149 144 return (void __iomem *)port; 150 145 else if (CHECK_SH7751_PCIIO(port)) 151 146 return (void __iomem *)PCI_IOMAP(port); 152 147 153 148 return (void __iomem *)port2adr(port); 154 149 } 155 - 156 - EXPORT_SYMBOL(titan_ioremap);
-1
arch/sh/boards/titan/setup.c
··· 51 51 .mv_insl = titan_insl, 52 52 .mv_outsl = titan_outsl, 53 53 54 - .mv_ioremap = titan_ioremap, 55 54 .mv_ioport_map = titan_ioport_map, 56 55 57 56 .mv_init_irq = init_titan_irq,
+17 -4
arch/sh/drivers/pci/pci.c
··· 2 2 * arch/sh/drivers/pci/pci.c 3 3 * 4 4 * Copyright (c) 2002 M. R. Brown <mrbrown@linux-sh.org> 5 - * Copyright (c) 2004, 2005 Paul Mundt <lethal@linux-sh.org> 5 + * Copyright (c) 2004 - 2006 Paul Mundt <lethal@linux-sh.org> 6 6 * 7 7 * These functions are collected here to reduce duplication of common 8 8 * code amongst the many platform-specific PCI support code files. ··· 172 172 return NULL; 173 173 if (maxlen && len > maxlen) 174 174 len = maxlen; 175 - if (flags & IORESOURCE_IO) 175 + 176 + /* 177 + * Presently the IORESOURCE_MEM case is a bit special, most 178 + * SH7751 style PCI controllers have PCI memory at a fixed 179 + * location in the address space where no remapping is desired 180 + * (traditionally at 0xfd000000). Once this changes, the 181 + * IORESOURCE_MEM case will have to switch to using ioremap() and 182 + * more care will have to be taken to inhibit page table mapping 183 + * for legacy cores. 184 + * 185 + * For now everything wraps to ioport_map(), since boards that 186 + * have PCI will be able to check the address range properly on 187 + * their own. 188 + * -- PFM. 189 + */ 190 + if (flags & (IORESOURCE_IO | IORESOURCE_MEM)) 176 191 return ioport_map(start, len); 177 - if (flags & IORESOURCE_MEM) 178 - return ioremap(start, len); 179 192 180 193 return NULL; 181 194 }
+1 -4
arch/sh/kernel/cf-enabler.c
··· 41 41 #define slot_no 1 42 42 #endif 43 43 44 - /* defined in mm/ioremap.c */ 45 - extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags); 46 - 47 44 /* use this pointer to access to directly connected compact flash io area*/ 48 45 void *cf_io_base; 49 46 ··· 59 62 return -ENOMEM; 60 63 } 61 64 /* printk("p3_ioremap(paddr=0x%08lx, psize=0x%08lx, prot=0x%08lx)=0x%08lx\n", 62 - paddrbase, psize, prot.pgprot, cf_io_base);*/ 65 + paddrbase, psize, prot.pgprot, cf_io_base);*/ 63 66 64 67 /* XXX : do we need attribute and common-memory area also? */ 65 68
-1
arch/sh/kernel/sh_ksyms.c
··· 27 27 28 28 /* platform dependent support */ 29 29 EXPORT_SYMBOL(dump_fpu); 30 - EXPORT_SYMBOL(iounmap); 31 30 EXPORT_SYMBOL(enable_irq); 32 31 EXPORT_SYMBOL(disable_irq); 33 32 EXPORT_SYMBOL(probe_irq_mask);
+4 -3
arch/sh/mm/Makefile
··· 12 12 obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o 13 13 14 14 mmu-y := fault-nommu.o tlb-nommu.o pg-nommu.o 15 - mmu-$(CONFIG_MMU) := fault.o clear_page.o copy_page.o tlb-flush.o 15 + mmu-$(CONFIG_MMU) := fault.o clear_page.o copy_page.o tlb-flush.o \ 16 + ioremap.o 16 17 17 18 obj-y += $(mmu-y) 18 19 19 20 ifdef CONFIG_MMU 20 - obj-$(CONFIG_CPU_SH3) += tlb-sh3.o 21 - obj-$(CONFIG_CPU_SH4) += tlb-sh4.o ioremap.o 21 + obj-$(CONFIG_CPU_SH3) += tlb-sh3.o 22 + obj-$(CONFIG_CPU_SH4) += tlb-sh4.o 22 23 obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o 23 24 endif 24 25
+140 -5
arch/sh/mm/pmb.c
··· 3 3 * 4 4 * Privileged Space Mapping Buffer (PMB) Support. 5 5 * 6 - * Copyright (C) 2005 Paul Mundt 6 + * Copyright (C) 2005, 2006 Paul Mundt 7 7 * 8 8 * P1/P2 Section mapping definitions from map32.h, which was: 9 9 * ··· 24 24 #include <linux/err.h> 25 25 #include <asm/system.h> 26 26 #include <asm/uaccess.h> 27 + #include <asm/pgtable.h> 27 28 #include <asm/mmu.h> 28 29 #include <asm/io.h> 29 30 ··· 128 127 return 0; 129 128 } 130 129 131 - void set_pmb_entry(struct pmb_entry *pmbe) 130 + int set_pmb_entry(struct pmb_entry *pmbe) 132 131 { 132 + int ret; 133 + 133 134 jump_to_P2(); 134 - __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &pmbe->entry); 135 + ret = __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &pmbe->entry); 135 136 back_to_P1(); 137 + 138 + return ret; 136 139 } 137 140 138 141 void clear_pmb_entry(struct pmb_entry *pmbe) ··· 167 162 clear_bit(entry, &pmb_map); 168 163 } 169 164 165 + static DEFINE_SPINLOCK(pmb_list_lock); 166 + static struct pmb_entry *pmb_list; 167 + 168 + static inline void pmb_list_add(struct pmb_entry *pmbe) 169 + { 170 + struct pmb_entry **p, *tmp; 171 + 172 + p = &pmb_list; 173 + while ((tmp = *p) != NULL) 174 + p = &tmp->next; 175 + 176 + pmbe->next = tmp; 177 + *p = pmbe; 178 + } 179 + 180 + static inline void pmb_list_del(struct pmb_entry *pmbe) 181 + { 182 + struct pmb_entry **p, *tmp; 183 + 184 + for (p = &pmb_list; (tmp = *p); p = &tmp->next) 185 + if (tmp == pmbe) { 186 + *p = tmp->next; 187 + return; 188 + } 189 + } 190 + 191 + static struct { 192 + unsigned long size; 193 + int flag; 194 + } pmb_sizes[] = { 195 + { .size = 0x20000000, .flag = PMB_SZ_512M, }, 196 + { .size = 0x08000000, .flag = PMB_SZ_128M, }, 197 + { .size = 0x04000000, .flag = PMB_SZ_64M, }, 198 + { .size = 0x01000000, .flag = PMB_SZ_16M, }, 199 + }; 200 + 201 + long pmb_remap(unsigned long vaddr, unsigned long phys, 202 + unsigned long size, unsigned long flags) 203 + { 204 + struct pmb_entry *pmbp; 205 + unsigned long wanted; 206 + int pmb_flags, i; 207 + 208 + /* Convert typical pgprot value to the PMB equivalent */ 209 + if (flags & _PAGE_CACHABLE) { 210 + if (flags & _PAGE_WT) 211 + pmb_flags = PMB_WT; 212 + else 213 + pmb_flags = PMB_C; 214 + } else 215 + pmb_flags = PMB_WT | PMB_UB; 216 + 217 + pmbp = NULL; 218 + wanted = size; 219 + 220 + again: 221 + for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { 222 + struct pmb_entry *pmbe; 223 + int ret; 224 + 225 + if (size < pmb_sizes[i].size) 226 + continue; 227 + 228 + pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag); 229 + if (IS_ERR(pmbe)) 230 + return PTR_ERR(pmbe); 231 + 232 + ret = set_pmb_entry(pmbe); 233 + if (ret != 0) { 234 + pmb_free(pmbe); 235 + return -EBUSY; 236 + } 237 + 238 + phys += pmb_sizes[i].size; 239 + vaddr += pmb_sizes[i].size; 240 + size -= pmb_sizes[i].size; 241 + 242 + /* 243 + * Link adjacent entries that span multiple PMB entries 244 + * for easier tear-down. 245 + */ 246 + if (likely(pmbp)) 247 + pmbp->link = pmbe; 248 + 249 + pmbp = pmbe; 250 + } 251 + 252 + if (size >= 0x1000000) 253 + goto again; 254 + 255 + return wanted - size; 256 + } 257 + 258 + void pmb_unmap(unsigned long addr) 259 + { 260 + struct pmb_entry **p, *pmbe; 261 + 262 + for (p = &pmb_list; (pmbe = *p); p = &pmbe->next) 263 + if (pmbe->vpn == addr) 264 + break; 265 + 266 + if (unlikely(!pmbe)) 267 + return; 268 + 269 + WARN_ON(!test_bit(pmbe->entry, &pmb_map)); 270 + 271 + do { 272 + struct pmb_entry *pmblink = pmbe; 273 + 274 + clear_pmb_entry(pmbe); 275 + pmbe = pmblink->link; 276 + 277 + pmb_free(pmblink); 278 + } while (pmbe); 279 + } 280 + 170 281 static void pmb_cache_ctor(void *pmb, kmem_cache_t *cachep, unsigned long flags) 171 282 { 283 + struct pmb_entry *pmbe = pmb; 284 + 172 285 memset(pmb, 0, sizeof(struct pmb_entry)); 173 286 174 - ((struct pmb_entry *)pmb)->entry = PMB_NO_ENTRY; 287 + spin_lock_irq(&pmb_list_lock); 288 + 289 + pmbe->entry = PMB_NO_ENTRY; 290 + pmb_list_add(pmbe); 291 + 292 + spin_unlock_irq(&pmb_list_lock); 293 + } 294 + 295 + static void pmb_cache_dtor(void *pmb, kmem_cache_t *cachep, unsigned long flags) 296 + { 297 + spin_lock_irq(&pmb_list_lock); 298 + pmb_list_del(pmb); 299 + spin_unlock_irq(&pmb_list_lock); 175 300 } 176 301 177 302 static int __init pmb_init(void) ··· 312 177 BUG_ON(unlikely(nr_entries >= NR_PMB_ENTRIES)); 313 178 314 179 pmb_cache = kmem_cache_create("pmb", sizeof(struct pmb_entry), 315 - 0, 0, pmb_cache_ctor, NULL); 180 + 0, 0, pmb_cache_ctor, pmb_cache_dtor); 316 181 BUG_ON(!pmb_cache); 317 182 318 183 jump_to_P2();
+3
include/asm-sh/landisk/iodata_landisk.h
··· 74 74 extern int landisk_buzzerparam; /* from setup.c */ 75 75 extern int landisk_arch; /* from setup.c */ 76 76 77 + #define __IO_PREFIX landisk 78 + #include <asm/io_generic.h> 79 + 77 80 #endif /* __ASM_SH_IODATA_LANDISK_H */ 78 81
+10 -1
include/asm-sh/mmu.h
··· 50 50 51 51 #define PMB_NO_ENTRY (-1) 52 52 53 + struct pmb_entry; 54 + 53 55 struct pmb_entry { 54 56 unsigned long vpn; 55 57 unsigned long ppn; ··· 62 60 * PMB_NO_ENTRY to search for a free one 63 61 */ 64 62 int entry; 63 + 64 + struct pmb_entry *next; 65 + /* Adjacent entry link for contiguous multi-entry mappings */ 66 + struct pmb_entry *link; 65 67 }; 66 68 67 69 /* arch/sh/mm/pmb.c */ 68 70 int __set_pmb_entry(unsigned long vpn, unsigned long ppn, 69 71 unsigned long flags, int *entry); 70 - void set_pmb_entry(struct pmb_entry *pmbe); 72 + int set_pmb_entry(struct pmb_entry *pmbe); 71 73 void clear_pmb_entry(struct pmb_entry *pmbe); 72 74 struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn, 73 75 unsigned long flags); 74 76 void pmb_free(struct pmb_entry *pmbe); 77 + long pmb_remap(unsigned long virt, unsigned long phys, 78 + unsigned long size, unsigned long flags); 79 + void pmb_unmap(unsigned long addr); 75 80 76 81 #endif /* __MMU_H */ 77 82