forked from Minki/linux
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:
parent
ef339f241b
commit
8ce0143b11
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user