@@ -52,6 +52,7 @@ struct pci_host_bridge *pci_create_host_bridge(
return NULL;
host->sysdata = info->arg;
+ host->node = info->node;
host->busnum = PCI_BUSNUM(db);
host->domain = PCI_DOMAIN(db);
host->ops = ops;
@@ -2126,9 +2126,13 @@ struct pci_host_bridge *pci_scan_host_bridge(
pci_bus_insert_busn_res(host->bus, host->busnum, 255);
}
- max = pci_scan_child_bus(host->bus);
- if (!found)
- pci_bus_update_busn_res_end(host->bus, max);
+ if (info->of_scan_bus) {
+ info->of_scan_bus(host);
+ } else {
+ max = pci_scan_child_bus(host->bus);
+ if (!found)
+ pci_bus_update_busn_res_end(host->bus, max);
+ }
return host;
@@ -407,6 +407,7 @@ struct pci_host_bridge {
int busnum;
int domain;
void *sysdata;
+ struct device_node *node;
struct pci_ops *ops;
struct msi_controller *(*get_msi_ctrl)(struct pci_dev *pdev);
void (*release_fn)(struct pci_host_bridge *);
@@ -416,10 +417,12 @@ struct pci_host_bridge {
struct pci_host_info {
u8 res_type;
void *arg;
+ struct device_node *node;
struct list_head *resources; /*just for build, will clean up later */
struct msi_controller *(*get_msi_ctrl)(struct pci_dev *pdev);
int (*init_res)(struct pci_host_bridge *host,
struct pci_host_info *info);
+ void (*of_scan_bus)(struct pci_host_bridge *host);
};
static inline void init_pci_host_info(struct pci_host_info *info)
Add of_scan_bus() to support some platforms scan bus by of_node. Signed-off-by: Yijing Wang <wangyijing@huawei.com> --- drivers/pci/host-bridge.c | 1 + drivers/pci/probe.c | 10 +++++++--- include/linux/pci.h | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-)