aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter De Schrijver <pdeschrijver@nvidia.com>2013-04-03 10:40:37 -0400
committerStephen Warren <swarren@nvidia.com>2013-04-04 18:10:38 -0400
commitdd93587be8dc8acf23a0d8a23efc74a91d8f0dfe (patch)
tree10a49812292f09a9b5d5d33fb09cc895dfb16b32
parentdba4072a4a20b2986562cced98ce04a887614528 (diff)
clk: tegra: Add TEGRA_PLL_BYPASS flag
Not all PLLs in Tegra114 have a bypass bit. Adapt the common code to only use this bit when available. Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com> Acked-by: Mike Turquette <mturquette@linaro.org> Signed-off-by: Stephen Warren <swarren@nvidia.com>
-rw-r--r--drivers/clk/tegra/clk-pll.c12
-rw-r--r--drivers/clk/tegra/clk.h2
2 files changed, 10 insertions, 4 deletions
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
index 3feefb15e473..4ee6d03bc575 100644
--- a/drivers/clk/tegra/clk-pll.c
+++ b/drivers/clk/tegra/clk-pll.c
@@ -171,7 +171,8 @@ static void _clk_pll_enable(struct clk_hw *hw)
171 clk_pll_enable_lock(pll); 171 clk_pll_enable_lock(pll);
172 172
173 val = pll_readl_base(pll); 173 val = pll_readl_base(pll);
174 val &= ~PLL_BASE_BYPASS; 174 if (pll->flags & TEGRA_PLL_BYPASS)
175 val &= ~PLL_BASE_BYPASS;
175 val |= PLL_BASE_ENABLE; 176 val |= PLL_BASE_ENABLE;
176 pll_writel_base(val, pll); 177 pll_writel_base(val, pll);
177 178
@@ -188,7 +189,9 @@ static void _clk_pll_disable(struct clk_hw *hw)
188 u32 val; 189 u32 val;
189 190
190 val = pll_readl_base(pll); 191 val = pll_readl_base(pll);
191 val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE); 192 if (pll->flags & TEGRA_PLL_BYPASS)
193 val &= ~PLL_BASE_BYPASS;
194 val &= ~PLL_BASE_ENABLE;
192 pll_writel_base(val, pll); 195 pll_writel_base(val, pll);
193 196
194 if (pll->flags & TEGRA_PLLM) { 197 if (pll->flags & TEGRA_PLLM) {
@@ -459,7 +462,7 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
459 462
460 val = pll_readl_base(pll); 463 val = pll_readl_base(pll);
461 464
462 if (val & PLL_BASE_BYPASS) 465 if ((pll->flags & TEGRA_PLL_BYPASS) && (val & PLL_BASE_BYPASS))
463 return parent_rate; 466 return parent_rate;
464 467
465 if ((pll->flags & TEGRA_PLL_FIXED) && !(val & PLL_BASE_OVERRIDE)) { 468 if ((pll->flags & TEGRA_PLL_FIXED) && !(val & PLL_BASE_OVERRIDE)) {
@@ -671,6 +674,7 @@ struct clk *tegra_clk_register_pll(const char *name, const char *parent_name,
671 struct tegra_clk_pll *pll; 674 struct tegra_clk_pll *pll;
672 struct clk *clk; 675 struct clk *clk;
673 676
677 pll_flags |= TEGRA_PLL_BYPASS;
674 pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 678 pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags,
675 freq_table, lock); 679 freq_table, lock);
676 if (IS_ERR(pll)) 680 if (IS_ERR(pll))
@@ -692,8 +696,8 @@ struct clk *tegra_clk_register_plle(const char *name, const char *parent_name,
692{ 696{
693 struct tegra_clk_pll *pll; 697 struct tegra_clk_pll *pll;
694 struct clk *clk; 698 struct clk *clk;
695 pll_flags |= TEGRA_PLL_LOCK_MISC;
696 699
700 pll_flags |= TEGRA_PLL_LOCK_MISC | TEGRA_PLL_BYPASS;
697 pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags, 701 pll = _tegra_init_pll(clk_base, pmc, fixed_rate, pll_params, pll_flags,
698 freq_table, lock); 702 freq_table, lock);
699 if (IS_ERR(pll)) 703 if (IS_ERR(pll))
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index b9691ddcbd9b..fff520ae72fc 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -184,6 +184,7 @@ struct tegra_clk_pll_params {
184 * TEGRA_PLLE_CONFIGURE - Configure PLLE when enabling. 184 * TEGRA_PLLE_CONFIGURE - Configure PLLE when enabling.
185 * TEGRA_PLL_LOCK_MISC - Lock bit is in the misc register instead of the 185 * TEGRA_PLL_LOCK_MISC - Lock bit is in the misc register instead of the
186 * base register. 186 * base register.
187 * TEGRA_PLL_BYPASS - PLL has bypass bit
187 */ 188 */
188struct tegra_clk_pll { 189struct tegra_clk_pll {
189 struct clk_hw hw; 190 struct clk_hw hw;
@@ -213,6 +214,7 @@ struct tegra_clk_pll {
213#define TEGRA_PLL_FIXED BIT(6) 214#define TEGRA_PLL_FIXED BIT(6)
214#define TEGRA_PLLE_CONFIGURE BIT(7) 215#define TEGRA_PLLE_CONFIGURE BIT(7)
215#define TEGRA_PLL_LOCK_MISC BIT(8) 216#define TEGRA_PLL_LOCK_MISC BIT(8)
217#define TEGRA_PLL_BYPASS BIT(9)
216 218
217extern const struct clk_ops tegra_clk_pll_ops; 219extern const struct clk_ops tegra_clk_pll_ops;
218extern const struct clk_ops tegra_clk_plle_ops; 220extern const struct clk_ops tegra_clk_plle_ops;