aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2009-02-19 08:29:22 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-02-19 12:28:30 -0500
commitc0bf31320dea2cbcbab1f53ee15a8520f762409b (patch)
tree1b4fbb4396da448eb116f2bee8b58030b63cfe3b /arch/arm/plat-omap
parent8b9dbc16d4f5786c6c930ab028722e3ed7e4285b (diff)
[ARM] omap: add support for bypassing DPLLs
This roughly corresponds with OMAP commits: 7d06c48, 3241b19, 88b5d9b, 18a5500, 9c909ac, 5c6497b, 8b1f0bd, 2ac1da8. For both OMAP2 and OMAP3, we note the reference and bypass clocks in the DPLL data structure. Whenever we modify the DPLL rate, we first ensure that both the reference and bypass clocks are enabled. Then, we decide whether to use the reference and DPLL, or the bypass clock if the desired rate is identical to the bypass rate, and program the DPLL appropriately. Finally, we update the clock's parent, and then disable the unused clocks. This keeps the parents correctly balanced, and more importantly ensures that the bypass clock is running whenever we reprogram the DPLL. This is especially important because the procedure for reprogramming the DPLL involves switching to the bypass clock. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r--arch/arm/plat-omap/include/mach/clock.h11
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/arm/plat-omap/include/mach/clock.h b/arch/arm/plat-omap/include/mach/clock.h
index 7b6f6bcbff94..073a2c5569f0 100644
--- a/arch/arm/plat-omap/include/mach/clock.h
+++ b/arch/arm/plat-omap/include/mach/clock.h
@@ -39,6 +39,10 @@ struct dpll_data {
39 void __iomem *mult_div1_reg; 39 void __iomem *mult_div1_reg;
40 u32 mult_mask; 40 u32 mult_mask;
41 u32 div1_mask; 41 u32 div1_mask;
42 struct clk *clk_bypass;
43 struct clk *clk_ref;
44 void __iomem *control_reg;
45 u32 enable_mask;
42 unsigned int rate_tolerance; 46 unsigned int rate_tolerance;
43 unsigned long last_rounded_rate; 47 unsigned long last_rounded_rate;
44 u16 last_rounded_m; 48 u16 last_rounded_m;
@@ -49,10 +53,8 @@ struct dpll_data {
49 u16 max_multiplier; 53 u16 max_multiplier;
50# if defined(CONFIG_ARCH_OMAP3) 54# if defined(CONFIG_ARCH_OMAP3)
51 u8 modes; 55 u8 modes;
52 void __iomem *control_reg;
53 void __iomem *autoidle_reg; 56 void __iomem *autoidle_reg;
54 void __iomem *idlest_reg; 57 void __iomem *idlest_reg;
55 u32 enable_mask;
56 u32 autoidle_mask; 58 u32 autoidle_mask;
57 u32 freqsel_mask; 59 u32 freqsel_mask;
58 u32 idlest_mask; 60 u32 idlest_mask;
@@ -154,9 +156,4 @@ extern const struct clkops clkops_null;
154#define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X) 156#define RATE_IN_24XX (RATE_IN_242X | RATE_IN_243X)
155 157
156 158
157/* CM_CLKSEL2_PLL.CORE_CLK_SRC options (24XX) */
158#define CORE_CLK_SRC_32K 0
159#define CORE_CLK_SRC_DPLL 1
160#define CORE_CLK_SRC_DPLL_X2 2
161
162#endif 159#endif