sh: pci io port base address code
authorMagnus Damm <magnus.damm@gmail.com>
Tue, 19 Feb 2008 12:35:31 +0000 (21:35 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 16 Apr 2009 07:00:14 +0000 (16:00 +0900)
Adds a __get_pci_io_base() function which is used to match a port range
against struct pci_channel. This allows us to detect if a port range is
assigned to pci or happens to be legacy port io. While at it, remove unused
cpu-specific cruft.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/drivers/pci/ops-rts7751r2d.c
arch/sh/include/asm/pci.h
arch/sh/kernel/io.c

index fe5a231b866983228deb651c648b7ecc56f98dd7..58ed1d58cffb1a70fd058814ef1c964797e852b2 100644 (file)
@@ -68,7 +68,6 @@ static struct sh4_pci_address_map sh7751_pci_map = {
 
 int __init pcibios_init_platform(void)
 {
-       __set_io_port_base(SH7751_PCI_IO_BASE);
        return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
 }
 
index ccf5c5ff62ff9fe2fe99b80f750369c17cf22b8d..bb2c2fcddc9eac380869c4ed0efdc28a5f9eb5cd 100644 (file)
@@ -38,33 +38,6 @@ extern struct pci_channel board_pci_channels[];
 #define PCIBIOS_MIN_IO         __PCI_CHAN(bus)->io_resource->start
 #define PCIBIOS_MIN_MEM                __PCI_CHAN(bus)->mem_resource->start
 
-/*
- * I/O routine helpers
- */
-#if defined(CONFIG_CPU_SUBTYPE_SH7780) || defined(CONFIG_CPU_SUBTYPE_SH7785)
-#define PCI_IO_AREA            0xFE400000
-#define PCI_IO_SIZE            0x00400000
-#elif defined(CONFIG_CPU_SH5)
-extern unsigned long PCI_IO_AREA;
-#define PCI_IO_SIZE            0x00010000
-#else
-#define PCI_IO_AREA            0xFE240000
-#define PCI_IO_SIZE            0x00040000
-#endif
-
-#define PCI_MEM_SIZE           0x01000000
-
-#define SH4_PCIIOBR_MASK       0xFFFC0000
-#define pci_ioaddr(addr)       (PCI_IO_AREA + (addr & ~SH4_PCIIOBR_MASK))
-
-#if defined(CONFIG_PCI)
-#define is_pci_ioaddr(port)            \
-       (((port) >= PCIBIOS_MIN_IO) &&  \
-        ((port) < (PCIBIOS_MIN_IO + PCI_IO_SIZE)))
-#else
-#define is_pci_ioaddr(port)    (0)
-#endif
-
 struct pci_dev;
 
 extern void pcibios_set_master(struct pci_dev *dev);
@@ -137,11 +110,31 @@ static inline int __is_pci_memory(unsigned long phys_addr, unsigned long size)
        }
        return 0;
 }
+
+static inline void __iomem *__get_pci_io_base(unsigned long port,
+                                             unsigned long size)
+{
+       struct pci_channel *p;
+       struct resource *res;
+
+       for (p = board_pci_channels; p->init; p++) {
+               res = p->io_resource;
+               if (p->enabled && (port >= res->start) &&
+                   (port + size) <= (res->end + 1))
+                       return (void __iomem *)(p->io_base + port);
+       }
+       return NULL;
+}
 #else
 static inline int __is_pci_memory(unsigned long phys_addr, unsigned long size)
 {
        return 0;
 }
+static inline void __iomem *__get_pci_io_base(unsigned long port,
+                                             unsigned long size)
+{
+       return NULL;
+}
 #endif
 
 /* Board-specific fixup routines. */
index 29cf4588fc050a996d2e62f95aa4f3ada2ad9733..59fb020718a34a7be28a1feb2acdaee140440965 100644 (file)
@@ -12,6 +12,7 @@
  * for more details.
  */
 #include <linux/module.h>
+#include <linux/pci.h>
 #include <asm/machvec.h>
 #include <asm/io.h>
 
@@ -69,6 +70,10 @@ void __iomem *ioport_map(unsigned long port, unsigned int nr)
        if (ret)
                return ret;
 
+       ret = __get_pci_io_base(port, nr);
+       if (ret)
+               return ret;
+
        return __ioport_map(port, nr);
 }
 EXPORT_SYMBOL(ioport_map);