|
@@ -20,6 +20,7 @@
|
|
|
#include <linux/of_pci.h>
|
|
|
#include <linux/pci.h>
|
|
|
#include <linux/pci_regs.h>
|
|
|
+#include <linux/platform_device.h>
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
#include "pcie-designware.h"
|
|
@@ -396,11 +397,23 @@ static const struct irq_domain_ops msi_domain_ops = {
|
|
|
int __init dw_pcie_host_init(struct pcie_port *pp)
|
|
|
{
|
|
|
struct device_node *np = pp->dev->of_node;
|
|
|
+ struct platform_device *pdev = to_platform_device(pp->dev);
|
|
|
struct of_pci_range range;
|
|
|
struct of_pci_range_parser parser;
|
|
|
+ struct resource *cfg_res;
|
|
|
u32 val;
|
|
|
int i;
|
|
|
|
|
|
+ cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
|
|
|
+ if (cfg_res) {
|
|
|
+ pp->config.cfg0_size = resource_size(cfg_res)/2;
|
|
|
+ pp->config.cfg1_size = resource_size(cfg_res)/2;
|
|
|
+ pp->cfg0_base = cfg_res->start;
|
|
|
+ pp->cfg1_base = cfg_res->start + pp->config.cfg0_size;
|
|
|
+ } else {
|
|
|
+ dev_err(pp->dev, "missing *config* reg space\n");
|
|
|
+ }
|
|
|
+
|
|
|
if (of_pci_range_parser_init(&parser, np)) {
|
|
|
dev_err(pp->dev, "missing ranges property\n");
|
|
|
return -EINVAL;
|
|
@@ -433,6 +446,8 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
|
|
|
of_pci_range_to_resource(&range, np, &pp->cfg);
|
|
|
pp->config.cfg0_size = resource_size(&pp->cfg)/2;
|
|
|
pp->config.cfg1_size = resource_size(&pp->cfg)/2;
|
|
|
+ pp->cfg0_base = pp->cfg.start;
|
|
|
+ pp->cfg1_base = pp->cfg.start + pp->config.cfg0_size;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -445,8 +460,6 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- pp->cfg0_base = pp->cfg.start;
|
|
|
- pp->cfg1_base = pp->cfg.start + pp->config.cfg0_size;
|
|
|
pp->mem_base = pp->mem.start;
|
|
|
|
|
|
pp->va_cfg0_base = devm_ioremap(pp->dev, pp->cfg0_base,
|