Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ce0143b authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt
Browse files

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: default avatarMagnus Damm <damm@igel.co.jp>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent ef339f24
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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);
}
+20 −27
Original line number Diff line number Diff line
@@ -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. */
+5 −0
Original line number Diff line number Diff line
@@ -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);