sh: pci io port base address code

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>
This commit is contained in:
Magnus Damm 2008-02-19 21:35:31 +09:00 committed by Paul Mundt
parent ef339f241b
commit 8ce0143b11
3 changed files with 25 additions and 28 deletions

View 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);
}

View 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. */

View 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);