Merge branch 'omap/headers4' into next/drivers
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-omap2 / clock34xx.c
1 /*
2  * OMAP3-specific clock framework functions
3  *
4  * Copyright (C) 2007-2008 Texas Instruments, Inc.
5  * Copyright (C) 2007-2011 Nokia Corporation
6  *
7  * Paul Walmsley
8  * Jouni Högander
9  *
10  * Parts of this code are based on code written by
11  * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu,
12  * Russell King
13  *
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.
17  */
18 #undef DEBUG
19
20 #include <linux/kernel.h>
21 #include <linux/clk.h>
22 #include <linux/io.h>
23
24 #include "clock.h"
25 #include "clock34xx.h"
26 #include "cm2xxx_3xxx.h"
27 #include "cm-regbits-34xx.h"
28
29 /**
30  * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
31  * @clk: struct clk * being enabled
32  * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
33  * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
34  * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
35  *
36  * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift
37  * from the CM_{I,F}CLKEN bit.  Pass back the correct info via
38  * @idlest_reg and @idlest_bit.  No return value.
39  */
40 static void omap3430es2_clk_ssi_find_idlest(struct clk *clk,
41                                             void __iomem **idlest_reg,
42                                             u8 *idlest_bit,
43                                             u8 *idlest_val)
44 {
45         u32 r;
46
47         r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
48         *idlest_reg = (__force void __iomem *)r;
49         *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT;
50         *idlest_val = OMAP34XX_CM_IDLEST_VAL;
51 }
52
53 const struct clkops clkops_omap3430es2_ssi_wait = {
54         .enable         = omap2_dflt_clk_enable,
55         .disable        = omap2_dflt_clk_disable,
56         .find_idlest    = omap3430es2_clk_ssi_find_idlest,
57         .find_companion = omap2_clk_dflt_find_companion,
58 };
59
60 const struct clkops clkops_omap3430es2_iclk_ssi_wait = {
61         .enable         = omap2_dflt_clk_enable,
62         .disable        = omap2_dflt_clk_disable,
63         .find_idlest    = omap3430es2_clk_ssi_find_idlest,
64         .find_companion = omap2_clk_dflt_find_companion,
65         .allow_idle     = omap2_clkt_iclk_allow_idle,
66         .deny_idle      = omap2_clkt_iclk_deny_idle,
67 };
68
69 /**
70  * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
71  * @clk: struct clk * being enabled
72  * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
73  * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
74  * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
75  *
76  * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
77  * target IDLEST bits.  For our purposes, we are concerned with the
78  * target IDLEST bits, which exist at a different bit position than
79  * the *CLKEN bit position for these modules (DSS and USBHOST) (The
80  * default find_idlest code assumes that they are at the same
81  * position.)  No return value.
82  */
83 static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk,
84                                                     void __iomem **idlest_reg,
85                                                     u8 *idlest_bit,
86                                                     u8 *idlest_val)
87 {
88         u32 r;
89
90         r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
91         *idlest_reg = (__force void __iomem *)r;
92         /* USBHOST_IDLE has same shift */
93         *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT;
94         *idlest_val = OMAP34XX_CM_IDLEST_VAL;
95 }
96
97 const struct clkops clkops_omap3430es2_dss_usbhost_wait = {
98         .enable         = omap2_dflt_clk_enable,
99         .disable        = omap2_dflt_clk_disable,
100         .find_idlest    = omap3430es2_clk_dss_usbhost_find_idlest,
101         .find_companion = omap2_clk_dflt_find_companion,
102 };
103
104 const struct clkops clkops_omap3430es2_iclk_dss_usbhost_wait = {
105         .enable         = omap2_dflt_clk_enable,
106         .disable        = omap2_dflt_clk_disable,
107         .find_idlest    = omap3430es2_clk_dss_usbhost_find_idlest,
108         .find_companion = omap2_clk_dflt_find_companion,
109         .allow_idle     = omap2_clkt_iclk_allow_idle,
110         .deny_idle      = omap2_clkt_iclk_deny_idle,
111 };
112
113 /**
114  * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
115  * @clk: struct clk * being enabled
116  * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
117  * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
118  * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
119  *
120  * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
121  * shift from the CM_{I,F}CLKEN bit.  Pass back the correct info via
122  * @idlest_reg and @idlest_bit.  No return value.
123  */
124 static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk,
125                                                  void __iomem **idlest_reg,
126                                                  u8 *idlest_bit,
127                                                  u8 *idlest_val)
128 {
129         u32 r;
130
131         r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
132         *idlest_reg = (__force void __iomem *)r;
133         *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT;
134         *idlest_val = OMAP34XX_CM_IDLEST_VAL;
135 }
136
137 const struct clkops clkops_omap3430es2_hsotgusb_wait = {
138         .enable         = omap2_dflt_clk_enable,
139         .disable        = omap2_dflt_clk_disable,
140         .find_idlest    = omap3430es2_clk_hsotgusb_find_idlest,
141         .find_companion = omap2_clk_dflt_find_companion,
142 };
143
144 const struct clkops clkops_omap3430es2_iclk_hsotgusb_wait = {
145         .enable         = omap2_dflt_clk_enable,
146         .disable        = omap2_dflt_clk_disable,
147         .find_idlest    = omap3430es2_clk_hsotgusb_find_idlest,
148         .find_companion = omap2_clk_dflt_find_companion,
149         .allow_idle     = omap2_clkt_iclk_allow_idle,
150         .deny_idle      = omap2_clkt_iclk_deny_idle,
151 };