Skip to content

Commit

Permalink
sh: pci io port base address code
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Magnus Damm authored and Paul Mundt committed Apr 16, 2009
1 parent ef339f2 commit 8ce0143
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 28 deletions.
1 change: 0 additions & 1 deletion arch/sh/drivers/pci/ops-rts7751r2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

47 changes: 20 additions & 27 deletions arch/sh/include/asm/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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. */
Expand Down
5 changes: 5 additions & 0 deletions arch/sh/kernel/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
* for more details.
*/
#include <linux/module.h>
#include <linux/pci.h>
#include <asm/machvec.h>
#include <asm/io.h>

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 8ce0143

Please sign in to comment.