Commit 0d414268 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Bjorn Helgaas

PCI: thunder-pem: Factor out resource lookup

Pull the register resource lookup out of thunder_pem_init() so we can
easily add a corresponding lookup using ACPI.  No functional change
intended.
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 5f00f1a0
...@@ -284,35 +284,16 @@ static int thunder_pem_config_write(struct pci_bus *bus, unsigned int devfn, ...@@ -284,35 +284,16 @@ static int thunder_pem_config_write(struct pci_bus *bus, unsigned int devfn,
return pci_generic_config_write(bus, devfn, where, size, val); return pci_generic_config_write(bus, devfn, where, size, val);
} }
static int thunder_pem_init(struct pci_config_window *cfg) static int thunder_pem_init(struct device *dev, struct pci_config_window *cfg,
struct resource *res_pem)
{ {
struct device *dev = cfg->parent;
resource_size_t bar4_start;
struct resource *res_pem;
struct thunder_pem_pci *pem_pci; struct thunder_pem_pci *pem_pci;
struct platform_device *pdev; resource_size_t bar4_start;
/* Only OF support for now */
if (!dev->of_node)
return -EINVAL;
pem_pci = devm_kzalloc(dev, sizeof(*pem_pci), GFP_KERNEL); pem_pci = devm_kzalloc(dev, sizeof(*pem_pci), GFP_KERNEL);
if (!pem_pci) if (!pem_pci)
return -ENOMEM; return -ENOMEM;
pdev = to_platform_device(dev);
/*
* The second register range is the PEM bridge to the PCIe
* bus. It has a different config access method than those
* devices behind the bridge.
*/
res_pem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (!res_pem) {
dev_err(dev, "missing \"reg[1]\"property\n");
return -EINVAL;
}
pem_pci->pem_reg_base = devm_ioremap(dev, res_pem->start, 0x10000); pem_pci->pem_reg_base = devm_ioremap(dev, res_pem->start, 0x10000);
if (!pem_pci->pem_reg_base) if (!pem_pci->pem_reg_base)
return -ENOMEM; return -ENOMEM;
...@@ -332,9 +313,32 @@ static int thunder_pem_init(struct pci_config_window *cfg) ...@@ -332,9 +313,32 @@ static int thunder_pem_init(struct pci_config_window *cfg)
return 0; return 0;
} }
static int thunder_pem_platform_init(struct pci_config_window *cfg)
{
struct device *dev = cfg->parent;
struct platform_device *pdev = to_platform_device(dev);
struct resource *res_pem;
if (!dev->of_node)
return -EINVAL;
/*
* The second register range is the PEM bridge to the PCIe
* bus. It has a different config access method than those
* devices behind the bridge.
*/
res_pem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (!res_pem) {
dev_err(dev, "missing \"reg[1]\"property\n");
return -EINVAL;
}
return thunder_pem_init(dev, cfg, res_pem);
}
static struct pci_ecam_ops pci_thunder_pem_ops = { static struct pci_ecam_ops pci_thunder_pem_ops = {
.bus_shift = 24, .bus_shift = 24,
.init = thunder_pem_init, .init = thunder_pem_platform_init,
.pci_ops = { .pci_ops = {
.map_bus = pci_ecam_map_bus, .map_bus = pci_ecam_map_bus,
.read = thunder_pem_config_read, .read = thunder_pem_config_read,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment