These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / of / of_pci.c
index 5751dc5..b1449f7 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/of_device.h>
 #include <linux/of_pci.h>
 #include <linux/slab.h>
+#include <asm-generic/pci-bridge.h>
 
 static inline int __of_pci_pci_compare(struct device_node *node,
                                       unsigned int data)
@@ -118,24 +119,29 @@ int of_get_pci_domain_nr(struct device_node *node)
 EXPORT_SYMBOL_GPL(of_get_pci_domain_nr);
 
 /**
- * of_pci_dma_configure - Setup DMA configuration
- * @dev: ptr to pci_dev struct of the PCI device
- *
- * Function to update PCI devices's DMA configuration using the same
- * info from the OF node of host bridge's parent (if any).
+ * of_pci_check_probe_only - Setup probe only mode if linux,pci-probe-only
+ *                           is present and valid
  */
-void of_pci_dma_configure(struct pci_dev *pci_dev)
+void of_pci_check_probe_only(void)
 {
-       struct device *dev = &pci_dev->dev;
-       struct device *bridge = pci_get_host_bridge_device(pci_dev);
+       u32 val;
+       int ret;
 
-       if (!bridge->parent)
+       ret = of_property_read_u32(of_chosen, "linux,pci-probe-only", &val);
+       if (ret) {
+               if (ret == -ENODATA || ret == -EOVERFLOW)
+                       pr_warn("linux,pci-probe-only without valid value, ignoring\n");
                return;
+       }
+
+       if (val)
+               pci_add_flags(PCI_PROBE_ONLY);
+       else
+               pci_clear_flags(PCI_PROBE_ONLY);
 
-       of_dma_configure(dev, bridge->parent->of_node);
-       pci_put_host_bridge_device(bridge);
+       pr_info("PCI: PROBE_ONLY %sabled\n", val ? "en" : "dis");
 }
-EXPORT_SYMBOL_GPL(of_pci_dma_configure);
+EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
 
 #if defined(CONFIG_OF_ADDRESS)
 /**
@@ -223,8 +229,10 @@ int of_pci_get_host_bridge_resources(struct device_node *dev,
                }
 
                err = of_pci_range_to_resource(&range, dev, res);
-               if (err)
-                       goto conversion_failed;
+               if (err) {
+                       kfree(res);
+                       continue;
+               }
 
                if (resource_type(res) == IORESOURCE_IO) {
                        if (!io_base) {