Merge branch 'gfar' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc...
[pandora-kernel.git] / arch / sh / boards / renesas / rts7751r2d / io.c
index 123abbb..f2507a8 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * linux/arch/sh/kernel/io_rts7751r2d.c
- *
  * Copyright (C) 2001  Ian da Silva, Jeremy Siegel
  * Based largely on io_se.c.
  *
  * placeholder code from io_rts7751r2d.c left in with the
  * expectation of later SuperIO and PCMCIA access.
  */
-
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <asm/io.h>
-#include <asm/rts7751r2d/rts7751r2d.h>
-#include <asm/addrspace.h>
-
-#include <linux/module.h>
 #include <linux/pci.h>
-#include "../../../drivers/pci/pci-sh7751.h"
+#include <linux/io.h>
+#include <asm/rts7751r2d.h>
+#include <asm/addrspace.h>
 
 /*
  * The 7751R RTS7751R2D uses the built-in PCI controller (PCIC)
  * like the other Solution Engine boards.
  */
 
-#define PCIIOBR                (volatile long *)PCI_REG(SH7751_PCIIOBR)
-#define PCIMBR          (volatile long *)PCI_REG(SH7751_PCIMBR)
-#define PCI_IO_AREA    SH7751_PCI_IO_BASE
-#define PCI_MEM_AREA   SH7751_PCI_CONFIG_BASE
-
-#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);
-}
-
 static inline unsigned long port2adr(unsigned int port)
 {
        if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
@@ -52,7 +30,7 @@ static inline unsigned long port2adr(unsigned int port)
                else
                        return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1));
        else
-               maybebadio(port2adr, (unsigned long)port);
+               maybebadio((unsigned long)port);
 
        return port;
 }
@@ -81,17 +59,6 @@ static inline int shifted_port(unsigned long port)
                return 1;
 }
 
-/* In case someone configures the kernel w/o PCI support: in that */
-/* scenario, don't ever bother to check for PCI-window addresses */
-
-/* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */
-#if defined(CONFIG_PCI)
-#define CHECK_SH7751_PCIIO(port) \
-  ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE)))
-#else
-#define CHECK_SH7751_PCIIO(port) (0)
-#endif
-
 #if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE)
 #define CHECK_AX88796L_PORT(port) \
   ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20)))
@@ -112,8 +79,8 @@ unsigned char rts7751r2d_inb(unsigned long port)
                return (*(volatile unsigned short *)port88796l(port, 0)) & 0xff;
        else if (PXSEG(port))
                return *(volatile unsigned char *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               return *(volatile unsigned char *)PCI_IOMAP(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               return *(volatile unsigned char *)pci_ioaddr(port);
        else
                return (*(volatile unsigned short *)port2adr(port) & 0xff);
 }
@@ -126,11 +93,12 @@ unsigned char rts7751r2d_inb_p(unsigned long port)
                v = (*(volatile unsigned short *)port88796l(port, 0)) & 0xff;
         else if (PXSEG(port))
                v = *(volatile unsigned char *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               v = *(volatile unsigned char *)PCI_IOMAP(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               v = *(volatile unsigned char *)pci_ioaddr(port);
        else
                v = (*(volatile unsigned short *)port2adr(port) & 0xff);
-       delay();
+
+       ctrl_delay();
 
        return v;
 }
@@ -138,13 +106,13 @@ unsigned char rts7751r2d_inb_p(unsigned long port)
 unsigned short rts7751r2d_inw(unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
-               maybebadio(inw, port);
+               maybebadio(port);
         else if (PXSEG(port))
                return *(volatile unsigned short *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               return *(volatile unsigned short *)PCI_IOMAP(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               return *(volatile unsigned short *)pci_ioaddr(port);
        else
-               maybebadio(inw, port);
+               maybebadio(port);
 
        return 0;
 }
@@ -152,13 +120,13 @@ unsigned short rts7751r2d_inw(unsigned long port)
 unsigned int rts7751r2d_inl(unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
-               maybebadio(inl, port);
+               maybebadio(port);
         else if (PXSEG(port))
                return *(volatile unsigned long *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               return *(volatile unsigned long *)PCI_IOMAP(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               return *(volatile unsigned long *)pci_ioaddr(port);
        else
-               maybebadio(inl, port);
+               maybebadio(port);
 
        return 0;
 }
@@ -169,8 +137,8 @@ void rts7751r2d_outb(unsigned char value, unsigned long port)
                *((volatile unsigned short *)port88796l(port, 0)) = value;
         else if (PXSEG(port))
                *(volatile unsigned char *)port = value;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               *(volatile unsigned char *)PCI_IOMAP(port) = value;
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               *(volatile unsigned char *)pci_ioaddr(port) = value;
        else
                *(volatile unsigned short *)port2adr(port) = value;
 }
@@ -181,143 +149,152 @@ void rts7751r2d_outb_p(unsigned char value, unsigned long port)
                *((volatile unsigned short *)port88796l(port, 0)) = value;
         else if (PXSEG(port))
                *(volatile unsigned char *)port = value;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               *(volatile unsigned char *)PCI_IOMAP(port) = value;
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               *(volatile unsigned char *)pci_ioaddr(port) = value;
        else
                *(volatile unsigned short *)port2adr(port) = value;
-       delay();
+
+       ctrl_delay();
 }
 
 void rts7751r2d_outw(unsigned short value, unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
-               maybebadio(outw, port);
+               maybebadio(port);
         else if (PXSEG(port))
                *(volatile unsigned short *)port = value;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               *(volatile unsigned short *)PCI_IOMAP(port) = value;
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               *(volatile unsigned short *)pci_ioaddr(port) = value;
        else
-               maybebadio(outw, port);
+               maybebadio(port);
 }
 
 void rts7751r2d_outl(unsigned int value, unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
-               maybebadio(outl, port);
+               maybebadio(port);
         else if (PXSEG(port))
                *(volatile unsigned long *)port = value;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               *(volatile unsigned long *)PCI_IOMAP(port) = value;
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               *(volatile unsigned long *)pci_ioaddr(port) = value;
        else
-               maybebadio(outl, port);
+               maybebadio(port);
 }
 
 void rts7751r2d_insb(unsigned long port, void *addr, unsigned long count)
 {
+       unsigned long a = (unsigned long)addr;
        volatile __u8 *bp;
        volatile __u16 *p;
-       unsigned char *s = addr;
 
        if (CHECK_AX88796L_PORT(port)) {
                p = (volatile unsigned short *)port88796l(port, 0);
-               while (count--) *s++ = *p & 0xff;
+               while (count--)
+                       ctrl_outb(*p & 0xff, a++);
        } else if (PXSEG(port))
-               while (count--) *s++ = *(volatile unsigned char *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
-               bp = (__u8 *)PCI_IOMAP(port);
-               while (count--) *s++ = *bp;
+               while (count--)
+                       ctrl_outb(ctrl_inb(port), a++);
+       else if (is_pci_ioaddr(port) || shifted_port(port)) {
+               bp = (__u8 *)pci_ioaddr(port);
+               while (count--)
+                       ctrl_outb(*bp, a++);
        } else {
                p = (volatile unsigned short *)port2adr(port);
-               while (count--) *s++ = *p & 0xff;
+               while (count--)
+                       ctrl_outb(*p & 0xff, a++);
        }
 }
 
 void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count)
 {
+       unsigned long a = (unsigned long)addr;
        volatile __u16 *p;
-       __u16 *s = addr;
 
        if (CHECK_AX88796L_PORT(port))
                p = (volatile unsigned short *)port88796l(port, 1);
        else if (PXSEG(port))
                p = (volatile unsigned short *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               p = (volatile unsigned short *)PCI_IOMAP(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               p = (volatile unsigned short *)pci_ioaddr(port);
        else
                p = (volatile unsigned short *)port2adr(port);
-       while (count--) *s++ = *p;
+       while (count--)
+               ctrl_outw(*p, a++);
 }
 
 void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count)
 {
        if (CHECK_AX88796L_PORT(port))
-               maybebadio(insl, port);
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
-               volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
-               __u32 *s = addr;
-
-               while (count--) *s++ = *p;
+               maybebadio(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port)) {
+               unsigned long a = (unsigned long)addr;
+
+               while (count--) {
+                       ctrl_outl(ctrl_inl(pci_ioaddr(port)), a);
+                       a += 4;
+               }
        } else
-               maybebadio(insl, port);
+               maybebadio(port);
 }
 
 void rts7751r2d_outsb(unsigned long port, const void *addr, unsigned long count)
 {
+       unsigned long a = (unsigned long)addr;
        volatile __u8 *bp;
        volatile __u16 *p;
-       const __u8 *s = addr;
 
        if (CHECK_AX88796L_PORT(port)) {
                p = (volatile unsigned short *)port88796l(port, 0);
-               while (count--) *p = *s++;
+               while (count--)
+                       *p = ctrl_inb(a++);
        } else if (PXSEG(port))
-               while (count--) *(volatile unsigned char *)port = *s++;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
-               bp = (__u8 *)PCI_IOMAP(port);
-               while (count--) *bp = *s++;
+               while (count--)
+                       ctrl_outb(a++, port);
+       else if (is_pci_ioaddr(port) || shifted_port(port)) {
+               bp = (__u8 *)pci_ioaddr(port);
+               while (count--)
+                       *bp = ctrl_inb(a++);
        } else {
                p = (volatile unsigned short *)port2adr(port);
-               while (count--) *p = *s++;
+               while (count--)
+                       *p = ctrl_inb(a++);
        }
 }
 
 void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count)
 {
+       unsigned long a = (unsigned long)addr;
        volatile __u16 *p;
-       const __u16 *s = addr;
 
        if (CHECK_AX88796L_PORT(port))
                p = (volatile unsigned short *)port88796l(port, 1);
        else if (PXSEG(port))
                p = (volatile unsigned short *)port;
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
-               p = (volatile unsigned short *)PCI_IOMAP(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port))
+               p = (volatile unsigned short *)pci_ioaddr(port);
        else
                p = (volatile unsigned short *)port2adr(port);
-       while (count--) *p = *s++;
+
+       while (count--) {
+               ctrl_outw(*p, a);
+               a += 2;
+       }
 }
 
 void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count)
 {
        if (CHECK_AX88796L_PORT(port))
-               maybebadio(outsl, port);
-       else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
-               volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
-               const __u32 *s = addr;
-
-               while (count--) *p = *s++;
+               maybebadio(port);
+       else if (is_pci_ioaddr(port) || shifted_port(port)) {
+               unsigned long a = (unsigned long)addr;
+
+               while (count--) {
+                       ctrl_outl(ctrl_inl(a), pci_ioaddr(port));
+                       a += 4;
+               }
        } else
-               maybebadio(outsl, port);
-}
-
-void *rts7751r2d_ioremap(unsigned long offset, unsigned long size)
-{
-       if (offset >= 0xfd000000)
-               return (void *)offset;
-       else
-               return (void *)P2SEGADDR(offset);
+               maybebadio(port);
 }
-EXPORT_SYMBOL(rts7751r2d_ioremap);
 
 unsigned long rts7751r2d_isa_port2addr(unsigned long offset)
 {