diff options
Diffstat (limited to 'drivers/pci/host/pcie-designware.c')
-rw-r--r-- | drivers/pci/host/pcie-designware.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 1eaf4df3618a..0b7b4558bcfd 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/of_pci.h> | 20 | #include <linux/of_pci.h> |
21 | #include <linux/pci.h> | 21 | #include <linux/pci.h> |
22 | #include <linux/pci_regs.h> | 22 | #include <linux/pci_regs.h> |
23 | #include <linux/platform_device.h> | ||
23 | #include <linux/types.h> | 24 | #include <linux/types.h> |
24 | 25 | ||
25 | #include "pcie-designware.h" | 26 | #include "pcie-designware.h" |
@@ -396,11 +397,23 @@ static const struct irq_domain_ops msi_domain_ops = { | |||
396 | int __init dw_pcie_host_init(struct pcie_port *pp) | 397 | int __init dw_pcie_host_init(struct pcie_port *pp) |
397 | { | 398 | { |
398 | struct device_node *np = pp->dev->of_node; | 399 | struct device_node *np = pp->dev->of_node; |
400 | struct platform_device *pdev = to_platform_device(pp->dev); | ||
399 | struct of_pci_range range; | 401 | struct of_pci_range range; |
400 | struct of_pci_range_parser parser; | 402 | struct of_pci_range_parser parser; |
403 | struct resource *cfg_res; | ||
401 | u32 val; | 404 | u32 val; |
402 | int i; | 405 | int i; |
403 | 406 | ||
407 | cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config"); | ||
408 | if (cfg_res) { | ||
409 | pp->config.cfg0_size = resource_size(cfg_res)/2; | ||
410 | pp->config.cfg1_size = resource_size(cfg_res)/2; | ||
411 | pp->cfg0_base = cfg_res->start; | ||
412 | pp->cfg1_base = cfg_res->start + pp->config.cfg0_size; | ||
413 | } else { | ||
414 | dev_err(pp->dev, "missing *config* reg space\n"); | ||
415 | } | ||
416 | |||
404 | if (of_pci_range_parser_init(&parser, np)) { | 417 | if (of_pci_range_parser_init(&parser, np)) { |
405 | dev_err(pp->dev, "missing ranges property\n"); | 418 | dev_err(pp->dev, "missing ranges property\n"); |
406 | return -EINVAL; | 419 | return -EINVAL; |
@@ -433,6 +446,8 @@ int __init dw_pcie_host_init(struct pcie_port *pp) | |||
433 | of_pci_range_to_resource(&range, np, &pp->cfg); | 446 | of_pci_range_to_resource(&range, np, &pp->cfg); |
434 | pp->config.cfg0_size = resource_size(&pp->cfg)/2; | 447 | pp->config.cfg0_size = resource_size(&pp->cfg)/2; |
435 | pp->config.cfg1_size = resource_size(&pp->cfg)/2; | 448 | pp->config.cfg1_size = resource_size(&pp->cfg)/2; |
449 | pp->cfg0_base = pp->cfg.start; | ||
450 | pp->cfg1_base = pp->cfg.start + pp->config.cfg0_size; | ||
436 | } | 451 | } |
437 | } | 452 | } |
438 | 453 | ||
@@ -445,8 +460,6 @@ int __init dw_pcie_host_init(struct pcie_port *pp) | |||
445 | } | 460 | } |
446 | } | 461 | } |
447 | 462 | ||
448 | pp->cfg0_base = pp->cfg.start; | ||
449 | pp->cfg1_base = pp->cfg.start + pp->config.cfg0_size; | ||
450 | pp->mem_base = pp->mem.start; | 463 | pp->mem_base = pp->mem.start; |
451 | 464 | ||
452 | pp->va_cfg0_base = devm_ioremap(pp->dev, pp->cfg0_base, | 465 | pp->va_cfg0_base = devm_ioremap(pp->dev, pp->cfg0_base, |