linux/3.9: implement pcibios_get_phb_of_node for MIPS
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 36495
This commit is contained in:
		| @@ -0,0 +1,40 @@ | |||||||
|  | From 10629d711ed780470937ecda50d9ffa0e925a4ee Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Bjorn Helgaas <bhelgaas@google.com> | ||||||
|  | Date: Wed, 10 Apr 2013 09:56:54 -0600 | ||||||
|  | Subject: [PATCH 1/2] PCI: Remove __weak annotation from | ||||||
|  |  pcibios_get_phb_of_node decl | ||||||
|  |  | ||||||
|  | The __weak annotation on the pcibios_get_phb_of_node() declaration | ||||||
|  | causes *every* definition to be marked "weak."  The linker then | ||||||
|  | selects one based on link order, which may be the wrong one. | ||||||
|  |  | ||||||
|  | Gabor found that on MIPS, the linker selected the generic implementation | ||||||
|  | from drivers/pci even though arch/mips supplied a definition without the | ||||||
|  | __weak annotation: | ||||||
|  |  | ||||||
|  | $ mipsel-openwrt-linux-readelf -s arch/mips/pci/built-in.o \ | ||||||
|  |     drivers/pci/built-in.o vmlinux.o | grep pcibios_get_phb_of_node | ||||||
|  |       86: 0000046c    12 FUNC    WEAK   DEFAULT    2 pcibios_get_phb_of_node | ||||||
|  |     1430: 00012e2c   104 FUNC    WEAK   DEFAULT    2 pcibios_get_phb_of_node | ||||||
|  |    31898: 0017e4ec   104 FUNC    WEAK   DEFAULT    2 pcibios_get_phb_of_node | ||||||
|  |  | ||||||
|  | This removes the __weak annotation from the pcibios_get_phb_of_node() | ||||||
|  | declaration so arch-specific non-weak implementations work reliably. | ||||||
|  |  | ||||||
|  | Suggested-by: Gabor Juhos <juhosg@openwrt.org> | ||||||
|  | Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> | ||||||
|  | --- | ||||||
|  |  include/linux/pci.h |    2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/include/linux/pci.h | ||||||
|  | +++ b/include/linux/pci.h | ||||||
|  | @@ -1824,7 +1824,7 @@ extern void pci_set_bus_of_node(struct p | ||||||
|  |  extern void pci_release_bus_of_node(struct pci_bus *bus); | ||||||
|  |   | ||||||
|  |  /* Arch may override this (weak) */ | ||||||
|  | -extern struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus); | ||||||
|  | +extern struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus); | ||||||
|  |   | ||||||
|  |  static inline struct device_node * | ||||||
|  |  pci_device_to_OF_node(const struct pci_dev *pdev) | ||||||
| @@ -0,0 +1,48 @@ | |||||||
|  | From 9a97cd43f4ef62520a852b5a2348233b0f37455b Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Gabor Juhos <juhosg@openwrt.org> | ||||||
|  | Date: Thu, 4 Apr 2013 20:01:23 +0200 | ||||||
|  | Subject: [PATCH 2/2] MIPS/PCI: Implement pcibios_get_phb_of_node | ||||||
|  |  | ||||||
|  | The of_node field of the device assigned to a | ||||||
|  | PCI bus is used during scanning of the PCI bus. | ||||||
|  | However on MIPS, the of_node field is assigned | ||||||
|  | only after the bus has been scanned. | ||||||
|  |  | ||||||
|  | Implement the architecture specific version of | ||||||
|  | 'pcibios_get_phb_of_node'. Which ensures that the | ||||||
|  | PCI driver core will initialize the of_node field | ||||||
|  | before starting the scan. | ||||||
|  |  | ||||||
|  | Also remove the local assignment of bus->dev.of_node, | ||||||
|  | it is not needed after the patch. | ||||||
|  |  | ||||||
|  | Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | ||||||
|  | Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> | ||||||
|  | --- | ||||||
|  |  arch/mips/pci/pci.c |    8 +++++++- | ||||||
|  |  1 file changed, 7 insertions(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/arch/mips/pci/pci.c | ||||||
|  | +++ b/arch/mips/pci/pci.c | ||||||
|  | @@ -115,7 +115,6 @@ static void pcibios_scanbus(struct pci_c | ||||||
|  |  			pci_bus_assign_resources(bus); | ||||||
|  |  			pci_enable_bridges(bus); | ||||||
|  |  		} | ||||||
|  | -		bus->dev.of_node = hose->of_node; | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -169,6 +168,13 @@ void pci_load_of_ranges(struct pci_contr | ||||||
|  |  		} | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  | + | ||||||
|  | +struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) | ||||||
|  | +{ | ||||||
|  | +	struct pci_controller *hose = bus->sysdata; | ||||||
|  | + | ||||||
|  | +	return of_node_get(hose->of_node); | ||||||
|  | +} | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |  static DEFINE_MUTEX(pci_scan_mutex); | ||||||
		Reference in New Issue
	
	Block a user
	 Gabor Juhos
					Gabor Juhos