From: Paul Mackerras Use the pSeries_reconfig notifier list to handle newly added pci device nodes. Signed-off-by: Nathan Lynch Signed-off-by: Paul Mackerras Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/kernel/pci_dn.c | 22 ++++++++++++++++++++++ 25-akpm/arch/ppc64/kernel/prom.c | 14 -------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff -puN arch/ppc64/kernel/pci_dn.c~ppc64-pci_dnc-use-pseries-reconfig-notifier arch/ppc64/kernel/pci_dn.c --- 25/arch/ppc64/kernel/pci_dn.c~ppc64-pci_dnc-use-pseries-reconfig-notifier 2005-03-18 12:55:16.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/pci_dn.c 2005-03-18 12:55:16.000000000 -0800 @@ -27,6 +27,7 @@ #include #include #include +#include #include "pci.h" @@ -161,6 +162,25 @@ struct device_node *fetch_dev_dn(struct } EXPORT_SYMBOL(fetch_dev_dn); +static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) +{ + struct device_node *np = node; + int err = NOTIFY_OK; + + switch (action) { + case PSERIES_RECONFIG_ADD: + update_dn_pci_info(np, np->parent->phb); + break; + default: + err = NOTIFY_DONE; + break; + } + return err; +} + +static struct notifier_block pci_dn_reconfig_nb = { + .notifier_call = pci_dn_reconfig_notifier, +}; /* * Actually initialize the phbs. @@ -173,4 +193,6 @@ void __init pci_devs_phb_init(void) /* This must be done first so the device nodes have valid pci info! */ list_for_each_entry_safe(phb, tmp, &hose_list, list_node) pci_devs_phb_init_dynamic(phb); + + pSeries_reconfig_notifier_register(&pci_dn_reconfig_nb); } diff -puN arch/ppc64/kernel/prom.c~ppc64-pci_dnc-use-pseries-reconfig-notifier arch/ppc64/kernel/prom.c --- 25/arch/ppc64/kernel/prom.c~ppc64-pci_dnc-use-pseries-reconfig-notifier 2005-03-18 12:55:16.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/prom.c 2005-03-18 12:55:16.000000000 -0800 @@ -1591,7 +1591,6 @@ static int of_finish_dynamic_node(struct int unused3, int unused4) { struct device_node *parent = of_get_parent(node); - u32 *regs; int err = 0; phandle *ibm_phandle; @@ -1613,19 +1612,6 @@ static int of_finish_dynamic_node(struct if ((ibm_phandle = (unsigned int *)get_property(node, "ibm,phandle", NULL))) node->linux_phandle = *ibm_phandle; - /* now do the rough equivalent of update_dn_pci_info, this - * probably is not correct for phb's, but should work for - * IOAs and slots. - */ - - node->phb = parent->phb; - - regs = (u32 *)get_property(node, "reg", NULL); - if (regs) { - node->busno = (regs[0] >> 16) & 0xff; - node->devfn = (regs[0] >> 8) & 0xff; - } - out: of_node_put(parent); return err; _