diff options
author | Ranjith Lohithakshan <ranjithl@ti.com> | 2010-02-24 14:05:54 -0500 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2010-02-24 14:05:54 -0500 |
commit | 419cc97d3678f0fca5e60b3853dd9c1371f67805 (patch) | |
tree | a3997e3f9ad52abf927597f8e241fb6dfb02ab00 /arch/arm/mach-omap2/clock.c | |
parent | cde08f81b1d7952ae00c4be2165da629ef985522 (diff) |
OMAP2/3 clock: Extend find_idlest() to pass back idle state value
Current implementation defines clock idle state indicators based on the
cpu information (cpu_is_omap24xx() or cpu_is_omap34xx()) in a system wide
manner. This patch extends the find_idlest() function in clkops to pass
back the idle state indicator for that clock, thus allowing idle state
indicators to be defined on a per clock basis if required.
This is specifically needed on AM35xx devices as the new IPSS clocks
indicates the idle status (0 is idle, 1 is ready) in a way just
opposite to how its handled in OMAP3 (0 is ready, 1 is idle).
Signed-off-by: Ranjith Lohithakshan <ranjithl@ti.com>
[paul@pwsan.com: updated to apply after commit 98c45457 et seq.]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Diffstat (limited to 'arch/arm/mach-omap2/clock.c')
-rw-r--r-- | arch/arm/mach-omap2/clock.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 999b91e023b1..3bb3292ec469 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -57,7 +57,7 @@ u8 cpu_mask; | |||
57 | static void _omap2_module_wait_ready(struct clk *clk) | 57 | static void _omap2_module_wait_ready(struct clk *clk) |
58 | { | 58 | { |
59 | void __iomem *companion_reg, *idlest_reg; | 59 | void __iomem *companion_reg, *idlest_reg; |
60 | u8 other_bit, idlest_bit; | 60 | u8 other_bit, idlest_bit, idlest_val; |
61 | 61 | ||
62 | /* Not all modules have multiple clocks that their IDLEST depends on */ | 62 | /* Not all modules have multiple clocks that their IDLEST depends on */ |
63 | if (clk->ops->find_companion) { | 63 | if (clk->ops->find_companion) { |
@@ -66,9 +66,10 @@ static void _omap2_module_wait_ready(struct clk *clk) | |||
66 | return; | 66 | return; |
67 | } | 67 | } |
68 | 68 | ||
69 | clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit); | 69 | clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val); |
70 | 70 | ||
71 | omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), clk->name); | 71 | omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val, |
72 | clk->name); | ||
72 | } | 73 | } |
73 | 74 | ||
74 | /* Enables clock without considering parent dependencies or use count | 75 | /* Enables clock without considering parent dependencies or use count |
@@ -175,7 +176,8 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, | |||
175 | * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk | 176 | * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk |
176 | * @clk: struct clk * to find IDLEST info for | 177 | * @clk: struct clk * to find IDLEST info for |
177 | * @idlest_reg: void __iomem ** to return the CM_IDLEST va in | 178 | * @idlest_reg: void __iomem ** to return the CM_IDLEST va in |
178 | * @idlest_bit: u8 ** to return the CM_IDLEST bit shift in | 179 | * @idlest_bit: u8 * to return the CM_IDLEST bit shift in |
180 | * @idlest_val: u8 * to return the idle status indicator | ||
179 | * | 181 | * |
180 | * Return the CM_IDLEST register address and bit shift corresponding | 182 | * Return the CM_IDLEST register address and bit shift corresponding |
181 | * to the module that "owns" this clock. This default code assumes | 183 | * to the module that "owns" this clock. This default code assumes |
@@ -185,13 +187,26 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, | |||
185 | * CM_IDLEST2). This is not true for all modules. No return value. | 187 | * CM_IDLEST2). This is not true for all modules. No return value. |
186 | */ | 188 | */ |
187 | void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, | 189 | void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, |
188 | u8 *idlest_bit) | 190 | u8 *idlest_bit, u8 *idlest_val) |
189 | { | 191 | { |
190 | u32 r; | 192 | u32 r; |
191 | 193 | ||
192 | r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); | 194 | r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); |
193 | *idlest_reg = (__force void __iomem *)r; | 195 | *idlest_reg = (__force void __iomem *)r; |
194 | *idlest_bit = clk->enable_bit; | 196 | *idlest_bit = clk->enable_bit; |
197 | |||
198 | /* | ||
199 | * 24xx uses 0 to indicate not ready, and 1 to indicate ready. | ||
200 | * 34xx reverses this, just to keep us on our toes | ||
201 | * AM35xx uses both, depending on the module. | ||
202 | */ | ||
203 | if (cpu_is_omap24xx()) | ||
204 | *idlest_val = OMAP24XX_CM_IDLEST_VAL; | ||
205 | else if (cpu_is_omap34xx()) | ||
206 | *idlest_val = OMAP34XX_CM_IDLEST_VAL; | ||
207 | else | ||
208 | BUG(); | ||
209 | |||
195 | } | 210 | } |
196 | 211 | ||
197 | int omap2_dflt_clk_enable(struct clk *clk) | 212 | int omap2_dflt_clk_enable(struct clk *clk) |