doc: board: Add Intel Cherry Hill board doc
[oweals/u-boot.git] / drivers / pci / pci-emul-uclass.c
index 0f8e3c9fcbdc2c6702fc0d32a5e7b7c9fc150a4b..38227583547341f080fa124818521d2dad08277d 100644 (file)
@@ -1,46 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2014 Google, Inc
  * Written by Simon Glass <sjg@chromium.org>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <dm.h>
 #include <fdtdec.h>
-#include <libfdt.h>
+#include <linux/libfdt.h>
 #include <pci.h>
 #include <dm/lists.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
-struct sandbox_pci_priv {
+struct sandbox_pci_emul_priv {
        int dev_count;
 };
 
 int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
-                        struct udevice **emulp)
+                        struct udevice **containerp, struct udevice **emulp)
 {
        struct udevice *dev;
        int ret;
 
-       ret = pci_bus_find_devfn(bus, find_devfn, &dev);
+       *containerp = NULL;
+       ret = pci_bus_find_devfn(bus, PCI_MASK_BUS(find_devfn), &dev);
        if (ret) {
                debug("%s: Could not find emulator for dev %x\n", __func__,
                      find_devfn);
                return ret;
        }
+       *containerp = dev;
 
-       ret = device_find_first_child(dev, emulp);
-       if (ret)
-               return ret;
+       if (device_get_uclass_id(dev) == UCLASS_PCI_GENERIC) {
+               ret = device_find_first_child(dev, emulp);
+               if (ret)
+                       return ret;
+       } else {
+               *emulp = dev;
+       }
 
        return *emulp ? 0 : -ENODEV;
 }
 
 static int sandbox_pci_emul_post_probe(struct udevice *dev)
 {
-       struct sandbox_pci_priv *priv = dev->uclass->priv;
+       struct sandbox_pci_emul_priv *priv = dev->uclass->priv;
 
        priv->dev_count++;
        sandbox_set_enable_pci_map(true);
@@ -50,7 +53,7 @@ static int sandbox_pci_emul_post_probe(struct udevice *dev)
 
 static int sandbox_pci_emul_pre_remove(struct udevice *dev)
 {
-       struct sandbox_pci_priv *priv = dev->uclass->priv;
+       struct sandbox_pci_emul_priv *priv = dev->uclass->priv;
 
        priv->dev_count--;
        sandbox_set_enable_pci_map(priv->dev_count > 0);
@@ -63,5 +66,5 @@ UCLASS_DRIVER(pci_emul) = {
        .name           = "pci_emul",
        .post_probe     = sandbox_pci_emul_post_probe,
        .pre_remove     = sandbox_pci_emul_pre_remove,
-       .priv_auto_alloc_size   = sizeof(struct sandbox_pci_priv),
+       .priv_auto_alloc_size   = sizeof(struct sandbox_pci_emul_priv),
 };