aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Burton <paul.burton@imgtec.com>2016-10-05 13:18:12 -0400
committerRalf Baechle <ralf@linux-mips.org>2016-10-06 12:00:05 -0400
commitc5611df968047fb0b38156497b4242730ef66108 (patch)
tree0f69ce4163194a0152e2673e3c71c47eabfffa0b
parentf8091a88978b68df8ee6095eed0de2177eac3c69 (diff)
MIPS: PCI: Introduce CONFIG_PCI_DRIVERS_LEGACY
Introduce 2 Kconfig symbols, CONFIG_PCI_DRIVERS_GENERIC & CONFIG_PCI_DRIVERS_LEGACY, which indicate whether the system should be built to for PCI drivers using the MIPS-specific struct pci_controller API (hereafter "legacy" drivers) or more generic drivers using only functionality provided by the PCI core (hereafter "generic" drivers). The Kconfig entries are created such that platforms have to select CONFIG_PCI_DRIVERS_GENERIC if they wish to use it - that is, the default is CONFIG_PCI_DRIVERS_LEGACY so that existing platforms need no modification. The functions declared in pci.h are rearranged with those provided only by pci-legacy.c being guarded by an #ifdef CONFIG_PCI_DRIVERS_LEGACY to ensure they are only used in configurations where they are implemented. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/14345/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/Kconfig8
-rw-r--r--arch/mips/include/asm/pci.h54
-rw-r--r--arch/mips/lib/iomap-pci.c4
-rw-r--r--arch/mips/pci/Makefile2
4 files changed, 43 insertions, 25 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 7a75215aabac..d31f839c6e77 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -2974,7 +2974,6 @@ config PCI
2974 bool "Support for PCI controller" 2974 bool "Support for PCI controller"
2975 depends on HW_HAS_PCI 2975 depends on HW_HAS_PCI
2976 select PCI_DOMAINS 2976 select PCI_DOMAINS
2977 select NO_GENERIC_PCI_IOPORT_MAP
2978 help 2977 help
2979 Find out whether you have a PCI motherboard. PCI is the name of a 2978 Find out whether you have a PCI motherboard. PCI is the name of a
2980 bus system, i.e. the way the CPU talks to the other stuff inside 2979 bus system, i.e. the way the CPU talks to the other stuff inside
@@ -2998,6 +2997,13 @@ config PCI_DOMAINS
2998config PCI_DOMAINS_GENERIC 2997config PCI_DOMAINS_GENERIC
2999 bool 2998 bool
3000 2999
3000config PCI_DRIVERS_GENERIC
3001 bool
3002
3003config PCI_DRIVERS_LEGACY
3004 def_bool !PCI_DRIVERS_GENERIC
3005 select NO_GENERIC_PCI_IOPORT_MAP
3006
3001source "drivers/pci/Kconfig" 3007source "drivers/pci/Kconfig"
3002 3008
3003# 3009#
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index acc651ec5014..30d1129d8624 100644
--- a/arch/mips/include/asm/pci.h
+++ b/arch/mips/include/asm/pci.h
@@ -20,6 +20,8 @@
20#include <linux/list.h> 20#include <linux/list.h>
21#include <linux/of.h> 21#include <linux/of.h>
22 22
23#ifdef CONFIG_PCI_DRIVERS_LEGACY
24
23/* 25/*
24 * Each pci channel is a top-level PCI bus seem by CPU. A machine with 26 * Each pci channel is a top-level PCI bus seem by CPU. A machine with
25 * multiple PCI channels may have multiple PCI host controllers or a 27 * multiple PCI channels may have multiple PCI host controllers or a
@@ -62,6 +64,35 @@ extern void register_pci_controller(struct pci_controller *hose);
62 */ 64 */
63extern int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin); 65extern int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
64 66
67/* Do platform specific device initialization at pci_enable_device() time */
68extern int pcibios_plat_dev_init(struct pci_dev *dev);
69
70extern char * (*pcibios_plat_setup)(char *str);
71
72#ifdef CONFIG_OF
73/* this function parses memory ranges from a device node */
74extern void pci_load_of_ranges(struct pci_controller *hose,
75 struct device_node *node);
76#else
77static inline void pci_load_of_ranges(struct pci_controller *hose,
78 struct device_node *node) {}
79#endif
80
81#ifdef CONFIG_PCI_DOMAINS_GENERIC
82static inline void set_pci_need_domain_info(struct pci_controller *hose,
83 int need_domain_info)
84{
85 /* nothing to do */
86}
87#elif defined(CONFIG_PCI_DOMAINS)
88static inline void set_pci_need_domain_info(struct pci_controller *hose,
89 int need_domain_info)
90{
91 hose->need_domain_info = need_domain_info;
92}
93#endif /* CONFIG_PCI_DOMAINS */
94
95#endif
65 96
66/* Can be used to override the logic in pci_scan_bus for skipping 97/* Can be used to override the logic in pci_scan_bus for skipping
67 already-configured bus numbers - to be used for buggy BIOSes 98 already-configured bus numbers - to be used for buggy BIOSes
@@ -110,12 +141,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)
110{ 141{
111 return pci_domain_nr(bus); 142 return pci_domain_nr(bus);
112} 143}
113
114static inline void set_pci_need_domain_info(struct pci_controller *hose,
115 int need_domain_info)
116{
117 /* nothing to do */
118}
119#elif defined(CONFIG_PCI_DOMAINS) 144#elif defined(CONFIG_PCI_DOMAINS)
120#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index 145#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
121 146
@@ -124,12 +149,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)
124 struct pci_controller *hose = bus->sysdata; 149 struct pci_controller *hose = bus->sysdata;
125 return hose->need_domain_info; 150 return hose->need_domain_info;
126} 151}
127
128static inline void set_pci_need_domain_info(struct pci_controller *hose,
129 int need_domain_info)
130{
131 hose->need_domain_info = need_domain_info;
132}
133#endif /* CONFIG_PCI_DOMAINS */ 152#endif /* CONFIG_PCI_DOMAINS */
134 153
135#endif /* __KERNEL__ */ 154#endif /* __KERNEL__ */
@@ -143,15 +162,4 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
143 return channel ? 15 : 14; 162 return channel ? 15 : 14;
144} 163}
145 164
146extern char * (*pcibios_plat_setup)(char *str);
147
148#ifdef CONFIG_OF
149/* this function parses memory ranges from a device node */
150extern void pci_load_of_ranges(struct pci_controller *hose,
151 struct device_node *node);
152#else
153static inline void pci_load_of_ranges(struct pci_controller *hose,
154 struct device_node *node) {}
155#endif
156
157#endif /* _ASM_PCI_H */ 165#endif /* _ASM_PCI_H */
diff --git a/arch/mips/lib/iomap-pci.c b/arch/mips/lib/iomap-pci.c
index a629077fd7b9..8ed3f25a9047 100644
--- a/arch/mips/lib/iomap-pci.c
+++ b/arch/mips/lib/iomap-pci.c
@@ -10,6 +10,8 @@
10#include <linux/export.h> 10#include <linux/export.h>
11#include <asm/io.h> 11#include <asm/io.h>
12 12
13#ifdef CONFIG_PCI_DRIVERS_LEGACY
14
13void __iomem *__pci_ioport_map(struct pci_dev *dev, 15void __iomem *__pci_ioport_map(struct pci_dev *dev,
14 unsigned long port, unsigned int nr) 16 unsigned long port, unsigned int nr)
15{ 17{
@@ -40,6 +42,8 @@ void __iomem *__pci_ioport_map(struct pci_dev *dev,
40 return (void __iomem *) (ctrl->io_map_base + port); 42 return (void __iomem *) (ctrl->io_map_base + port);
41} 43}
42 44
45#endif /* CONFIG_PCI_DRIVERS_LEGACY */
46
43void pci_iounmap(struct pci_dev *dev, void __iomem * addr) 47void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
44{ 48{
45 iounmap(addr); 49 iounmap(addr);
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile
index 566663758570..847821040cd9 100644
--- a/arch/mips/pci/Makefile
+++ b/arch/mips/pci/Makefile
@@ -3,7 +3,7 @@
3# 3#
4 4
5obj-y += pci.o 5obj-y += pci.o
6obj-y += pci-legacy.o 6obj-$(CONFIG_PCI_DRIVERS_LEGACY)+= pci-legacy.o
7 7
8# 8#
9# PCI bus host bridge specific code 9# PCI bus host bridge specific code