diff options
author | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 15:16:42 +0900 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 15:16:42 +0900 |
commit | d7cdc9e8ac82c43fdcd4fde6b5b53d2dcba7f707 (patch) | |
tree | 2489b1831a1b5818af0927e4d3c8933bf7d05f31 /arch/sh/boards/landisk | |
parent | 26ff6c11ef38e08990c1e417c299246e6ab18ff7 (diff) |
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>
Diffstat (limited to 'arch/sh/boards/landisk')
-rw-r--r-- | arch/sh/boards/landisk/io.c | 236 | ||||
-rw-r--r-- | arch/sh/boards/landisk/setup.c | 237 |
2 files changed, 198 insertions, 275 deletions
diff --git a/arch/sh/boards/landisk/io.c b/arch/sh/boards/landisk/io.c index 1f1679af09d0..aa6b145c9e8f 100644 --- a/arch/sh/boards/landisk/io.c +++ b/arch/sh/boards/landisk/io.c @@ -17,9 +17,9 @@ #include <linux/kernel.h> #include <linux/types.h> -#include <asm/io.h> #include <asm/landisk/iodata_landisk.h> #include <asm/addrspace.h> +#include <asm/io.h> #include <linux/module.h> #include <linux/pci.h> @@ -42,10 +42,6 @@ extern void *area6_io_base; /* Area 6 I/O Base address */ #define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK)) -#define maybebadio(name,port) \ - printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ - #name, (port), (__u32) __builtin_return_address(0)) - static inline void delay(void) { ctrl_inw(0xa0000000); @@ -66,7 +62,7 @@ static inline unsigned long port2adr(unsigned int port) return ((unsigned long)area6_io_base + PA_SIDE_OFFSET + ((port - 0x170) << 1)); else - maybebadio(port2adr, (unsigned long)port); + maybebadio((unsigned long)port); return port; } @@ -89,234 +85,200 @@ static inline unsigned long port2adr(unsigned int port) * should be way beyond the window, and is used w/o translation for * compatibility. */ -unsigned char landisk_inb(unsigned long port) +u8 landisk_inb(unsigned long port) { if (PXSEG(port)) - return *(volatile unsigned char *)port; + return ctrl_inb(port); else if (CHECK_SH7751_PCIIO(port)) - return *(volatile unsigned char *)PCI_IOMAP(port); - else - return (*(volatile unsigned short *)port2adr(port) & 0xff); + return ctrl_inb(PCI_IOMAP(port)); + + return ctrl_inw(port2adr(port)) & 0xff; } -unsigned char landisk_inb_p(unsigned long port) +u8 landisk_inb_p(unsigned long port) { - unsigned char v; + u8 v; if (PXSEG(port)) - v = *(volatile unsigned char *)port; + v = ctrl_inb(port); else if (CHECK_SH7751_PCIIO(port)) - v = *(volatile unsigned char *)PCI_IOMAP(port); + v = ctrl_inb(PCI_IOMAP(port)); else - v = (*(volatile unsigned short *)port2adr(port) & 0xff); + v = ctrl_inw(port2adr(port)) & 0xff; + delay(); return v; } -unsigned short landisk_inw(unsigned long port) +u16 landisk_inw(unsigned long port) { if (PXSEG(port)) - return *(volatile unsigned short *)port; + return ctrl_inw(port); else if (CHECK_SH7751_PCIIO(port)) - return *(volatile unsigned short *)PCI_IOMAP(port); + return ctrl_inw(PCI_IOMAP(port)); else - maybebadio(inw, port); + maybebadio(port); return 0; } -unsigned int landisk_inl(unsigned long port) +u32 landisk_inl(unsigned long port) { if (PXSEG(port)) - return *(volatile unsigned long *)port; + return ctrl_inl(port); else if (CHECK_SH7751_PCIIO(port)) - return *(volatile unsigned long *)PCI_IOMAP(port); + return ctrl_inl(PCI_IOMAP(port)); else - maybebadio(inl, port); + maybebadio(port); return 0; } -void landisk_outb(unsigned char value, unsigned long port) +void landisk_outb(u8 value, unsigned long port) { - if (PXSEG(port)) - *(volatile unsigned char *)port = value; + ctrl_outb(value, port); else if (CHECK_SH7751_PCIIO(port)) - *(volatile unsigned char *)PCI_IOMAP(port) = value; + ctrl_outb(value, PCI_IOMAP(port)); else - *(volatile unsigned short *)port2adr(port) = value; + ctrl_outw(value, port2adr(port)); } -void landisk_outb_p(unsigned char value, unsigned long port) +void landisk_outb_p(u8 value, unsigned long port) { if (PXSEG(port)) - *(volatile unsigned char *)port = value; + ctrl_outb(value, port); else if (CHECK_SH7751_PCIIO(port)) - *(volatile unsigned char *)PCI_IOMAP(port) = value; + ctrl_outb(value, PCI_IOMAP(port)); else - *(volatile unsigned short *)port2adr(port) = value; + ctrl_outw(value, port2adr(port)); delay(); } -void landisk_outw(unsigned short value, unsigned long port) +void landisk_outw(u16 value, unsigned long port) { if (PXSEG(port)) - *(volatile unsigned short *)port = value; + ctrl_outw(value, port); else if (CHECK_SH7751_PCIIO(port)) - *(volatile unsigned short *)PCI_IOMAP(port) = value; + ctrl_outw(value, PCI_IOMAP(port)); else - maybebadio(outw, port); + maybebadio(port); } -void landisk_outl(unsigned int value, unsigned long port) +void landisk_outl(u32 value, unsigned long port) { if (PXSEG(port)) - *(volatile unsigned long *)port = value; + ctrl_outl(value, port); else if (CHECK_SH7751_PCIIO(port)) - *(volatile unsigned long *)PCI_IOMAP(port) = value; + ctrl_outl(value, PCI_IOMAP(port)); else - maybebadio(outl, port); + maybebadio(port); } -void landisk_insb(unsigned long port, void *addr, unsigned long count) +void landisk_insb(unsigned long port, void *dst, unsigned long count) { - if (PXSEG(port)) - while (count--) - *((unsigned char *)addr)++ = - *(volatile unsigned char *)port; - else if (CHECK_SH7751_PCIIO(port)) { - volatile __u8 *bp = (__u8 *) PCI_IOMAP(port); + volatile u16 *p; + u8 *buf = dst; - while (count--) - *((volatile unsigned char *)addr)++ = *bp; - } else { - volatile __u16 *p = (volatile unsigned short *)port2adr(port); + if (PXSEG(port)) { + while (count--) + *buf++ = *(volatile u8 *)port; + } else if (CHECK_SH7751_PCIIO(port)) { + volatile u8 *bp = (volatile u8 *)PCI_IOMAP(port); - while (count--) - *((unsigned char *)addr)++ = *p; + while (count--) + *buf++ = *bp; + } else { + p = (volatile u16 *)port2adr(port); + while (count--) + *buf++ = *p & 0xff; } } -void landisk_insw(unsigned long port, void *addr, unsigned long count) +void landisk_insw(unsigned long port, void *dst, unsigned long count) { - volatile __u16 *p; + volatile u16 *p; + u16 *buf = dst; if (PXSEG(port)) - p = (volatile unsigned short *)port; + p = (volatile u16 *)port; else if (CHECK_SH7751_PCIIO(port)) - p = (volatile unsigned short *)PCI_IOMAP(port); + p = (volatile u16 *)PCI_IOMAP(port); else - p = (volatile unsigned short *)port2adr(port); + p = (volatile u16 *)port2adr(port); while (count--) - *((__u16 *) addr)++ = *p; + *buf++ = *p; } -void landisk_insl(unsigned long port, void *addr, unsigned long count) +void landisk_insl(unsigned long port, void *dst, unsigned long count) { + u32 *buf = dst; + if (CHECK_SH7751_PCIIO(port)) { - volatile __u32 *p = (__u32 *) PCI_IOMAP(port); + volatile u32 *p = (volatile u32 *)PCI_IOMAP(port); - while (count--) - *((__u32 *) addr)++ = *p; + while (count--) + *buf++ = *p; } else - maybebadio(insl, port); + maybebadio(port); } -void landisk_outsb(unsigned long port, const void *addr, unsigned long count) +void landisk_outsb(unsigned long port, const void *src, unsigned long count) { + volatile u16 *p; + const u8 *buf = src; + if (PXSEG(port)) - while (count--) - *(volatile unsigned char *)port = - *((unsigned char *)addr)++; + while (count--) + ctrl_outb(*buf++, port); else if (CHECK_SH7751_PCIIO(port)) { - volatile __u8 *bp = (__u8 *) PCI_IOMAP(port); + volatile u8 *bp = (volatile u8 *)PCI_IOMAP(port); - while (count--) - *bp = *((volatile unsigned char *)addr)++; + while (count--) + *bp = *buf++; } else { - volatile __u16 *p = (volatile unsigned short *)port2adr(port); - - while (count--) - *p = *((unsigned char *)addr)++; + p = (volatile u16 *)port2adr(port); + while (count--) + *p = *buf++; } } -void landisk_outsw(unsigned long port, const void *addr, unsigned long count) +void landisk_outsw(unsigned long port, const void *src, unsigned long count) { - volatile __u16 *p; + volatile u16 *p; + const u16 *buf = src; if (PXSEG(port)) - p = (volatile unsigned short *)port; + p = (volatile u16 *)port; else if (CHECK_SH7751_PCIIO(port)) - p = (volatile unsigned short *)PCI_IOMAP(port); + p = (volatile u16 *)PCI_IOMAP(port); else - p = (volatile unsigned short *)port2adr(port); - while (count--) - *p = *((__u16 *) addr)++; -} + p = (volatile u16 *)port2adr(port); -void landisk_outsl(unsigned long port, const void *addr, unsigned long count) -{ - if (CHECK_SH7751_PCIIO(port)) { - volatile __u32 *p = (__u32 *) PCI_IOMAP(port); - - while (count--) - *p = *((__u32 *) addr)++; - } else - maybebadio(outsl, port); + while (count--) + *p = *buf++; } -/* For read/write calls, just copy generic (pass-thru); PCIMBR is */ -/* already set up. For a larger memory space, these would need to */ -/* reset PCIMBR as needed on a per-call basis... */ - -unsigned char landisk_readb(unsigned long addr) +void landisk_outsl(unsigned long port, const void *src, unsigned long count) { - return *(volatile unsigned char *)addr; -} + const u32 *buf = src; -unsigned short landisk_readw(unsigned long addr) -{ - return *(volatile unsigned short *)addr; -} - -unsigned int landisk_readl(unsigned long addr) -{ - return *(volatile unsigned long *)addr; -} - -void landisk_writeb(unsigned char b, unsigned long addr) -{ - *(volatile unsigned char *)addr = b; -} - -void landisk_writew(unsigned short b, unsigned long addr) -{ - *(volatile unsigned short *)addr = b; -} - -void landisk_writel(unsigned int b, unsigned long addr) -{ - *(volatile unsigned long *)addr = b; -} + if (CHECK_SH7751_PCIIO(port)) { + volatile u32 *p = (volatile u32 *)PCI_IOMAP(port); -void *landisk_ioremap(unsigned long offset, unsigned long size) -{ - if (offset >= 0xfd000000) - return (void *)offset; - else - return (void *)P2SEGADDR(offset); + while (count--) + *p = *buf++; + } else + maybebadio(port); } -void landisk_iounmap(void *addr) +void __iomem *landisk_ioport_map(unsigned long port, unsigned int size) { -} + if (PXSEG(port)) + return (void __iomem *)port; + else if (CHECK_SH7751_PCIIO(port)) + return (void __iomem *)PCI_IOMAP(port); -/* Map ISA bus address to the real address. Only for PCMCIA. */ - -unsigned long landisk_isa_port2addr(unsigned long offset) -{ - return port2adr(offset); + return (void __iomem *)port2adr(port); } diff --git a/arch/sh/boards/landisk/setup.c b/arch/sh/boards/landisk/setup.c index 0c60eaa10ba7..3a795cfb1eda 100644 --- a/arch/sh/boards/landisk/setup.c +++ b/arch/sh/boards/landisk/setup.c @@ -1,157 +1,52 @@ /* * arch/sh/boards/landisk/setup.c * + * Copyright (C) 2000 Kazumoto Kojima * Copyright (C) 2002 Paul Mundt * - * May be copied or modified under the terms of the GNU General Public - * License. See linux/COPYING for more information. - * - * Setup code for an unknown machine (internal peripherials only) - */ -/* - * linux/arch/sh/kernel/setup_landisk.c - * - * Copyright (C) 2000 Kazumoto Kojima - * * I-O DATA Device, Inc. LANDISK Support. * * Modified for LANDISK by * Atom Create Engineering Co., Ltd. 2002. - */ -/* + * * modifed by kogiidena * 2005.09.16 + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. */ - #include <linux/config.h> #include <linux/init.h> -#include <linux/irq.h> #include <linux/pm.h> - -#include <linux/hdreg.h> -#include <linux/ide.h> -#include <linux/pci.h> - +#include <linux/mm.h> #include <asm/machvec.h> #include <asm/rtc.h> -#include <asm/machvec_init.h> -#include <asm/io.h> #include <asm/landisk/iodata_landisk.h> -#include <asm/landisk/io.h> - -#include <linux/mm.h> -#include <linux/vmalloc.h> +#include <asm/io.h> -extern void (*board_time_init) (void); void landisk_time_init(void); -extern void init_landisk_IRQ(void); +void init_landisk_IRQ(void); int landisk_ledparam; int landisk_buzzerparam; int landisk_arch; -/* defined in mm/ioremap.c */ -extern void *p3_ioremap(unsigned long phys_addr, unsigned long size, - unsigned long flags); - -/* - * Initialize the board - */ - -const char *get_system_type(void) -{ - return "LANDISK"; -} - -static void landisk_power_off(void) -{ - ctrl_outb(0x01, PA_SHUTDOWN); -} - -void check_usl5p(void) -{ - volatile unsigned char *p = (volatile unsigned char *)PA_LED; - unsigned char tmp1, tmp2; - tmp1 = *p; - *p = 0x40; - tmp2 = *p; - *p = tmp1; - landisk_arch = (tmp2 == 0x40) ? 1 : 0; - if (landisk_arch == 1) { /* arch == usl-5p */ - landisk_ledparam = 0x00000380; - landisk_ledparam |= (tmp1 & 0x07c); - } else { /* arch == landisk */ - landisk_ledparam = 0x02000180; - landisk_ledparam |= 0x04; - } - return; -} - -void __init platform_setup(void) -{ - - landisk_buzzerparam = 0; - check_usl5p(); - - printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); - board_time_init = landisk_time_init; - pm_power_off = landisk_power_off; - -} - -void *area5_io_base; -void *area6_io_base; - -int __init cf_init(void) -{ - pgprot_t prot; - unsigned long paddrbase, psize; - - /* open I/O area window */ - paddrbase = virt_to_phys((void *)PA_AREA5_IO); - psize = PAGE_SIZE; - prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); - area5_io_base = p3_ioremap(paddrbase, psize, prot.pgprot); - if (!area5_io_base) { - printk("allocate_cf_area : can't open CF I/O window!\n"); - return -ENOMEM; - } - - paddrbase = virt_to_phys((void *)PA_AREA6_IO); - psize = PAGE_SIZE; - prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16); - area6_io_base = p3_ioremap(paddrbase, psize, prot.pgprot); - if (!area6_io_base) { - printk("allocate_cf_area : can't open HDD I/O window!\n"); - return -ENOMEM; - } - - printk(KERN_INFO "Allocate Area5/6 success.\n"); - - /* XXX : do we need attribute and common-memory area also? */ - - return 0; -} - -__initcall(cf_init); - -#include <linux/sched.h> - -/* Cycle the LED's in the clasic knightrider/Sun pattern */ - -void heartbeat_landisk(void) +/* cycle the led's in the clasic knightrider/sun pattern */ +static void heartbeat_landisk(void) { static unsigned int cnt = 0, blink = 0x00, period = 25; - volatile unsigned char *p = (volatile unsigned char *)PA_LED; + volatile u8 *p = (volatile u8 *)PA_LED; char data; - if ((landisk_ledparam & 0x080) == 0) { + if ((landisk_ledparam & 0x080) == 0) return; - } + cnt += 1; - if (cnt < period) { + + if (cnt < period) return; - } + cnt = 0; blink++; @@ -167,17 +62,16 @@ void heartbeat_landisk(void) } *p = data; - if (((landisk_ledparam & 0x007f7f00) == 0) - && (landisk_buzzerparam == 0)) { + if (((landisk_ledparam & 0x007f7f00) == 0) && + (landisk_buzzerparam == 0)) landisk_ledparam &= (~0x0080); - } + landisk_buzzerparam >>= 1; } /* * The Machine Vector */ - struct sh_machine_vector mv_landisk __initmv = { .mv_nr_irqs = 72, .mv_inb = landisk_inb, @@ -198,21 +92,88 @@ struct sh_machine_vector mv_landisk __initmv = { .mv_outsb = landisk_outsb, .mv_outsw = landisk_outsw, .mv_outsl = landisk_outsl, - .mv_readb = landisk_readb, - .mv_readw = landisk_readw, - .mv_readl = landisk_readl, - .mv_writeb = landisk_writeb, - .mv_writew = landisk_writew, - .mv_writel = landisk_writel, - .mv_ioremap = landisk_ioremap, - .mv_iounmap = landisk_iounmap, - .mv_isa_port2addr = landisk_isa_port2addr, + .mv_ioport_map = landisk_ioport_map, .mv_init_irq = init_landisk_IRQ, - #ifdef CONFIG_HEARTBEAT .mv_heartbeat = heartbeat_landisk, #endif - }; - ALIAS_MV(landisk) + +const char *get_system_type(void) +{ + return "LANDISK"; +} + +static void landisk_power_off(void) +{ + ctrl_outb(0x01, PA_SHUTDOWN); +} + +static void check_usl5p(void) +{ + volatile u8 *p = (volatile u8 *)PA_LED; + u8 tmp1, tmp2; + + tmp1 = *p; + *p = 0x40; + tmp2 = *p; + *p = tmp1; + + landisk_arch = (tmp2 == 0x40); + if (landisk_arch == 1) { + /* arch == usl-5p */ + landisk_ledparam = 0x00000380; + landisk_ledparam |= (tmp1 & 0x07c); + } else { + /* arch == landisk */ + landisk_ledparam = 0x02000180; + landisk_ledparam |= 0x04; + } +} + +void __init platform_setup(void) +{ + landisk_buzzerparam = 0; + check_usl5p(); + + printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); + board_time_init = landisk_time_init; + pm_power_off = landisk_power_off; +} + +void *area5_io_base; +void *area6_io_base; + +static int __init landisk_cf_init(void) +{ + pgprot_t prot; + unsigned long paddrbase, psize; + + /* open I/O area window */ + paddrbase = virt_to_phys((void *)PA_AREA5_IO); + psize = PAGE_SIZE; + prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); + area5_io_base = p3_ioremap(paddrbase, psize, prot.pgprot); + if (!area5_io_base) { + printk("allocate_cf_area : can't open CF I/O window!\n"); + return -ENOMEM; + } + + paddrbase = virt_to_phys((void *)PA_AREA6_IO); + psize = PAGE_SIZE; + prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16); + area6_io_base = p3_ioremap(paddrbase, psize, prot.pgprot); + if (!area6_io_base) { + printk("allocate_cf_area : can't open HDD I/O window!\n"); + return -ENOMEM; + } + + printk(KERN_INFO "Allocate Area5/6 success.\n"); + + /* XXX : do we need attribute and common-memory area also? */ + + return 0; +} + +__initcall(landisk_cf_init); |