diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2009-02-19 08:29:22 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-02-19 12:28:30 -0500 |
commit | c0bf31320dea2cbcbab1f53ee15a8520f762409b (patch) | |
tree | 1b4fbb4396da448eb116f2bee8b58030b63cfe3b /arch/arm/plat-omap | |
parent | 8b9dbc16d4f5786c6c930ab028722e3ed7e4285b (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.h | 11 |
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 |