Merge branch 'remotes/lorenzo/pci/hyper-v'
[platform/kernel/linux-rpi.git] / drivers / pci / probe.c
index ea7f2a5..d9fc02a 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/hypervisor.h>
 #include <linux/irqdomain.h>
 #include <linux/pm_runtime.h>
+#include <linux/bitfield.h>
 #include "pci.h"
 
 #define CARDBUS_LATENCY_TIMER  176     /* secondary latency timer */
@@ -1506,8 +1507,8 @@ void set_pcie_port_type(struct pci_dev *pdev)
        pdev->pcie_cap = pos;
        pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
        pdev->pcie_flags_reg = reg16;
-       pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, &reg16);
-       pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
+       pci_read_config_dword(pdev, pos + PCI_EXP_DEVCAP, &pdev->devcap);
+       pdev->pcie_mpss = FIELD_GET(PCI_EXP_DEVCAP_PAYLOAD, pdev->devcap);
 
        parent = pci_upstream_bridge(pdev);
        if (!parent)
@@ -1817,6 +1818,9 @@ int pci_setup_device(struct pci_dev *dev)
        dev->error_state = pci_channel_io_normal;
        set_pcie_port_type(dev);
 
+       pci_set_of_node(dev);
+       pci_set_acpi_fwnode(dev);
+
        pci_dev_assign_slot(dev);
 
        /*
@@ -1954,6 +1958,7 @@ int pci_setup_device(struct pci_dev *dev)
        default:                                    /* unknown header */
                pci_err(dev, "unknown header type %02x, ignoring device\n",
                        dev->hdr_type);
+               pci_release_of_node(dev);
                return -EIO;
 
        bad:
@@ -2233,7 +2238,6 @@ static void pci_release_capabilities(struct pci_dev *dev)
 {
        pci_aer_exit(dev);
        pci_rcec_exit(dev);
-       pci_vpd_release(dev);
        pci_iov_release(dev);
        pci_free_cap_save_buffers(dev);
 }
@@ -2382,10 +2386,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
        dev->vendor = l & 0xffff;
        dev->device = (l >> 16) & 0xffff;
 
-       pci_set_of_node(dev);
-
        if (pci_setup_device(dev)) {
-               pci_release_of_node(dev);
                pci_bus_put(dev->bus);
                kfree(dev);
                return NULL;
@@ -2436,9 +2437,7 @@ static void pci_init_capabilities(struct pci_dev *dev)
        pci_rcec_init(dev);             /* Root Complex Event Collector */
 
        pcie_report_downtraining(dev);
-
-       if (pci_probe_reset_function(dev) == 0)
-               dev->reset_fn = 1;
+       pci_init_reset_methods(dev);
 }
 
 /*