diff options
| author | Tony Truong <truong@codeaurora.org> | 2016-08-16 15:30:34 -0700 |
|---|---|---|
| committer | Tony Truong <truong@codeaurora.org> | 2016-08-17 17:48:14 -0700 |
| commit | 437464bf8da74a95ebf1079323338efc225460c3 (patch) | |
| tree | 807bce9a21a95bbd7bc74da869733764ff751a7c | |
| parent | 008f057bbab6dd6629b7e1a3b8c67b650a6b9ef1 (diff) | |
msm: pcie: config core and peripheral memory for PCIe clocks
Some PCIe clocks require PCIe bus driver to enable/disable
core and peripheral memory settings. To achieve optimal power
when the link is off, these settings should be set to disabled.
Add support to configure core and peripheral memory for PCIe
clocks.
Change-Id: I23ef75dd8bbf0f0b1c01fd30b8bae4116e106cc2
Signed-off-by: Tony Truong <truong@codeaurora.org>
| -rw-r--r-- | drivers/pci/host/pci-msm.c | 117 |
1 files changed, 75 insertions, 42 deletions
diff --git a/drivers/pci/host/pci-msm.c b/drivers/pci/host/pci-msm.c index e278aab1e530..2355ce789b4f 100644 --- a/drivers/pci/host/pci-msm.c +++ b/drivers/pci/host/pci-msm.c @@ -501,6 +501,7 @@ struct msm_pcie_clk_info_t { struct clk *hdl; char *name; u32 freq; + bool config_mem; bool required; }; @@ -710,49 +711,49 @@ static struct msm_pcie_gpio_info_t msm_pcie_gpio_info[MSM_PCIE_MAX_GPIO] = { static struct msm_pcie_clk_info_t msm_pcie_clk_info[MAX_RC_NUM][MSM_PCIE_MAX_CLK] = { { - {NULL, "pcie_0_ref_clk_src", 0, false}, - {NULL, "pcie_0_aux_clk", 1010000, true}, - {NULL, "pcie_0_cfg_ahb_clk", 0, true}, - {NULL, "pcie_0_mstr_axi_clk", 0, true}, - {NULL, "pcie_0_slv_axi_clk", 0, true}, - {NULL, "pcie_0_ldo", 0, true}, - {NULL, "pcie_0_smmu_clk", 0, false}, - {NULL, "pcie_phy_cfg_ahb_clk", 0, false}, - {NULL, "pcie_phy_aux_clk", 0, false}, - {NULL, "pcie_phy_reset", 0, false}, - {NULL, "pcie_phy_com_reset", 0, false}, - {NULL, "pcie_phy_nocsr_com_phy_reset", 0, false}, - {NULL, "pcie_0_phy_reset", 0, true} + {NULL, "pcie_0_ref_clk_src", 0, false, false}, + {NULL, "pcie_0_aux_clk", 1010000, false, true}, + {NULL, "pcie_0_cfg_ahb_clk", 0, false, true}, + {NULL, "pcie_0_mstr_axi_clk", 0, true, true}, + {NULL, "pcie_0_slv_axi_clk", 0, true, true}, + {NULL, "pcie_0_ldo", 0, false, true}, + {NULL, "pcie_0_smmu_clk", 0, false, false}, + {NULL, "pcie_phy_cfg_ahb_clk", 0, false, false}, + {NULL, "pcie_phy_aux_clk", 0, false, false}, + {NULL, "pcie_phy_reset", 0, false, false}, + {NULL, "pcie_phy_com_reset", 0, false, false}, + {NULL, "pcie_phy_nocsr_com_phy_reset", 0, false, false}, + {NULL, "pcie_0_phy_reset", 0, false, true} }, { - {NULL, "pcie_1_ref_clk_src", 0, false}, - {NULL, "pcie_1_aux_clk", 1010000, true}, - {NULL, "pcie_1_cfg_ahb_clk", 0, true}, - {NULL, "pcie_1_mstr_axi_clk", 0, true}, - {NULL, "pcie_1_slv_axi_clk", 0, true}, - {NULL, "pcie_1_ldo", 0, true}, - {NULL, "pcie_1_smmu_clk", 0, false}, - {NULL, "pcie_phy_cfg_ahb_clk", 0, false}, - {NULL, "pcie_phy_aux_clk", 0, false}, - {NULL, "pcie_phy_reset", 0, false}, - {NULL, "pcie_phy_com_reset", 0, false}, - {NULL, "pcie_phy_nocsr_com_phy_reset", 0, false}, - {NULL, "pcie_1_phy_reset", 0, true} + {NULL, "pcie_1_ref_clk_src", 0, false, false}, + {NULL, "pcie_1_aux_clk", 1010000, false, true}, + {NULL, "pcie_1_cfg_ahb_clk", 0, false, true}, + {NULL, "pcie_1_mstr_axi_clk", 0, true, true}, + {NULL, "pcie_1_slv_axi_clk", 0, true, true}, + {NULL, "pcie_1_ldo", 0, false, true}, + {NULL, "pcie_1_smmu_clk", 0, false, false}, + {NULL, "pcie_phy_cfg_ahb_clk", 0, false, false}, + {NULL, "pcie_phy_aux_clk", 0, false, false}, + {NULL, "pcie_phy_reset", 0, false, false}, + {NULL, "pcie_phy_com_reset", 0, false, false}, + {NULL, "pcie_phy_nocsr_com_phy_reset", 0, false, false}, + {NULL, "pcie_1_phy_reset", 0, false, true} }, { - {NULL, "pcie_2_ref_clk_src", 0, false}, - {NULL, "pcie_2_aux_clk", 1010000, true}, - {NULL, "pcie_2_cfg_ahb_clk", 0, true}, - {NULL, "pcie_2_mstr_axi_clk", 0, true}, - {NULL, "pcie_2_slv_axi_clk", 0, true}, - {NULL, "pcie_2_ldo", 0, true}, - {NULL, "pcie_2_smmu_clk", 0, false}, - {NULL, "pcie_phy_cfg_ahb_clk", 0, false}, - {NULL, "pcie_phy_aux_clk", 0, false}, - {NULL, "pcie_phy_reset", 0, false}, - {NULL, "pcie_phy_com_reset", 0, false}, - {NULL, "pcie_phy_nocsr_com_phy_reset", 0, false}, - {NULL, "pcie_2_phy_reset", 0, true} + {NULL, "pcie_2_ref_clk_src", 0, false, false}, + {NULL, "pcie_2_aux_clk", 1010000, false, true}, + {NULL, "pcie_2_cfg_ahb_clk", 0, false, true}, + {NULL, "pcie_2_mstr_axi_clk", 0, true, true}, + {NULL, "pcie_2_slv_axi_clk", 0, true, true}, + {NULL, "pcie_2_ldo", 0, false, true}, + {NULL, "pcie_2_smmu_clk", 0, false, false}, + {NULL, "pcie_phy_cfg_ahb_clk", 0, false, false}, + {NULL, "pcie_phy_aux_clk", 0, false, false}, + {NULL, "pcie_phy_reset", 0, false, false}, + {NULL, "pcie_phy_com_reset", 0, false, false}, + {NULL, "pcie_phy_nocsr_com_phy_reset", 0, false, false}, + {NULL, "pcie_2_phy_reset", 0, false, true} } }; @@ -760,13 +761,13 @@ static struct msm_pcie_clk_info_t static struct msm_pcie_clk_info_t msm_pcie_pipe_clk_info[MAX_RC_NUM][MSM_PCIE_MAX_PIPE_CLK] = { { - {NULL, "pcie_0_pipe_clk", 125000000, true}, + {NULL, "pcie_0_pipe_clk", 125000000, true, true}, }, { - {NULL, "pcie_1_pipe_clk", 125000000, true}, + {NULL, "pcie_1_pipe_clk", 125000000, true, true}, }, { - {NULL, "pcie_2_pipe_clk", 125000000, true}, + {NULL, "pcie_2_pipe_clk", 125000000, true, true}, } }; @@ -861,6 +862,32 @@ static inline void msm_pcie_write_reg_field(void *base, u32 offset, wmb(); } +static inline void msm_pcie_config_clock_mem(struct msm_pcie_dev_t *dev, + struct msm_pcie_clk_info_t *info) +{ + int ret; + + ret = clk_set_flags(info->hdl, CLKFLAG_NORETAIN_MEM); + if (ret) + PCIE_ERR(dev, + "PCIe: RC%d can't configure core memory for clk %s: %d.\n", + dev->rc_idx, info->name, ret); + else + PCIE_DBG2(dev, + "PCIe: RC%d configured core memory for clk %s.\n", + dev->rc_idx, info->name); + + ret = clk_set_flags(info->hdl, CLKFLAG_NORETAIN_PERIPH); + if (ret) + PCIE_ERR(dev, + "PCIe: RC%d can't configure peripheral memory for clk %s: %d.\n", + dev->rc_idx, info->name, ret); + else + PCIE_DBG2(dev, + "PCIe: RC%d configured peripheral memory for clk %s.\n", + dev->rc_idx, info->name); +} + #if defined(CONFIG_ARCH_FSM9010) #define PCIE20_PARF_PHY_STTS 0x3c #define PCIE2_PHY_RESET_CTRL 0x44 @@ -3450,6 +3477,9 @@ static int msm_pcie_clk_init(struct msm_pcie_dev_t *dev) if (i >= MSM_PCIE_MAX_CLK - (dev->common_phy ? 4 : 1)) clk_reset(info->hdl, CLK_RESET_DEASSERT); + if (info->config_mem) + msm_pcie_config_clock_mem(dev, info); + if (info->freq) { rc = clk_set_rate(info->hdl, info->freq); if (rc) { @@ -3543,6 +3573,9 @@ static int msm_pcie_pipe_clk_init(struct msm_pcie_dev_t *dev) clk_reset(info->hdl, CLK_RESET_DEASSERT); + if (info->config_mem) + msm_pcie_config_clock_mem(dev, info); + if (info->freq) { rc = clk_set_rate(info->hdl, info->freq); if (rc) { |
