aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/dwc/pcie-designware-host.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/dwc/pcie-designware-host.c')
-rw-r--r--drivers/pci/dwc/pcie-designware-host.c17
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;