2 * OMAP3-specific clock framework functions
4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2010 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
,
63 * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
64 * @clk: struct clk * being enabled
65 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
66 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
67 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
69 * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
70 * target IDLEST bits. For our purposes, we are concerned with the
71 * target IDLEST bits, which exist at a different bit position than
72 * the *CLKEN bit position for these modules (DSS and USBHOST) (The
73 * default find_idlest code assumes that they are at the same
74 * position.) No return value.
76 static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk
*clk
,
77 void __iomem
**idlest_reg
,
83 r
= (((__force u32
)clk
->enable_reg
& ~0xf0) | 0x20);
84 *idlest_reg
= (__force
void __iomem
*)r
;
85 /* USBHOST_IDLE has same shift */
86 *idlest_bit
= OMAP3430ES2_ST_DSS_IDLE_SHIFT
;
87 *idlest_val
= OMAP34XX_CM_IDLEST_VAL
;
90 const struct clkops clkops_omap3430es2_dss_usbhost_wait
= {
91 .enable
= omap2_dflt_clk_enable
,
92 .disable
= omap2_dflt_clk_disable
,
93 .find_idlest
= omap3430es2_clk_dss_usbhost_find_idlest
,
94 .find_companion
= omap2_clk_dflt_find_companion
,
98 * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
99 * @clk: struct clk * being enabled
100 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
101 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
102 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
104 * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
105 * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via
106 * @idlest_reg and @idlest_bit. No return value.
108 static void omap3430es2_clk_hsotgusb_find_idlest(struct clk
*clk
,
109 void __iomem
**idlest_reg
,
115 r
= (((__force u32
)clk
->enable_reg
& ~0xf0) | 0x20);
116 *idlest_reg
= (__force
void __iomem
*)r
;
117 *idlest_bit
= OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT
;
118 *idlest_val
= OMAP34XX_CM_IDLEST_VAL
;
121 const struct clkops clkops_omap3430es2_hsotgusb_wait
= {
122 .enable
= omap2_dflt_clk_enable
,
123 .disable
= omap2_dflt_clk_disable
,
124 .find_idlest
= omap3430es2_clk_hsotgusb_find_idlest
,
125 .find_companion
= omap2_clk_dflt_find_companion
,