#ifdef CONFIG_HAS_PCI
#include <asm/p2m.h>
+#include <xen/err.h>
#define pci_to_dev(pcidev) (&(pcidev)->arch.dev)
/* Default ECAM ops */
extern const struct pci_ecam_ops pci_generic_ecam_ops;
-int pci_host_common_probe(struct dt_device_node *dev,
- const struct pci_ecam_ops *ops);
+struct pci_host_bridge *pci_host_common_probe(struct dt_device_node *dev,
+ const struct pci_ecam_ops *ops);
int pci_generic_config_read(struct pci_host_bridge *bridge, pci_sbdf_t sbdf,
uint32_t reg, uint32_t len, uint32_t *value);
int pci_generic_config_write(struct pci_host_bridge *bridge, pci_sbdf_t sbdf,
return domain;
}
-int pci_host_common_probe(struct dt_device_node *dev,
- const struct pci_ecam_ops *ops)
+struct pci_host_bridge *pci_host_common_probe(struct dt_device_node *dev,
+ const struct pci_ecam_ops *ops)
{
struct pci_host_bridge *bridge;
struct pci_config_window *cfg;
int domain;
if ( dt_device_for_passthrough(dev) )
- return 0;
+ return NULL;
bridge = pci_alloc_host_bridge();
if ( !bridge )
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
/* Parse and map our Configuration Space windows */
cfg = gen_pci_init(dev, ops);
bridge->segment = domain;
pci_add_host_bridge(bridge);
- return 0;
+ return bridge;
err_exit:
xfree(bridge);
- return err;
+ return ERR_PTR(err);
}
/*
static int __init pci_host_generic_probe(struct dt_device_node *dev,
const void *data)
{
- return pci_host_common_probe(dev, &pci_generic_ecam_ops);
+ return PTR_RET(pci_host_common_probe(dev, &pci_generic_ecam_ops));
}
DT_DEVICE_START(pci_gen, "PCI HOST GENERIC", DEVICE_PCI_HOSTBRIDGE)
static int __init pci_host_generic_probe(struct dt_device_node *dev,
const void *data)
{
- return pci_host_common_probe(dev, &nwl_pcie_ops);
+ return PTR_RET(pci_host_common_probe(dev, &nwl_pcie_ops));
}
DT_DEVICE_START(pci_gen, "PCI HOST ZYNQMP", DEVICE_PCI_HOSTBRIDGE)