diff options
Diffstat (limited to 'drivers/pci/dwc/pcie-designware-host.c')
-rw-r--r-- | drivers/pci/dwc/pcie-designware-host.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c index d29c020da082..81e2157a7cfb 100644 --- a/drivers/pci/dwc/pcie-designware-host.c +++ b/drivers/pci/dwc/pcie-designware-host.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Synopsys Designware PCIe host controller driver | 2 | * Synopsys DesignWare PCIe host controller driver |
3 | * | 3 | * |
4 | * Copyright (C) 2013 Samsung Electronics Co., Ltd. | 4 | * Copyright (C) 2013 Samsung Electronics Co., Ltd. |
5 | * http://www.samsung.com | 5 | * http://www.samsung.com |
@@ -71,9 +71,9 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) | |||
71 | while ((pos = find_next_bit((unsigned long *) &val, 32, | 71 | while ((pos = find_next_bit((unsigned long *) &val, 32, |
72 | pos)) != 32) { | 72 | pos)) != 32) { |
73 | irq = irq_find_mapping(pp->irq_domain, i * 32 + pos); | 73 | irq = irq_find_mapping(pp->irq_domain, i * 32 + pos); |
74 | generic_handle_irq(irq); | ||
74 | dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_STATUS + i * 12, | 75 | dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_STATUS + i * 12, |
75 | 4, 1 << pos); | 76 | 4, 1 << pos); |
76 | generic_handle_irq(irq); | ||
77 | pos++; | 77 | pos++; |
78 | } | 78 | } |
79 | } | 79 | } |
@@ -401,8 +401,11 @@ int dw_pcie_host_init(struct pcie_port *pp) | |||
401 | } | 401 | } |
402 | } | 402 | } |
403 | 403 | ||
404 | if (pp->ops->host_init) | 404 | if (pp->ops->host_init) { |
405 | pp->ops->host_init(pp); | 405 | ret = pp->ops->host_init(pp); |
406 | if (ret) | ||
407 | goto error; | ||
408 | } | ||
406 | 409 | ||
407 | pp->root_bus_nr = pp->busn->start; | 410 | pp->root_bus_nr = pp->busn->start; |
408 | 411 | ||
@@ -594,10 +597,12 @@ void dw_pcie_setup_rc(struct pcie_port *pp) | |||
594 | dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_1, 0x00000000); | 597 | dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_1, 0x00000000); |
595 | 598 | ||
596 | /* setup interrupt pins */ | 599 | /* setup interrupt pins */ |
600 | dw_pcie_dbi_ro_wr_en(pci); | ||
597 | val = dw_pcie_readl_dbi(pci, PCI_INTERRUPT_LINE); | 601 | val = dw_pcie_readl_dbi(pci, PCI_INTERRUPT_LINE); |
598 | val &= 0xffff00ff; | 602 | val &= 0xffff00ff; |
599 | val |= 0x00000100; | 603 | val |= 0x00000100; |
600 | dw_pcie_writel_dbi(pci, PCI_INTERRUPT_LINE, val); | 604 | dw_pcie_writel_dbi(pci, PCI_INTERRUPT_LINE, val); |
605 | dw_pcie_dbi_ro_wr_dis(pci); | ||
601 | 606 | ||
602 | /* setup bus numbers */ | 607 | /* setup bus numbers */ |
603 | val = dw_pcie_readl_dbi(pci, PCI_PRIMARY_BUS); | 608 | val = dw_pcie_readl_dbi(pci, PCI_PRIMARY_BUS); |
@@ -634,8 +639,12 @@ void dw_pcie_setup_rc(struct pcie_port *pp) | |||
634 | 639 | ||
635 | dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0); | 640 | dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0); |
636 | 641 | ||
642 | /* Enable write permission for the DBI read-only register */ | ||
643 | dw_pcie_dbi_ro_wr_en(pci); | ||
637 | /* program correct class for RC */ | 644 | /* program correct class for RC */ |
638 | dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI); | 645 | dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI); |
646 | /* Better disable write permission right after the update */ | ||
647 | dw_pcie_dbi_ro_wr_dis(pci); | ||
639 | 648 | ||
640 | dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val); | 649 | dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val); |
641 | val |= PORT_LOGIC_SPEED_CHANGE; | 650 | val |= PORT_LOGIC_SPEED_CHANGE; |