kernel/drivers/pci/controller/pcie-iproc-ecam.c

60 lines
1.2 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2018 Broadcom
*/
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/pci-acpi.h>
#include <linux/pci-ecam.h>
#include "pcie-iproc.h"
#include "../pci.h"
#if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
static int iproc_pcie_ecam_init(struct pci_config_window *cfg)
{
struct device *dev = cfg->parent;
struct iproc_pcie *pcie;
struct resource *res = &cfg->res;
struct pci_host_bridge *bridge;
int ret;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
if (!bridge)
return -ENOMEM;
pcie = pci_host_bridge_priv(bridge);
pcie->dev = dev;
pcie->type = IPROC_PCIE_PAXC_V2;
pcie->base = devm_pci_remap_cfgspace(dev, res->start,
resource_size(res));
if (!pcie->base) {
dev_err(dev, "unable to map controller registers\n");
return -ENOMEM;
}
pcie->base_addr = res->start;
cfg->priv = pcie;
ret = iproc_pcie_rev_init(pcie);
if (ret) {
dev_err(dev, "unable to initialize iProc PCIe controller\n");
return ret;
}
return 0;
}
struct pci_ecam_ops iproc_pcie_paxcv2_ecam_ops = {
.init = iproc_pcie_ecam_init,
.pci_ops = {
.map_bus = iproc_pcie_bus_map_cfg_bus,
.read = iproc_pcie_config_read32,
.write = iproc_pcie_config_write32,
}
};
#endif