18 #include <linux/kernel.h>
19 #include <linux/pci.h>
20 #include <linux/string.h>
21 #include <linux/export.h>
26 #include <asm/processor.h>
29 #include <asm/pci-bridge.h>
30 #include <asm/machdep.h>
41 #define ISA_SPACE_MASK 0x1
42 #define ISA_SPACE_IO 0x1
45 unsigned long phb_io_base_phys)
60 struct isa_address isa_addr;
61 struct pci_address pci_addr;
65 const struct isa_range *
range;
67 unsigned int isa_addr;
72 if (range ==
NULL || (rlen <
sizeof(
struct isa_range)))
85 rlen -=
sizeof(
struct isa_range);
86 if (rlen <
sizeof(
struct isa_range))
92 isa_addr = range->isa_addr.a_lo;
93 pci_addr = (
unsigned long) range->pci_addr.a_mid << 32 |
100 if ((pci_addr != 0) || (isa_addr != 0)) {
134 if (isa_bridge_devnode !=
NULL)
142 for_each_node_by_type(np,
"isa") {
145 if (parent == hose->dn) {
158 isa_bridge_devnode = np;
161 pci_process_ISA_OF_ranges(np, hose->io_base_phys);
179 isa_bridge_devnode = of_node_get(devnode);
180 isa_bridge_pcidev = pdev;
183 pci_process_ISA_OF_ranges(devnode, hose->io_base_phys);
188 pr_debug(
"ISA bridge (late) is %s on %s\n",
195 static void isa_bridge_remove(
void)
207 of_node_put(isa_bridge_devnode);
208 isa_bridge_devnode =
NULL;
209 isa_bridge_pcidev =
NULL;
223 struct device_node *devnode = pci_device_to_OF_node(pdev);
228 if (isa_bridge_devnode && isa_bridge_devnode == devnode &&
229 !isa_bridge_pcidev) {
230 pr_debug(
"ISA bridge PCI attached: %s\n",
232 isa_bridge_pcidev = pdev;
238 if (!isa_bridge_devnode && devnode && devnode->
type &&
240 isa_bridge_find_late(pdev, devnode);
245 if (pdev == isa_bridge_pcidev ||
246 (devnode && devnode == isa_bridge_devnode))
254 .notifier_call = isa_bridge_notify
261 static int __init isa_bridge_init(
void)