2 * OMAP3-specific clock framework functions
4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2011 Nokia Corporation
10 * Parts of this code are based on code written by
11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu,
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License version 2 as
16 * published by the Free Software Foundation.
20 #include <linux/kernel.h>
21 #include <linux/clk.h>
24 #include <plat/clock.h>
27 #include "clock34xx.h"
28 #include "cm2xxx_3xxx.h"
29 #include "cm-regbits-34xx.h"
32 * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
33 * @clk: struct clk * being enabled
34 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
35 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
36 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
38 * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift
39 * from the CM_{I,F}CLKEN bit. Pass back the correct info via
40 * @idlest_reg and @idlest_bit. No return value.
42 static void omap3430es2_clk_ssi_find_idlest(struct clk
*clk
,
43 void __iomem
**idlest_reg
,
49 r
= (((__force u32
)clk
->enable_reg
& ~0xf0) | 0x20);
50 *idlest_reg
= (__force
void __iomem
*)r
;
51 *idlest_bit
= OMAP3430ES2_ST_SSI_IDLE_SHIFT
;
52 *idlest_val
= OMAP34XX_CM_IDLEST_VAL
;
55 const struct clkops clkops_omap3430es2_ssi_wait
= {
56 .enable
= omap2_dflt_clk_enable
,
57 .disable
= omap2_dflt_clk_disable
,
58 .find_idlest
= omap3430es2_clk_ssi_find_idlest
,
59 .find_companion
= omap2_clk_dflt_find_companion
,
62 const struct clkops clkops_omap3430es2_iclk_ssi_wait
= {
63 .enable
= omap2_dflt_clk_enable
,
64 .disable
= omap2_dflt_clk_disable
,
65 .find_idlest
= omap3430es2_clk_ssi_find_idlest
,
66 .find_companion
= omap2_clk_dflt_find_companion
,
67 .allow_idle
= omap2_clkt_iclk_allow_idle
,
68 .deny_idle
= omap2_clkt_iclk_deny_idle
,
72 * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
73 * @clk: struct clk * being enabled
74 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
75 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
76 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
78 * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
79 * target IDLEST bits. For our purposes, we are concerned with the
80 * target IDLEST bits, which exist at a different bit position than
81 * the *CLKEN bit position for these modules (DSS and USBHOST) (The
82 * default find_idlest code assumes that they are at the same
83 * position.) No return value.
85 static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk
*clk
,
86 void __iomem
**idlest_reg
,
92 r
= (((__force u32
)clk
->enable_reg
& ~0xf0) | 0x20);
93 *idlest_reg
= (__force
void __iomem
*)r
;
94 /* USBHOST_IDLE has same shift */
95 *idlest_bit
= OMAP3430ES2_ST_DSS_IDLE_SHIFT
;
96 *idlest_val
= OMAP34XX_CM_IDLEST_VAL
;
99 const struct clkops clkops_omap3430es2_dss_usbhost_wait
= {
100 .enable
= omap2_dflt_clk_enable
,
101 .disable
= omap2_dflt_clk_disable
,
102 .find_idlest
= omap3430es2_clk_dss_usbhost_find_idlest
,
103 .find_companion
= omap2_clk_dflt_find_companion
,
106 const struct clkops clkops_omap3430es2_iclk_dss_usbhost_wait
= {
107 .enable
= omap2_dflt_clk_enable
,
108 .disable
= omap2_dflt_clk_disable
,
109 .find_idlest
= omap3430es2_clk_dss_usbhost_find_idlest
,
110 .find_companion
= omap2_clk_dflt_find_companion
,
111 .allow_idle
= omap2_clkt_iclk_allow_idle
,
112 .deny_idle
= omap2_clkt_iclk_deny_idle
,
116 * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
117 * @clk: struct clk * being enabled
118 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
119 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
120 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
122 * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
123 * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via
124 * @idlest_reg and @idlest_bit. No return value.
126 static void omap3430es2_clk_hsotgusb_find_idlest(struct clk
*clk
,
127 void __iomem
**idlest_reg
,
133 r
= (((__force u32
)clk
->enable_reg
& ~0xf0) | 0x20);
134 *idlest_reg
= (__force
void __iomem
*)r
;
135 *idlest_bit
= OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT
;
136 *idlest_val
= OMAP34XX_CM_IDLEST_VAL
;
139 const struct clkops clkops_omap3430es2_hsotgusb_wait
= {
140 .enable
= omap2_dflt_clk_enable
,
141 .disable
= omap2_dflt_clk_disable
,
142 .find_idlest
= omap3430es2_clk_hsotgusb_find_idlest
,
143 .find_companion
= omap2_clk_dflt_find_companion
,
146 const struct clkops clkops_omap3430es2_iclk_hsotgusb_wait
= {
147 .enable
= omap2_dflt_clk_enable
,
148 .disable
= omap2_dflt_clk_disable
,
149 .find_idlest
= omap3430es2_clk_hsotgusb_find_idlest
,
150 .find_companion
= omap2_clk_dflt_find_companion
,
151 .allow_idle
= omap2_clkt_iclk_allow_idle
,
152 .deny_idle
= omap2_clkt_iclk_deny_idle
,