浏览代码

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>
Paul Burton 8 年之前
父节点
当前提交
c5611df968
共有 4 个文件被更改,包括 43 次插入25 次删除
  1. 7 1
      arch/mips/Kconfig
  2. 31 23
      arch/mips/include/asm/pci.h
  3. 4 0
      arch/mips/lib/iomap-pci.c
  4. 1 1
      arch/mips/pci/Makefile

+ 7 - 1
arch/mips/Kconfig

@@ -2974,7 +2974,6 @@ config PCI
 	bool "Support for PCI controller"
 	bool "Support for PCI controller"
 	depends on HW_HAS_PCI
 	depends on HW_HAS_PCI
 	select PCI_DOMAINS
 	select PCI_DOMAINS
-	select NO_GENERIC_PCI_IOPORT_MAP
 	help
 	help
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  bus system, i.e. the way the CPU talks to the other stuff inside
 	  bus system, i.e. the way the CPU talks to the other stuff inside
@@ -2998,6 +2997,13 @@ config PCI_DOMAINS
 config PCI_DOMAINS_GENERIC
 config PCI_DOMAINS_GENERIC
 	bool
 	bool
 
 
+config PCI_DRIVERS_GENERIC
+	bool
+
+config PCI_DRIVERS_LEGACY
+	def_bool !PCI_DRIVERS_GENERIC
+	select NO_GENERIC_PCI_IOPORT_MAP
+
 source "drivers/pci/Kconfig"
 source "drivers/pci/Kconfig"
 
 
 #
 #

+ 31 - 23
arch/mips/include/asm/pci.h

@@ -20,6 +20,8 @@
 #include <linux/list.h>
 #include <linux/list.h>
 #include <linux/of.h>
 #include <linux/of.h>
 
 
+#ifdef CONFIG_PCI_DRIVERS_LEGACY
+
 /*
 /*
  * Each pci channel is a top-level PCI bus seem by CPU.	 A machine  with
  * Each pci channel is a top-level PCI bus seem by CPU.	 A machine  with
  * multiple PCI channels may have multiple PCI host controllers or a
  * multiple PCI channels may have multiple PCI host controllers or a
@@ -62,6 +64,35 @@ extern void register_pci_controller(struct pci_controller *hose);
  */
  */
 extern int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
 extern int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
 
 
+/* Do platform specific device initialization at pci_enable_device() time */
+extern int pcibios_plat_dev_init(struct pci_dev *dev);
+
+extern char * (*pcibios_plat_setup)(char *str);
+
+#ifdef CONFIG_OF
+/* this function parses memory ranges from a device node */
+extern void pci_load_of_ranges(struct pci_controller *hose,
+			       struct device_node *node);
+#else
+static inline void pci_load_of_ranges(struct pci_controller *hose,
+				      struct device_node *node) {}
+#endif
+
+#ifdef CONFIG_PCI_DOMAINS_GENERIC
+static inline void set_pci_need_domain_info(struct pci_controller *hose,
+					    int need_domain_info)
+{
+	/* nothing to do */
+}
+#elif defined(CONFIG_PCI_DOMAINS)
+static inline void set_pci_need_domain_info(struct pci_controller *hose,
+					    int need_domain_info)
+{
+	hose->need_domain_info = need_domain_info;
+}
+#endif /* CONFIG_PCI_DOMAINS */
+
+#endif
 
 
 /* Can be used to override the logic in pci_scan_bus for skipping
 /* Can be used to override the logic in pci_scan_bus for skipping
    already-configured bus numbers - to be used for buggy BIOSes
    already-configured bus numbers - to be used for buggy BIOSes
@@ -110,12 +141,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 {
 {
 	return pci_domain_nr(bus);
 	return pci_domain_nr(bus);
 }
 }
-
-static inline void set_pci_need_domain_info(struct pci_controller *hose,
-					    int need_domain_info)
-{
-	/* nothing to do */
-}
 #elif defined(CONFIG_PCI_DOMAINS)
 #elif defined(CONFIG_PCI_DOMAINS)
 #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
 #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
 
 
@@ -124,12 +149,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 	struct pci_controller *hose = bus->sysdata;
 	struct pci_controller *hose = bus->sysdata;
 	return hose->need_domain_info;
 	return hose->need_domain_info;
 }
 }
-
-static inline void set_pci_need_domain_info(struct pci_controller *hose,
-					    int need_domain_info)
-{
-	hose->need_domain_info = need_domain_info;
-}
 #endif /* CONFIG_PCI_DOMAINS */
 #endif /* CONFIG_PCI_DOMAINS */
 
 
 #endif /* __KERNEL__ */
 #endif /* __KERNEL__ */
@@ -143,15 +162,4 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
 	return channel ? 15 : 14;
 	return channel ? 15 : 14;
 }
 }
 
 
-extern char * (*pcibios_plat_setup)(char *str);
-
-#ifdef CONFIG_OF
-/* this function parses memory ranges from a device node */
-extern void pci_load_of_ranges(struct pci_controller *hose,
-			       struct device_node *node);
-#else
-static inline void pci_load_of_ranges(struct pci_controller *hose,
-				      struct device_node *node) {}
-#endif
-
 #endif /* _ASM_PCI_H */
 #endif /* _ASM_PCI_H */

+ 4 - 0
arch/mips/lib/iomap-pci.c

@@ -10,6 +10,8 @@
 #include <linux/export.h>
 #include <linux/export.h>
 #include <asm/io.h>
 #include <asm/io.h>
 
 
+#ifdef CONFIG_PCI_DRIVERS_LEGACY
+
 void __iomem *__pci_ioport_map(struct pci_dev *dev,
 void __iomem *__pci_ioport_map(struct pci_dev *dev,
 			       unsigned long port, unsigned int nr)
 			       unsigned long port, unsigned int nr)
 {
 {
@@ -40,6 +42,8 @@ void __iomem *__pci_ioport_map(struct pci_dev *dev,
 	return (void __iomem *) (ctrl->io_map_base + port);
 	return (void __iomem *) (ctrl->io_map_base + port);
 }
 }
 
 
+#endif /* CONFIG_PCI_DRIVERS_LEGACY */
+
 void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
 void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
 {
 {
 	iounmap(addr);
 	iounmap(addr);

+ 1 - 1
arch/mips/pci/Makefile

@@ -3,7 +3,7 @@
 #
 #
 
 
 obj-y				+= pci.o
 obj-y				+= pci.o
-obj-y				+= pci-legacy.o
+obj-$(CONFIG_PCI_DRIVERS_LEGACY)+= pci-legacy.o
 
 
 #
 #
 # PCI bus host bridge specific code
 # PCI bus host bridge specific code