aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Huang <bilhuang@nvidia.com>2015-06-18 17:28:33 -0400
committerThierry Reding <treding@nvidia.com>2015-12-17 07:37:55 -0500
commit0ef9db6cf24dbb58118818e64198d9a030e4697e (patch)
treebb0b0cb78ca6f1c3ae91d3dded430beafbb696ef
parent17e9273a9e00a1fc8a64d6de3c7bb9e5020b1b73 (diff)
clk: tegra: pll: Add logic for SS
Add some logic for Spread Spectrum control. It is used in conjuncture with SDM fractional dividers. SSC has to be disabled when we configure the divider settings. Signed-off-by: Bill Huang <bilhuang@nvidia.com> Signed-off-by: Rhyland Klein <rklein@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/clk/tegra/clk-pll.c25
-rw-r--r--drivers/clk/tegra/clk.h4
2 files changed, 28 insertions, 1 deletions
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
index 8901004025e7..7ef08861c35d 100644
--- a/drivers/clk/tegra/clk-pll.c
+++ b/drivers/clk/tegra/clk-pll.c
@@ -658,6 +658,26 @@ static void _update_pll_cpcon(struct tegra_clk_pll *pll,
658 pll_writel_misc(val, pll); 658 pll_writel_misc(val, pll);
659} 659}
660 660
661static void pll_clk_start_ss(struct tegra_clk_pll *pll)
662{
663 if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
664 u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
665
666 val |= pll->params->ssc_ctrl_en_mask;
667 pll_writel(val, pll->params->ssc_ctrl_reg, pll);
668 }
669}
670
671static void pll_clk_stop_ss(struct tegra_clk_pll *pll)
672{
673 if (pll->params->defaults_set && pll->params->ssc_ctrl_reg) {
674 u32 val = pll_readl(pll->params->ssc_ctrl_reg, pll);
675
676 val &= ~pll->params->ssc_ctrl_en_mask;
677 pll_writel(val, pll->params->ssc_ctrl_reg, pll);
678 }
679}
680
661static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg, 681static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
662 unsigned long rate) 682 unsigned long rate)
663{ 683{
@@ -676,8 +696,10 @@ static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
676 return 0; 696 return 0;
677 } 697 }
678 698
679 if (state) 699 if (state) {
700 pll_clk_stop_ss(pll);
680 _clk_pll_disable(hw); 701 _clk_pll_disable(hw);
702 }
681 703
682 if (!pll->params->defaults_set && pll->params->set_defaults) 704 if (!pll->params->defaults_set && pll->params->set_defaults)
683 pll->params->set_defaults(pll); 705 pll->params->set_defaults(pll);
@@ -690,6 +712,7 @@ static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
690 if (state) { 712 if (state) {
691 _clk_pll_enable(hw); 713 _clk_pll_enable(hw);
692 ret = clk_pll_wait_for_lock(pll); 714 ret = clk_pll_wait_for_lock(pll);
715 pll_clk_start_ss(pll);
693 } 716 }
694 717
695 return ret; 718 return ret;
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index 8dac213fa672..4883507c59dc 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -184,6 +184,8 @@ struct tegra_clk_pll;
184 * @sdm_din_mask: Mask of SDM divider bits 184 * @sdm_din_mask: Mask of SDM divider bits
185 * @sdm_ctrl_reg: Register offset where SDM enable is 185 * @sdm_ctrl_reg: Register offset where SDM enable is
186 * @sdm_ctrl_en_mask: Mask of SDM enable bit 186 * @sdm_ctrl_en_mask: Mask of SDM enable bit
187 * @ssc_ctrl_reg: Register offset where SSC settings are
188 * @ssc_ctrl_en_mask: Mask of SSC enable bit
187 * @aux_reg: AUX register offset 189 * @aux_reg: AUX register offset
188 * @dyn_ramp_reg: Dynamic ramp control register offset 190 * @dyn_ramp_reg: Dynamic ramp control register offset
189 * @ext_misc_reg: Miscellaneous control register offsets 191 * @ext_misc_reg: Miscellaneous control register offsets
@@ -262,6 +264,8 @@ struct tegra_clk_pll_params {
262 u32 sdm_din_mask; 264 u32 sdm_din_mask;
263 u32 sdm_ctrl_reg; 265 u32 sdm_ctrl_reg;
264 u32 sdm_ctrl_en_mask; 266 u32 sdm_ctrl_en_mask;
267 u32 ssc_ctrl_reg;
268 u32 ssc_ctrl_en_mask;
265 u32 aux_reg; 269 u32 aux_reg;
266 u32 dyn_ramp_reg; 270 u32 dyn_ramp_reg;
267 u32 ext_misc_reg[MAX_PLL_MISC_REG_COUNT]; 271 u32 ext_misc_reg[MAX_PLL_MISC_REG_COUNT];