diff options
author | Peter De Schrijver <pdeschrijver@nvidia.com> | 2013-04-03 10:40:37 -0400 |
---|---|---|
committer | Stephen Warren <swarren@nvidia.com> | 2013-04-04 18:10:38 -0400 |
commit | dd93587be8dc8acf23a0d8a23efc74a91d8f0dfe (patch) | |
tree | 10a49812292f09a9b5d5d33fb09cc895dfb16b32 | |
parent | dba4072a4a20b2986562cced98ce04a887614528 (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.c | 12 | ||||
-rw-r--r-- | drivers/clk/tegra/clk.h | 2 |
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 | */ |
188 | struct tegra_clk_pll { | 189 | struct 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 | ||
217 | extern const struct clk_ops tegra_clk_pll_ops; | 219 | extern const struct clk_ops tegra_clk_pll_ops; |
218 | extern const struct clk_ops tegra_clk_plle_ops; | 220 | extern const struct clk_ops tegra_clk_plle_ops; |