Merge "msm: ep_pcie: init the MMIO before link training"
diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_com.h b/drivers/platform/msm/ep_pcie/ep_pcie_com.h
index 00ca8dc4..33e0314 100644
--- a/drivers/platform/msm/ep_pcie/ep_pcie_com.h
+++ b/drivers/platform/msm/ep_pcie/ep_pcie_com.h
@@ -120,6 +120,12 @@
#define PCIE20_MHICFG 0x110
#define PCIE20_BHI_EXECENV 0x228
+#define PCIE20_MHIVER 0x108
+#define PCIE20_MHICTRL 0x138
+#define PCIE20_MHISTATUS 0x148
+#define PCIE20_BHI_VERSION_LOWER 0x200
+#define PCIE20_BHI_VERSION_UPPER 0x204
+#define PCIE20_BHI_INTVEC 0x220
#define PCIE20_AUX_CLK_FREQ_REG 0xB40
diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_core.c b/drivers/platform/msm/ep_pcie/ep_pcie_core.c
index 055f026..db6f689 100644
--- a/drivers/platform/msm/ep_pcie/ep_pcie_core.c
+++ b/drivers/platform/msm/ep_pcie/ep_pcie_core.c
@@ -497,6 +497,22 @@
ep_pcie_write_mask(dev->dm_core + PCIE20_MISC_CONTROL_1, BIT(0), 0);
}
+static void ep_pcie_config_mmio(struct ep_pcie_dev_t *dev)
+{
+ EP_PCIE_DBG(dev,
+ "Initial version of MMIO is:0x%x\n",
+ readl_relaxed(dev->mmio + PCIE20_MHIVER));
+
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHICFG, 0x02800880);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_EXECENV, 0x2);
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHICTRL, 0x0);
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHISTATUS, 0x0);
+ ep_pcie_write_reg(dev->mmio, PCIE20_MHIVER, 0x1000000);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_VERSION_LOWER, 0x2);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_VERSION_UPPER, 0x1);
+ ep_pcie_write_reg(dev->mmio, PCIE20_BHI_INTVEC, 0xffffffff);
+}
+
static void ep_pcie_core_init(struct ep_pcie_dev_t *dev, bool configured)
{
EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev);
@@ -667,9 +683,6 @@
/* Configure BARs */
ep_pcie_bar_init(dev);
-
- ep_pcie_write_reg(dev->mmio, PCIE20_MHICFG, 0x02800880);
- ep_pcie_write_reg(dev->mmio, PCIE20_BHI_EXECENV, 0x2);
}
/* Configure IRQ events */
@@ -690,6 +703,16 @@
dev->rev,
readl_relaxed(dev->parf + PCIE20_PARF_INT_ALL_MASK));
}
+
+ if (dev->active_config) {
+ ep_pcie_write_reg(dev->dm_core, PCIE20_AUX_CLK_FREQ_REG, 0x14);
+
+ EP_PCIE_DBG2(dev, "PCIe V%d: Enable L1.\n", dev->rev);
+ ep_pcie_write_mask(dev->parf + PCIE20_PARF_PM_CTRL, BIT(5), 0);
+ }
+
+ /* Configure MMIO */
+ ep_pcie_config_mmio(dev);
}
static void ep_pcie_config_inbound_iatu(struct ep_pcie_dev_t *dev)