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:
parent
41445b41cc
commit
0fa71ca3e5
2 changed files with 88 additions and 0 deletions
|
@ -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);
|
Loading…
Reference in a new issue