blob: 7ee131202625e5802b0bb1498fdf08e693b7bbf3 [file] [log] [blame]
Paul Walmsleyb045d082008-03-18 11:24:28 +02001/*
2 * OMAP3 clock framework
3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2008 Nokia Corporation
6 *
7 * Written by Paul Walmsley
Paul Walmsley542313c2008-07-03 12:24:45 +03008 * With many device clock fixes by Kevin Hilman and Jouni Högander
9 * DPLL bypass clock support added by Roman Tereshonkov
10 *
11 */
12
13/*
14 * Virtual clocks are introduced as convenient tools.
15 * They are sources for other clocks and not supposed
16 * to be requested from drivers directly.
Paul Walmsleyb045d082008-03-18 11:24:28 +020017 */
18
19#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H
20#define __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H
21
Russell Kinga09e64f2008-08-05 16:14:15 +010022#include <mach/control.h>
Paul Walmsleyb045d082008-03-18 11:24:28 +020023
24#include "clock.h"
25#include "cm.h"
26#include "cm-regbits-34xx.h"
27#include "prm.h"
28#include "prm-regbits-34xx.h"
29
30static void omap3_dpll_recalc(struct clk *clk);
31static void omap3_clkoutx2_recalc(struct clk *clk);
Paul Walmsley542313c2008-07-03 12:24:45 +030032static void omap3_dpll_allow_idle(struct clk *clk);
33static void omap3_dpll_deny_idle(struct clk *clk);
34static u32 omap3_dpll_autoidle_read(struct clk *clk);
Paul Walmsley16c90f02009-01-27 19:12:47 -070035static int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate);
36static int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate);
Paul Walmsleyb045d082008-03-18 11:24:28 +020037
Paul Walmsley88b8ba92008-07-03 12:24:46 +030038/* Maximum DPLL multiplier, divider values for OMAP3 */
39#define OMAP3_MAX_DPLL_MULT 2048
40#define OMAP3_MAX_DPLL_DIV 128
41
Paul Walmsleyb045d082008-03-18 11:24:28 +020042/*
43 * DPLL1 supplies clock to the MPU.
44 * DPLL2 supplies clock to the IVA2.
45 * DPLL3 supplies CORE domain clocks.
46 * DPLL4 supplies peripheral clocks.
47 * DPLL5 supplies other peripheral clocks (USBHOST, USIM).
48 */
49
Paul Walmsley542313c2008-07-03 12:24:45 +030050/* CM_CLKEN_PLL*.EN* bit values - not all are available for every DPLL */
51#define DPLL_LOW_POWER_STOP 0x1
52#define DPLL_LOW_POWER_BYPASS 0x5
53#define DPLL_LOCKED 0x7
54
Paul Walmsleyb045d082008-03-18 11:24:28 +020055/* PRM CLOCKS */
56
57/* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */
58static struct clk omap_32k_fck = {
59 .name = "omap_32k_fck",
Russell King897dcde2008-11-04 16:35:03 +000060 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +020061 .rate = 32768,
Russell King44dc9d02009-01-19 15:51:11 +000062 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +020063};
64
65static struct clk secure_32k_fck = {
66 .name = "secure_32k_fck",
Russell King897dcde2008-11-04 16:35:03 +000067 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +020068 .rate = 32768,
Russell King44dc9d02009-01-19 15:51:11 +000069 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +020070};
71
72/* Virtual source clocks for osc_sys_ck */
73static struct clk virt_12m_ck = {
74 .name = "virt_12m_ck",
Russell King897dcde2008-11-04 16:35:03 +000075 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +020076 .rate = 12000000,
Russell King44dc9d02009-01-19 15:51:11 +000077 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +020078};
79
80static struct clk virt_13m_ck = {
81 .name = "virt_13m_ck",
Russell King897dcde2008-11-04 16:35:03 +000082 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +020083 .rate = 13000000,
Russell King44dc9d02009-01-19 15:51:11 +000084 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +020085};
86
87static struct clk virt_16_8m_ck = {
88 .name = "virt_16_8m_ck",
Russell King897dcde2008-11-04 16:35:03 +000089 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +020090 .rate = 16800000,
Russell King44dc9d02009-01-19 15:51:11 +000091 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +020092};
93
94static struct clk virt_19_2m_ck = {
95 .name = "virt_19_2m_ck",
Russell King897dcde2008-11-04 16:35:03 +000096 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +020097 .rate = 19200000,
Russell King44dc9d02009-01-19 15:51:11 +000098 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +020099};
100
101static struct clk virt_26m_ck = {
102 .name = "virt_26m_ck",
Russell King897dcde2008-11-04 16:35:03 +0000103 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200104 .rate = 26000000,
Russell King44dc9d02009-01-19 15:51:11 +0000105 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200106};
107
108static struct clk virt_38_4m_ck = {
109 .name = "virt_38_4m_ck",
Russell King897dcde2008-11-04 16:35:03 +0000110 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200111 .rate = 38400000,
Russell King44dc9d02009-01-19 15:51:11 +0000112 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200113};
114
115static const struct clksel_rate osc_sys_12m_rates[] = {
116 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
117 { .div = 0 }
118};
119
120static const struct clksel_rate osc_sys_13m_rates[] = {
121 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
122 { .div = 0 }
123};
124
125static const struct clksel_rate osc_sys_16_8m_rates[] = {
126 { .div = 1, .val = 5, .flags = RATE_IN_3430ES2 | DEFAULT_RATE },
127 { .div = 0 }
128};
129
130static const struct clksel_rate osc_sys_19_2m_rates[] = {
131 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
132 { .div = 0 }
133};
134
135static const struct clksel_rate osc_sys_26m_rates[] = {
136 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
137 { .div = 0 }
138};
139
140static const struct clksel_rate osc_sys_38_4m_rates[] = {
141 { .div = 1, .val = 4, .flags = RATE_IN_343X | DEFAULT_RATE },
142 { .div = 0 }
143};
144
145static const struct clksel osc_sys_clksel[] = {
146 { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates },
147 { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates },
148 { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates },
149 { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates },
150 { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates },
151 { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates },
152 { .parent = NULL },
153};
154
155/* Oscillator clock */
156/* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */
157static struct clk osc_sys_ck = {
158 .name = "osc_sys_ck",
Russell King897dcde2008-11-04 16:35:03 +0000159 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200160 .init = &omap2_init_clksel_parent,
161 .clksel_reg = OMAP3430_PRM_CLKSEL,
162 .clksel_mask = OMAP3430_SYS_CLKIN_SEL_MASK,
163 .clksel = osc_sys_clksel,
164 /* REVISIT: deal with autoextclkmode? */
Russell King44dc9d02009-01-19 15:51:11 +0000165 .flags = RATE_FIXED | RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200166 .recalc = &omap2_clksel_recalc,
167};
168
169static const struct clksel_rate div2_rates[] = {
170 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
171 { .div = 2, .val = 2, .flags = RATE_IN_343X },
172 { .div = 0 }
173};
174
175static const struct clksel sys_clksel[] = {
176 { .parent = &osc_sys_ck, .rates = div2_rates },
177 { .parent = NULL }
178};
179
180/* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */
181/* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */
182static struct clk sys_ck = {
183 .name = "sys_ck",
Russell King897dcde2008-11-04 16:35:03 +0000184 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200185 .parent = &osc_sys_ck,
186 .init = &omap2_init_clksel_parent,
187 .clksel_reg = OMAP3430_PRM_CLKSRC_CTRL,
188 .clksel_mask = OMAP_SYSCLKDIV_MASK,
189 .clksel = sys_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000190 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200191 .recalc = &omap2_clksel_recalc,
192};
193
194static struct clk sys_altclk = {
195 .name = "sys_altclk",
Russell King897dcde2008-11-04 16:35:03 +0000196 .ops = &clkops_null,
Russell King44dc9d02009-01-19 15:51:11 +0000197 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200198};
199
200/* Optional external clock input for some McBSPs */
201static struct clk mcbsp_clks = {
202 .name = "mcbsp_clks",
Russell King897dcde2008-11-04 16:35:03 +0000203 .ops = &clkops_null,
Russell King44dc9d02009-01-19 15:51:11 +0000204 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200205};
206
207/* PRM EXTERNAL CLOCK OUTPUT */
208
209static struct clk sys_clkout1 = {
210 .name = "sys_clkout1",
Russell Kingc1168dc2008-11-04 21:24:00 +0000211 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200212 .parent = &osc_sys_ck,
213 .enable_reg = OMAP3430_PRM_CLKOUT_CTRL,
214 .enable_bit = OMAP3430_CLKOUT_EN_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200215 .recalc = &followparent_recalc,
216};
217
218/* DPLLS */
219
220/* CM CLOCKS */
221
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200222static const struct clksel_rate dpll_bypass_rates[] = {
223 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
224 { .div = 0 }
Paul Walmsleyb045d082008-03-18 11:24:28 +0200225};
226
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200227static const struct clksel_rate dpll_locked_rates[] = {
228 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
229 { .div = 0 }
Paul Walmsleyb045d082008-03-18 11:24:28 +0200230};
231
232static const struct clksel_rate div16_dpll_rates[] = {
233 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
234 { .div = 2, .val = 2, .flags = RATE_IN_343X },
235 { .div = 3, .val = 3, .flags = RATE_IN_343X },
236 { .div = 4, .val = 4, .flags = RATE_IN_343X },
237 { .div = 5, .val = 5, .flags = RATE_IN_343X },
238 { .div = 6, .val = 6, .flags = RATE_IN_343X },
239 { .div = 7, .val = 7, .flags = RATE_IN_343X },
240 { .div = 8, .val = 8, .flags = RATE_IN_343X },
241 { .div = 9, .val = 9, .flags = RATE_IN_343X },
242 { .div = 10, .val = 10, .flags = RATE_IN_343X },
243 { .div = 11, .val = 11, .flags = RATE_IN_343X },
244 { .div = 12, .val = 12, .flags = RATE_IN_343X },
245 { .div = 13, .val = 13, .flags = RATE_IN_343X },
246 { .div = 14, .val = 14, .flags = RATE_IN_343X },
247 { .div = 15, .val = 15, .flags = RATE_IN_343X },
248 { .div = 16, .val = 16, .flags = RATE_IN_343X },
249 { .div = 0 }
250};
251
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200252/* DPLL1 */
253/* MPU clock source */
254/* Type: DPLL */
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300255static struct dpll_data dpll1_dd = {
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200256 .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
257 .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK,
258 .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700259 .freqsel_mask = OMAP3430_MPU_DPLL_FREQSEL_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200260 .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL),
261 .enable_mask = OMAP3430_EN_MPU_DPLL_MASK,
Paul Walmsley542313c2008-07-03 12:24:45 +0300262 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200263 .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT,
264 .recal_en_bit = OMAP3430_MPU_DPLL_RECAL_EN_SHIFT,
265 .recal_st_bit = OMAP3430_MPU_DPLL_ST_SHIFT,
Paul Walmsley542313c2008-07-03 12:24:45 +0300266 .autoidle_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL),
267 .autoidle_mask = OMAP3430_AUTO_MPU_DPLL_MASK,
268 .idlest_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
Paul Walmsleyc1bd7aa2009-01-28 12:08:17 -0700269 .idlest_mask = OMAP3430_ST_MPU_CLK_MASK,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300270 .max_multiplier = OMAP3_MAX_DPLL_MULT,
271 .max_divider = OMAP3_MAX_DPLL_DIV,
272 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200273};
274
275static struct clk dpll1_ck = {
276 .name = "dpll1_ck",
Russell King897dcde2008-11-04 16:35:03 +0000277 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200278 .parent = &sys_ck,
279 .dpll_data = &dpll1_dd,
Russell King44dc9d02009-01-19 15:51:11 +0000280 .flags = RATE_PROPAGATES,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300281 .round_rate = &omap2_dpll_round_rate,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700282 .set_rate = &omap3_noncore_dpll_set_rate,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700283 .clkdm_name = "dpll1_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200284 .recalc = &omap3_dpll_recalc,
285};
286
287/*
288 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
289 * DPLL isn't bypassed.
290 */
291static struct clk dpll1_x2_ck = {
292 .name = "dpll1_x2_ck",
Russell King57137182008-11-04 16:48:35 +0000293 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200294 .parent = &dpll1_ck,
Russell King44dc9d02009-01-19 15:51:11 +0000295 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700296 .clkdm_name = "dpll1_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200297 .recalc = &omap3_clkoutx2_recalc,
298};
299
300/* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */
301static const struct clksel div16_dpll1_x2m2_clksel[] = {
302 { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates },
303 { .parent = NULL }
304};
305
306/*
307 * Does not exist in the TRM - needed to separate the M2 divider from
308 * bypass selection in mpu_ck
309 */
310static struct clk dpll1_x2m2_ck = {
311 .name = "dpll1_x2m2_ck",
Russell King57137182008-11-04 16:48:35 +0000312 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200313 .parent = &dpll1_x2_ck,
314 .init = &omap2_init_clksel_parent,
315 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL),
316 .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK,
317 .clksel = div16_dpll1_x2m2_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000318 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700319 .clkdm_name = "dpll1_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200320 .recalc = &omap2_clksel_recalc,
321};
322
323/* DPLL2 */
324/* IVA2 clock source */
325/* Type: DPLL */
326
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300327static struct dpll_data dpll2_dd = {
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200328 .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
329 .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK,
330 .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700331 .freqsel_mask = OMAP3430_IVA2_DPLL_FREQSEL_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200332 .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL),
333 .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK,
Paul Walmsley542313c2008-07-03 12:24:45 +0300334 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED) |
335 (1 << DPLL_LOW_POWER_BYPASS),
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200336 .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT,
337 .recal_en_bit = OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT,
338 .recal_st_bit = OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT,
Paul Walmsley542313c2008-07-03 12:24:45 +0300339 .autoidle_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL),
340 .autoidle_mask = OMAP3430_AUTO_IVA2_DPLL_MASK,
341 .idlest_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_IDLEST_PLL),
Paul Walmsleyc1bd7aa2009-01-28 12:08:17 -0700342 .idlest_mask = OMAP3430_ST_IVA2_CLK_MASK,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300343 .max_multiplier = OMAP3_MAX_DPLL_MULT,
344 .max_divider = OMAP3_MAX_DPLL_DIV,
345 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200346};
347
348static struct clk dpll2_ck = {
349 .name = "dpll2_ck",
Russell King548d8492008-11-04 14:02:46 +0000350 .ops = &clkops_noncore_dpll_ops,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200351 .parent = &sys_ck,
352 .dpll_data = &dpll2_dd,
Russell King44dc9d02009-01-19 15:51:11 +0000353 .flags = RATE_PROPAGATES,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300354 .round_rate = &omap2_dpll_round_rate,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700355 .set_rate = &omap3_noncore_dpll_set_rate,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700356 .clkdm_name = "dpll2_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200357 .recalc = &omap3_dpll_recalc,
358};
359
360static const struct clksel div16_dpll2_m2x2_clksel[] = {
361 { .parent = &dpll2_ck, .rates = div16_dpll_rates },
362 { .parent = NULL }
363};
364
365/*
366 * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT
367 * or CLKOUTX2. CLKOUT seems most plausible.
368 */
369static struct clk dpll2_m2_ck = {
370 .name = "dpll2_m2_ck",
Russell King57137182008-11-04 16:48:35 +0000371 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200372 .parent = &dpll2_ck,
373 .init = &omap2_init_clksel_parent,
374 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD,
375 OMAP3430_CM_CLKSEL2_PLL),
376 .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK,
377 .clksel = div16_dpll2_m2x2_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000378 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700379 .clkdm_name = "dpll2_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200380 .recalc = &omap2_clksel_recalc,
381};
382
Paul Walmsley542313c2008-07-03 12:24:45 +0300383/*
384 * DPLL3
385 * Source clock for all interfaces and for some device fclks
386 * REVISIT: Also supports fast relock bypass - not included below
387 */
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300388static struct dpll_data dpll3_dd = {
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200389 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
390 .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK,
391 .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700392 .freqsel_mask = OMAP3430_CORE_DPLL_FREQSEL_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200393 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
394 .enable_mask = OMAP3430_EN_CORE_DPLL_MASK,
395 .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT,
396 .recal_en_bit = OMAP3430_CORE_DPLL_RECAL_EN_SHIFT,
397 .recal_st_bit = OMAP3430_CORE_DPLL_ST_SHIFT,
Paul Walmsley542313c2008-07-03 12:24:45 +0300398 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
399 .autoidle_mask = OMAP3430_AUTO_CORE_DPLL_MASK,
Paul Walmsleyc1bd7aa2009-01-28 12:08:17 -0700400 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
401 .idlest_mask = OMAP3430_ST_CORE_CLK_MASK,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300402 .max_multiplier = OMAP3_MAX_DPLL_MULT,
403 .max_divider = OMAP3_MAX_DPLL_DIV,
404 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200405};
406
407static struct clk dpll3_ck = {
408 .name = "dpll3_ck",
Russell King897dcde2008-11-04 16:35:03 +0000409 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200410 .parent = &sys_ck,
411 .dpll_data = &dpll3_dd,
Russell King44dc9d02009-01-19 15:51:11 +0000412 .flags = RATE_PROPAGATES,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300413 .round_rate = &omap2_dpll_round_rate,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700414 .clkdm_name = "dpll3_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200415 .recalc = &omap3_dpll_recalc,
416};
417
418/*
419 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
420 * DPLL isn't bypassed
421 */
422static struct clk dpll3_x2_ck = {
423 .name = "dpll3_x2_ck",
Russell King57137182008-11-04 16:48:35 +0000424 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200425 .parent = &dpll3_ck,
Russell King44dc9d02009-01-19 15:51:11 +0000426 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700427 .clkdm_name = "dpll3_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200428 .recalc = &omap3_clkoutx2_recalc,
429};
430
Paul Walmsleyb045d082008-03-18 11:24:28 +0200431static const struct clksel_rate div31_dpll3_rates[] = {
432 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
433 { .div = 2, .val = 2, .flags = RATE_IN_343X },
434 { .div = 3, .val = 3, .flags = RATE_IN_3430ES2 },
435 { .div = 4, .val = 4, .flags = RATE_IN_3430ES2 },
436 { .div = 5, .val = 5, .flags = RATE_IN_3430ES2 },
437 { .div = 6, .val = 6, .flags = RATE_IN_3430ES2 },
438 { .div = 7, .val = 7, .flags = RATE_IN_3430ES2 },
439 { .div = 8, .val = 8, .flags = RATE_IN_3430ES2 },
440 { .div = 9, .val = 9, .flags = RATE_IN_3430ES2 },
441 { .div = 10, .val = 10, .flags = RATE_IN_3430ES2 },
442 { .div = 11, .val = 11, .flags = RATE_IN_3430ES2 },
443 { .div = 12, .val = 12, .flags = RATE_IN_3430ES2 },
444 { .div = 13, .val = 13, .flags = RATE_IN_3430ES2 },
445 { .div = 14, .val = 14, .flags = RATE_IN_3430ES2 },
446 { .div = 15, .val = 15, .flags = RATE_IN_3430ES2 },
447 { .div = 16, .val = 16, .flags = RATE_IN_3430ES2 },
448 { .div = 17, .val = 17, .flags = RATE_IN_3430ES2 },
449 { .div = 18, .val = 18, .flags = RATE_IN_3430ES2 },
450 { .div = 19, .val = 19, .flags = RATE_IN_3430ES2 },
451 { .div = 20, .val = 20, .flags = RATE_IN_3430ES2 },
452 { .div = 21, .val = 21, .flags = RATE_IN_3430ES2 },
453 { .div = 22, .val = 22, .flags = RATE_IN_3430ES2 },
454 { .div = 23, .val = 23, .flags = RATE_IN_3430ES2 },
455 { .div = 24, .val = 24, .flags = RATE_IN_3430ES2 },
456 { .div = 25, .val = 25, .flags = RATE_IN_3430ES2 },
457 { .div = 26, .val = 26, .flags = RATE_IN_3430ES2 },
458 { .div = 27, .val = 27, .flags = RATE_IN_3430ES2 },
459 { .div = 28, .val = 28, .flags = RATE_IN_3430ES2 },
460 { .div = 29, .val = 29, .flags = RATE_IN_3430ES2 },
461 { .div = 30, .val = 30, .flags = RATE_IN_3430ES2 },
462 { .div = 31, .val = 31, .flags = RATE_IN_3430ES2 },
463 { .div = 0 },
464};
465
466static const struct clksel div31_dpll3m2_clksel[] = {
467 { .parent = &dpll3_ck, .rates = div31_dpll3_rates },
468 { .parent = NULL }
469};
470
471/*
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200472 * DPLL3 output M2
473 * REVISIT: This DPLL output divider must be changed in SRAM, so until
474 * that code is ready, this should remain a 'read-only' clksel clock.
Paul Walmsleyb045d082008-03-18 11:24:28 +0200475 */
476static struct clk dpll3_m2_ck = {
477 .name = "dpll3_m2_ck",
Russell King57137182008-11-04 16:48:35 +0000478 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200479 .parent = &dpll3_ck,
480 .init = &omap2_init_clksel_parent,
481 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
482 .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK,
483 .clksel = div31_dpll3m2_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000484 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700485 .clkdm_name = "dpll3_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200486 .recalc = &omap2_clksel_recalc,
487};
488
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200489static const struct clksel core_ck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +0300490 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200491 { .parent = &dpll3_m2_ck, .rates = dpll_locked_rates },
492 { .parent = NULL }
Paul Walmsleyb045d082008-03-18 11:24:28 +0200493};
494
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200495static struct clk core_ck = {
496 .name = "core_ck",
Russell King57137182008-11-04 16:48:35 +0000497 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200498 .init = &omap2_init_clksel_parent,
499 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +0300500 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200501 .clksel = core_ck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000502 .flags = RATE_PROPAGATES,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200503 .recalc = &omap2_clksel_recalc,
504};
505
506static const struct clksel dpll3_m2x2_ck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +0300507 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200508 { .parent = &dpll3_x2_ck, .rates = dpll_locked_rates },
509 { .parent = NULL }
Paul Walmsleyb045d082008-03-18 11:24:28 +0200510};
511
512static struct clk dpll3_m2x2_ck = {
513 .name = "dpll3_m2x2_ck",
Russell King57137182008-11-04 16:48:35 +0000514 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200515 .init = &omap2_init_clksel_parent,
516 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +0300517 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200518 .clksel = dpll3_m2x2_ck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000519 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700520 .clkdm_name = "dpll3_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200521 .recalc = &omap2_clksel_recalc,
522};
523
524/* The PWRDN bit is apparently only available on 3430ES2 and above */
525static const struct clksel div16_dpll3_clksel[] = {
526 { .parent = &dpll3_ck, .rates = div16_dpll_rates },
527 { .parent = NULL }
528};
529
530/* This virtual clock is the source for dpll3_m3x2_ck */
531static struct clk dpll3_m3_ck = {
532 .name = "dpll3_m3_ck",
Russell King57137182008-11-04 16:48:35 +0000533 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200534 .parent = &dpll3_ck,
535 .init = &omap2_init_clksel_parent,
536 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
537 .clksel_mask = OMAP3430_DIV_DPLL3_MASK,
538 .clksel = div16_dpll3_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000539 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700540 .clkdm_name = "dpll3_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200541 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200542};
543
544/* The PWRDN bit is apparently only available on 3430ES2 and above */
545static struct clk dpll3_m3x2_ck = {
546 .name = "dpll3_m3x2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +0000547 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200548 .parent = &dpll3_m3_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200549 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
550 .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +0000551 .flags = RATE_PROPAGATES | INVERT_ENABLE,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700552 .clkdm_name = "dpll3_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200553 .recalc = &omap3_clkoutx2_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200554};
555
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200556static const struct clksel emu_core_alwon_ck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +0300557 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200558 { .parent = &dpll3_m3x2_ck, .rates = dpll_locked_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +0200559 { .parent = NULL }
560};
561
562static struct clk emu_core_alwon_ck = {
563 .name = "emu_core_alwon_ck",
Russell King57137182008-11-04 16:48:35 +0000564 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200565 .parent = &dpll3_m3x2_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200566 .init = &omap2_init_clksel_parent,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200567 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +0300568 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200569 .clksel = emu_core_alwon_ck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000570 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700571 .clkdm_name = "dpll3_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200572 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200573};
574
575/* DPLL4 */
576/* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */
577/* Type: DPLL */
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300578static struct dpll_data dpll4_dd = {
Paul Walmsleyb045d082008-03-18 11:24:28 +0200579 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2),
580 .mult_mask = OMAP3430_PERIPH_DPLL_MULT_MASK,
581 .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700582 .freqsel_mask = OMAP3430_PERIPH_DPLL_FREQSEL_MASK,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200583 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
584 .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK,
Paul Walmsley542313c2008-07-03 12:24:45 +0300585 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
Paul Walmsleyb045d082008-03-18 11:24:28 +0200586 .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT,
587 .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT,
588 .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT,
Paul Walmsley542313c2008-07-03 12:24:45 +0300589 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
590 .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK,
591 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsleyc1bd7aa2009-01-28 12:08:17 -0700592 .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300593 .max_multiplier = OMAP3_MAX_DPLL_MULT,
594 .max_divider = OMAP3_MAX_DPLL_DIV,
595 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
Paul Walmsleyb045d082008-03-18 11:24:28 +0200596};
597
598static struct clk dpll4_ck = {
599 .name = "dpll4_ck",
Russell King548d8492008-11-04 14:02:46 +0000600 .ops = &clkops_noncore_dpll_ops,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200601 .parent = &sys_ck,
602 .dpll_data = &dpll4_dd,
Russell King44dc9d02009-01-19 15:51:11 +0000603 .flags = RATE_PROPAGATES,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300604 .round_rate = &omap2_dpll_round_rate,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700605 .set_rate = &omap3_dpll4_set_rate,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700606 .clkdm_name = "dpll4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200607 .recalc = &omap3_dpll_recalc,
608};
609
610/*
611 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200612 * DPLL isn't bypassed --
613 * XXX does this serve any downstream clocks?
Paul Walmsleyb045d082008-03-18 11:24:28 +0200614 */
615static struct clk dpll4_x2_ck = {
616 .name = "dpll4_x2_ck",
Russell King57137182008-11-04 16:48:35 +0000617 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200618 .parent = &dpll4_ck,
Russell King44dc9d02009-01-19 15:51:11 +0000619 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700620 .clkdm_name = "dpll4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200621 .recalc = &omap3_clkoutx2_recalc,
622};
623
624static const struct clksel div16_dpll4_clksel[] = {
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200625 { .parent = &dpll4_ck, .rates = div16_dpll_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +0200626 { .parent = NULL }
627};
628
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200629/* This virtual clock is the source for dpll4_m2x2_ck */
630static struct clk dpll4_m2_ck = {
631 .name = "dpll4_m2_ck",
Russell King57137182008-11-04 16:48:35 +0000632 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200633 .parent = &dpll4_ck,
634 .init = &omap2_init_clksel_parent,
635 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3),
636 .clksel_mask = OMAP3430_DIV_96M_MASK,
637 .clksel = div16_dpll4_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000638 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700639 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200640 .recalc = &omap2_clksel_recalc,
641};
642
Paul Walmsleyb045d082008-03-18 11:24:28 +0200643/* The PWRDN bit is apparently only available on 3430ES2 and above */
644static struct clk dpll4_m2x2_ck = {
645 .name = "dpll4_m2x2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +0000646 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200647 .parent = &dpll4_m2_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200648 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
649 .enable_bit = OMAP3430_PWRDN_96M_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +0000650 .flags = RATE_PROPAGATES | INVERT_ENABLE,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700651 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200652 .recalc = &omap3_clkoutx2_recalc,
653};
654
655static const struct clksel omap_96m_alwon_fck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +0300656 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200657 { .parent = &dpll4_m2x2_ck, .rates = dpll_locked_rates },
658 { .parent = NULL }
Paul Walmsleyb045d082008-03-18 11:24:28 +0200659};
660
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700661/*
662 * DPLL4 generates DPLL4_M2X2_CLK which is then routed into the PRM as
663 * PRM_96M_ALWON_(F)CLK. Two clocks then emerge from the PRM:
664 * 96M_ALWON_FCLK (called "omap_96m_alwon_fck" below) and
665 * CM_96K_(F)CLK.
666 */
Paul Walmsleyb045d082008-03-18 11:24:28 +0200667static struct clk omap_96m_alwon_fck = {
668 .name = "omap_96m_alwon_fck",
Russell King57137182008-11-04 16:48:35 +0000669 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200670 .parent = &dpll4_m2x2_ck,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200671 .init = &omap2_init_clksel_parent,
672 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +0300673 .clksel_mask = OMAP3430_ST_PERIPH_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200674 .clksel = omap_96m_alwon_fck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000675 .flags = RATE_PROPAGATES,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200676 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200677};
678
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700679static struct clk cm_96m_fck = {
680 .name = "cm_96m_fck",
Russell King57137182008-11-04 16:48:35 +0000681 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200682 .parent = &omap_96m_alwon_fck,
Russell King44dc9d02009-01-19 15:51:11 +0000683 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200684 .recalc = &followparent_recalc,
685};
686
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700687static const struct clksel_rate omap_96m_dpll_rates[] = {
688 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
689 { .div = 0 }
690};
691
692static const struct clksel_rate omap_96m_sys_rates[] = {
693 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
694 { .div = 0 }
695};
696
697static const struct clksel omap_96m_fck_clksel[] = {
698 { .parent = &cm_96m_fck, .rates = omap_96m_dpll_rates },
699 { .parent = &sys_ck, .rates = omap_96m_sys_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200700 { .parent = NULL }
701};
702
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700703static struct clk omap_96m_fck = {
704 .name = "omap_96m_fck",
Russell King57137182008-11-04 16:48:35 +0000705 .ops = &clkops_null,
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700706 .parent = &sys_ck,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200707 .init = &omap2_init_clksel_parent,
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700708 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
709 .clksel_mask = OMAP3430_SOURCE_96M_MASK,
710 .clksel = omap_96m_fck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000711 .flags = RATE_PROPAGATES,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200712 .recalc = &omap2_clksel_recalc,
713};
714
715/* This virtual clock is the source for dpll4_m3x2_ck */
716static struct clk dpll4_m3_ck = {
717 .name = "dpll4_m3_ck",
Russell King57137182008-11-04 16:48:35 +0000718 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200719 .parent = &dpll4_ck,
720 .init = &omap2_init_clksel_parent,
721 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
722 .clksel_mask = OMAP3430_CLKSEL_TV_MASK,
723 .clksel = div16_dpll4_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000724 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700725 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200726 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200727};
728
729/* The PWRDN bit is apparently only available on 3430ES2 and above */
730static struct clk dpll4_m3x2_ck = {
731 .name = "dpll4_m3x2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +0000732 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200733 .parent = &dpll4_m3_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200734 .init = &omap2_init_clksel_parent,
735 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
736 .enable_bit = OMAP3430_PWRDN_TV_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +0000737 .flags = RATE_PROPAGATES | INVERT_ENABLE,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700738 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200739 .recalc = &omap3_clkoutx2_recalc,
740};
741
742static const struct clksel virt_omap_54m_fck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +0300743 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200744 { .parent = &dpll4_m3x2_ck, .rates = dpll_locked_rates },
745 { .parent = NULL }
746};
747
748static struct clk virt_omap_54m_fck = {
749 .name = "virt_omap_54m_fck",
Russell King57137182008-11-04 16:48:35 +0000750 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200751 .parent = &dpll4_m3x2_ck,
752 .init = &omap2_init_clksel_parent,
753 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +0300754 .clksel_mask = OMAP3430_ST_PERIPH_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200755 .clksel = virt_omap_54m_fck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000756 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200757 .recalc = &omap2_clksel_recalc,
758};
759
760static const struct clksel_rate omap_54m_d4m3x2_rates[] = {
761 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
762 { .div = 0 }
763};
764
765static const struct clksel_rate omap_54m_alt_rates[] = {
766 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
767 { .div = 0 }
768};
769
770static const struct clksel omap_54m_clksel[] = {
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200771 { .parent = &virt_omap_54m_fck, .rates = omap_54m_d4m3x2_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +0200772 { .parent = &sys_altclk, .rates = omap_54m_alt_rates },
773 { .parent = NULL }
774};
775
776static struct clk omap_54m_fck = {
777 .name = "omap_54m_fck",
Russell King57137182008-11-04 16:48:35 +0000778 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200779 .init = &omap2_init_clksel_parent,
780 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700781 .clksel_mask = OMAP3430_SOURCE_54M_MASK,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200782 .clksel = omap_54m_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000783 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200784 .recalc = &omap2_clksel_recalc,
785};
786
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700787static const struct clksel_rate omap_48m_cm96m_rates[] = {
Paul Walmsleyb045d082008-03-18 11:24:28 +0200788 { .div = 2, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
789 { .div = 0 }
790};
791
792static const struct clksel_rate omap_48m_alt_rates[] = {
793 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
794 { .div = 0 }
795};
796
797static const struct clksel omap_48m_clksel[] = {
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700798 { .parent = &cm_96m_fck, .rates = omap_48m_cm96m_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +0200799 { .parent = &sys_altclk, .rates = omap_48m_alt_rates },
800 { .parent = NULL }
801};
802
803static struct clk omap_48m_fck = {
804 .name = "omap_48m_fck",
Russell King57137182008-11-04 16:48:35 +0000805 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200806 .init = &omap2_init_clksel_parent,
807 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
Paul Walmsley9cfd9852009-01-27 19:13:02 -0700808 .clksel_mask = OMAP3430_SOURCE_48M_MASK,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200809 .clksel = omap_48m_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000810 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200811 .recalc = &omap2_clksel_recalc,
812};
813
814static struct clk omap_12m_fck = {
815 .name = "omap_12m_fck",
Russell King57137182008-11-04 16:48:35 +0000816 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200817 .parent = &omap_48m_fck,
818 .fixed_div = 4,
Russell King44dc9d02009-01-19 15:51:11 +0000819 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200820 .recalc = &omap2_fixed_divisor_recalc,
821};
822
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200823/* This virstual clock is the source for dpll4_m4x2_ck */
824static struct clk dpll4_m4_ck = {
825 .name = "dpll4_m4_ck",
Russell King57137182008-11-04 16:48:35 +0000826 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200827 .parent = &dpll4_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200828 .init = &omap2_init_clksel_parent,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200829 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
830 .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK,
831 .clksel = div16_dpll4_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000832 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700833 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200834 .recalc = &omap2_clksel_recalc,
Paul Walmsleyae8578c2009-01-27 19:13:12 -0700835 .set_rate = &omap2_clksel_set_rate,
836 .round_rate = &omap2_clksel_round_rate,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200837};
838
839/* The PWRDN bit is apparently only available on 3430ES2 and above */
840static struct clk dpll4_m4x2_ck = {
841 .name = "dpll4_m4x2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +0000842 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200843 .parent = &dpll4_m4_ck,
844 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
845 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +0000846 .flags = RATE_PROPAGATES | INVERT_ENABLE,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700847 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200848 .recalc = &omap3_clkoutx2_recalc,
849};
850
851/* This virtual clock is the source for dpll4_m5x2_ck */
852static struct clk dpll4_m5_ck = {
853 .name = "dpll4_m5_ck",
Russell King57137182008-11-04 16:48:35 +0000854 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200855 .parent = &dpll4_ck,
856 .init = &omap2_init_clksel_parent,
857 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
858 .clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
859 .clksel = div16_dpll4_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000860 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700861 .clkdm_name = "dpll4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200862 .recalc = &omap2_clksel_recalc,
863};
864
865/* The PWRDN bit is apparently only available on 3430ES2 and above */
866static struct clk dpll4_m5x2_ck = {
867 .name = "dpll4_m5x2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +0000868 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200869 .parent = &dpll4_m5_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200870 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
871 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +0000872 .flags = RATE_PROPAGATES | INVERT_ENABLE,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700873 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200874 .recalc = &omap3_clkoutx2_recalc,
875};
876
877/* This virtual clock is the source for dpll4_m6x2_ck */
878static struct clk dpll4_m6_ck = {
879 .name = "dpll4_m6_ck",
Russell King57137182008-11-04 16:48:35 +0000880 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200881 .parent = &dpll4_ck,
882 .init = &omap2_init_clksel_parent,
883 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
884 .clksel_mask = OMAP3430_DIV_DPLL4_MASK,
885 .clksel = div16_dpll4_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000886 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700887 .clkdm_name = "dpll4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200888 .recalc = &omap2_clksel_recalc,
889};
890
891/* The PWRDN bit is apparently only available on 3430ES2 and above */
892static struct clk dpll4_m6x2_ck = {
893 .name = "dpll4_m6x2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +0000894 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200895 .parent = &dpll4_m6_ck,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200896 .init = &omap2_init_clksel_parent,
897 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
898 .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +0000899 .flags = RATE_PROPAGATES | INVERT_ENABLE,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700900 .clkdm_name = "dpll4_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200901 .recalc = &omap3_clkoutx2_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200902};
903
904static struct clk emu_per_alwon_ck = {
905 .name = "emu_per_alwon_ck",
Russell King57137182008-11-04 16:48:35 +0000906 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200907 .parent = &dpll4_m6x2_ck,
Russell King44dc9d02009-01-19 15:51:11 +0000908 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700909 .clkdm_name = "dpll4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200910 .recalc = &followparent_recalc,
911};
912
913/* DPLL5 */
914/* Supplies 120MHz clock, USIM source clock */
915/* Type: DPLL */
916/* 3430ES2 only */
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300917static struct dpll_data dpll5_dd = {
Paul Walmsleyb045d082008-03-18 11:24:28 +0200918 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL4),
919 .mult_mask = OMAP3430ES2_PERIPH2_DPLL_MULT_MASK,
920 .div1_mask = OMAP3430ES2_PERIPH2_DPLL_DIV_MASK,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700921 .freqsel_mask = OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200922 .control_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKEN2),
923 .enable_mask = OMAP3430ES2_EN_PERIPH2_DPLL_MASK,
Paul Walmsley542313c2008-07-03 12:24:45 +0300924 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
Paul Walmsleyb045d082008-03-18 11:24:28 +0200925 .auto_recal_bit = OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT,
926 .recal_en_bit = OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT,
927 .recal_st_bit = OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT,
Paul Walmsley542313c2008-07-03 12:24:45 +0300928 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_AUTOIDLE2_PLL),
929 .autoidle_mask = OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK,
930 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2),
Paul Walmsleyc1bd7aa2009-01-28 12:08:17 -0700931 .idlest_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300932 .max_multiplier = OMAP3_MAX_DPLL_MULT,
933 .max_divider = OMAP3_MAX_DPLL_DIV,
934 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
Paul Walmsleyb045d082008-03-18 11:24:28 +0200935};
936
937static struct clk dpll5_ck = {
938 .name = "dpll5_ck",
Russell King548d8492008-11-04 14:02:46 +0000939 .ops = &clkops_noncore_dpll_ops,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200940 .parent = &sys_ck,
941 .dpll_data = &dpll5_dd,
Russell King44dc9d02009-01-19 15:51:11 +0000942 .flags = RATE_PROPAGATES,
Paul Walmsley88b8ba92008-07-03 12:24:46 +0300943 .round_rate = &omap2_dpll_round_rate,
Paul Walmsley16c90f02009-01-27 19:12:47 -0700944 .set_rate = &omap3_noncore_dpll_set_rate,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700945 .clkdm_name = "dpll5_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200946 .recalc = &omap3_dpll_recalc,
947};
948
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200949static const struct clksel div16_dpll5_clksel[] = {
Paul Walmsleyb045d082008-03-18 11:24:28 +0200950 { .parent = &dpll5_ck, .rates = div16_dpll_rates },
951 { .parent = NULL }
952};
953
954static struct clk dpll5_m2_ck = {
955 .name = "dpll5_m2_ck",
Russell King57137182008-11-04 16:48:35 +0000956 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200957 .parent = &dpll5_ck,
958 .init = &omap2_init_clksel_parent,
959 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5),
960 .clksel_mask = OMAP3430ES2_DIV_120M_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200961 .clksel = div16_dpll5_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000962 .flags = RATE_PROPAGATES,
Paul Walmsley46e0ccf2009-01-27 19:44:18 -0700963 .clkdm_name = "dpll5_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +0200964 .recalc = &omap2_clksel_recalc,
965};
966
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200967static const struct clksel omap_120m_fck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +0300968 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +0200969 { .parent = &dpll5_m2_ck, .rates = dpll_locked_rates },
970 { .parent = NULL }
971};
972
Paul Walmsleyb045d082008-03-18 11:24:28 +0200973static struct clk omap_120m_fck = {
974 .name = "omap_120m_fck",
Russell King57137182008-11-04 16:48:35 +0000975 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200976 .parent = &dpll5_m2_ck,
Paul Walmsley333943b2008-08-19 11:08:45 +0300977 .init = &omap2_init_clksel_parent,
978 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2),
979 .clksel_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK,
980 .clksel = omap_120m_fck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +0000981 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +0300982 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +0200983};
984
985/* CM EXTERNAL CLOCK OUTPUTS */
986
987static const struct clksel_rate clkout2_src_core_rates[] = {
988 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
989 { .div = 0 }
990};
991
992static const struct clksel_rate clkout2_src_sys_rates[] = {
993 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
994 { .div = 0 }
995};
996
997static const struct clksel_rate clkout2_src_96m_rates[] = {
998 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
999 { .div = 0 }
1000};
1001
1002static const struct clksel_rate clkout2_src_54m_rates[] = {
1003 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
1004 { .div = 0 }
1005};
1006
1007static const struct clksel clkout2_src_clksel[] = {
Paul Walmsley9cfd9852009-01-27 19:13:02 -07001008 { .parent = &core_ck, .rates = clkout2_src_core_rates },
1009 { .parent = &sys_ck, .rates = clkout2_src_sys_rates },
1010 { .parent = &cm_96m_fck, .rates = clkout2_src_96m_rates },
1011 { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +02001012 { .parent = NULL }
1013};
1014
1015static struct clk clkout2_src_ck = {
1016 .name = "clkout2_src_ck",
Russell Kingc1168dc2008-11-04 21:24:00 +00001017 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001018 .init = &omap2_init_clksel_parent,
1019 .enable_reg = OMAP3430_CM_CLKOUT_CTRL,
1020 .enable_bit = OMAP3430_CLKOUT2_EN_SHIFT,
1021 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
1022 .clksel_mask = OMAP3430_CLKOUT2SOURCE_MASK,
1023 .clksel = clkout2_src_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001024 .flags = RATE_PROPAGATES,
Paul Walmsley15b52bc2008-05-07 19:19:07 -06001025 .clkdm_name = "core_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001026 .recalc = &omap2_clksel_recalc,
1027};
1028
1029static const struct clksel_rate sys_clkout2_rates[] = {
1030 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1031 { .div = 2, .val = 1, .flags = RATE_IN_343X },
1032 { .div = 4, .val = 2, .flags = RATE_IN_343X },
1033 { .div = 8, .val = 3, .flags = RATE_IN_343X },
1034 { .div = 16, .val = 4, .flags = RATE_IN_343X },
1035 { .div = 0 },
1036};
1037
1038static const struct clksel sys_clkout2_clksel[] = {
1039 { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates },
1040 { .parent = NULL },
1041};
1042
1043static struct clk sys_clkout2 = {
1044 .name = "sys_clkout2",
Russell King57137182008-11-04 16:48:35 +00001045 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001046 .init = &omap2_init_clksel_parent,
1047 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
1048 .clksel_mask = OMAP3430_CLKOUT2_DIV_MASK,
1049 .clksel = sys_clkout2_clksel,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001050 .recalc = &omap2_clksel_recalc,
1051};
1052
1053/* CM OUTPUT CLOCKS */
1054
1055static struct clk corex2_fck = {
1056 .name = "corex2_fck",
Russell King57137182008-11-04 16:48:35 +00001057 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001058 .parent = &dpll3_m2x2_ck,
Russell King44dc9d02009-01-19 15:51:11 +00001059 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001060 .recalc = &followparent_recalc,
1061};
1062
1063/* DPLL power domain clock controls */
1064
Paul Walmsleyb8168d12009-01-28 12:08:14 -07001065static const struct clksel_rate div4_rates[] = {
1066 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1067 { .div = 2, .val = 2, .flags = RATE_IN_343X },
1068 { .div = 4, .val = 4, .flags = RATE_IN_343X },
1069 { .div = 0 }
1070};
1071
1072static const struct clksel div4_core_clksel[] = {
1073 { .parent = &core_ck, .rates = div4_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +02001074 { .parent = NULL }
1075};
1076
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001077/*
1078 * REVISIT: Are these in DPLL power domain or CM power domain? docs
1079 * may be inconsistent here?
1080 */
Paul Walmsleyb045d082008-03-18 11:24:28 +02001081static struct clk dpll1_fck = {
1082 .name = "dpll1_fck",
Russell King57137182008-11-04 16:48:35 +00001083 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001084 .parent = &core_ck,
1085 .init = &omap2_init_clksel_parent,
1086 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
1087 .clksel_mask = OMAP3430_MPU_CLK_SRC_MASK,
Paul Walmsleyb8168d12009-01-28 12:08:14 -07001088 .clksel = div4_core_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001089 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001090 .recalc = &omap2_clksel_recalc,
1091};
1092
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001093/*
1094 * MPU clksel:
1095 * If DPLL1 is locked, mpu_ck derives from DPLL1; otherwise, mpu_ck
1096 * derives from the high-frequency bypass clock originating from DPLL3,
1097 * called 'dpll1_fck'
1098 */
1099static const struct clksel mpu_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +03001100 { .parent = &dpll1_fck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001101 { .parent = &dpll1_x2m2_ck, .rates = dpll_locked_rates },
1102 { .parent = NULL }
1103};
1104
1105static struct clk mpu_ck = {
1106 .name = "mpu_ck",
Russell King57137182008-11-04 16:48:35 +00001107 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001108 .parent = &dpll1_x2m2_ck,
1109 .init = &omap2_init_clksel_parent,
1110 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
1111 .clksel_mask = OMAP3430_ST_MPU_CLK_MASK,
1112 .clksel = mpu_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001113 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001114 .clkdm_name = "mpu_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001115 .recalc = &omap2_clksel_recalc,
1116};
1117
1118/* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */
1119static const struct clksel_rate arm_fck_rates[] = {
1120 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1121 { .div = 2, .val = 1, .flags = RATE_IN_343X },
1122 { .div = 0 },
1123};
1124
1125static const struct clksel arm_fck_clksel[] = {
1126 { .parent = &mpu_ck, .rates = arm_fck_rates },
1127 { .parent = NULL }
1128};
1129
1130static struct clk arm_fck = {
1131 .name = "arm_fck",
Russell King57137182008-11-04 16:48:35 +00001132 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001133 .parent = &mpu_ck,
1134 .init = &omap2_init_clksel_parent,
1135 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
1136 .clksel_mask = OMAP3430_ST_MPU_CLK_MASK,
1137 .clksel = arm_fck_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001138 .flags = RATE_PROPAGATES,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001139 .recalc = &omap2_clksel_recalc,
1140};
1141
Paul Walmsley333943b2008-08-19 11:08:45 +03001142/* XXX What about neon_clkdm ? */
1143
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001144/*
1145 * REVISIT: This clock is never specifically defined in the 3430 TRM,
1146 * although it is referenced - so this is a guess
1147 */
1148static struct clk emu_mpu_alwon_ck = {
1149 .name = "emu_mpu_alwon_ck",
Russell King57137182008-11-04 16:48:35 +00001150 .ops = &clkops_null,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001151 .parent = &mpu_ck,
Russell King44dc9d02009-01-19 15:51:11 +00001152 .flags = RATE_PROPAGATES,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001153 .recalc = &followparent_recalc,
1154};
1155
Paul Walmsleyb045d082008-03-18 11:24:28 +02001156static struct clk dpll2_fck = {
1157 .name = "dpll2_fck",
Russell King57137182008-11-04 16:48:35 +00001158 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001159 .parent = &core_ck,
1160 .init = &omap2_init_clksel_parent,
1161 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
1162 .clksel_mask = OMAP3430_IVA2_CLK_SRC_MASK,
Paul Walmsleyb8168d12009-01-28 12:08:14 -07001163 .clksel = div4_core_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001164 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001165 .recalc = &omap2_clksel_recalc,
1166};
1167
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001168/*
1169 * IVA2 clksel:
1170 * If DPLL2 is locked, iva2_ck derives from DPLL2; otherwise, iva2_ck
1171 * derives from the high-frequency bypass clock originating from DPLL3,
1172 * called 'dpll2_fck'
1173 */
1174
1175static const struct clksel iva2_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +03001176 { .parent = &dpll2_fck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001177 { .parent = &dpll2_m2_ck, .rates = dpll_locked_rates },
1178 { .parent = NULL }
1179};
1180
1181static struct clk iva2_ck = {
1182 .name = "iva2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +00001183 .ops = &clkops_omap2_dflt_wait,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001184 .parent = &dpll2_m2_ck,
1185 .init = &omap2_init_clksel_parent,
Hiroshi DOYU31c203d2008-04-01 10:11:22 +03001186 .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN),
1187 .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001188 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD,
1189 OMAP3430_CM_IDLEST_PLL),
1190 .clksel_mask = OMAP3430_ST_IVA2_CLK_MASK,
1191 .clksel = iva2_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001192 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001193 .clkdm_name = "iva2_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001194 .recalc = &omap2_clksel_recalc,
1195};
1196
Paul Walmsleyb045d082008-03-18 11:24:28 +02001197/* Common interface clocks */
1198
Paul Walmsleyb8168d12009-01-28 12:08:14 -07001199static const struct clksel div2_core_clksel[] = {
1200 { .parent = &core_ck, .rates = div2_rates },
1201 { .parent = NULL }
1202};
1203
Paul Walmsleyb045d082008-03-18 11:24:28 +02001204static struct clk l3_ick = {
1205 .name = "l3_ick",
Russell King57137182008-11-04 16:48:35 +00001206 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001207 .parent = &core_ck,
1208 .init = &omap2_init_clksel_parent,
1209 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1210 .clksel_mask = OMAP3430_CLKSEL_L3_MASK,
1211 .clksel = div2_core_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001212 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001213 .clkdm_name = "core_l3_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001214 .recalc = &omap2_clksel_recalc,
1215};
1216
1217static const struct clksel div2_l3_clksel[] = {
1218 { .parent = &l3_ick, .rates = div2_rates },
1219 { .parent = NULL }
1220};
1221
1222static struct clk l4_ick = {
1223 .name = "l4_ick",
Russell King57137182008-11-04 16:48:35 +00001224 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001225 .parent = &l3_ick,
1226 .init = &omap2_init_clksel_parent,
1227 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1228 .clksel_mask = OMAP3430_CLKSEL_L4_MASK,
1229 .clksel = div2_l3_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001230 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001231 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001232 .recalc = &omap2_clksel_recalc,
1233
1234};
1235
1236static const struct clksel div2_l4_clksel[] = {
1237 { .parent = &l4_ick, .rates = div2_rates },
1238 { .parent = NULL }
1239};
1240
1241static struct clk rm_ick = {
1242 .name = "rm_ick",
Russell King57137182008-11-04 16:48:35 +00001243 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001244 .parent = &l4_ick,
1245 .init = &omap2_init_clksel_parent,
1246 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
1247 .clksel_mask = OMAP3430_CLKSEL_RM_MASK,
1248 .clksel = div2_l4_clksel,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001249 .recalc = &omap2_clksel_recalc,
1250};
1251
1252/* GFX power domain */
1253
Roman Tereshonkov3760d312008-03-13 21:35:09 +02001254/* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */
Paul Walmsleyb045d082008-03-18 11:24:28 +02001255
1256static const struct clksel gfx_l3_clksel[] = {
1257 { .parent = &l3_ick, .rates = gfx_l3_rates },
1258 { .parent = NULL }
1259};
1260
Högander Jouni59559022008-08-19 11:08:45 +03001261/* Virtual parent clock for gfx_l3_ick and gfx_l3_fck */
1262static struct clk gfx_l3_ck = {
1263 .name = "gfx_l3_ck",
Russell Kingb36ee722008-11-04 17:59:52 +00001264 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001265 .parent = &l3_ick,
1266 .init = &omap2_init_clksel_parent,
1267 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
1268 .enable_bit = OMAP_EN_GFX_SHIFT,
Högander Jouni59559022008-08-19 11:08:45 +03001269 .recalc = &followparent_recalc,
1270};
1271
1272static struct clk gfx_l3_fck = {
1273 .name = "gfx_l3_fck",
Russell King57137182008-11-04 16:48:35 +00001274 .ops = &clkops_null,
Högander Jouni59559022008-08-19 11:08:45 +03001275 .parent = &gfx_l3_ck,
1276 .init = &omap2_init_clksel_parent,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001277 .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
1278 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
1279 .clksel = gfx_l3_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001280 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001281 .clkdm_name = "gfx_3430es1_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001282 .recalc = &omap2_clksel_recalc,
1283};
1284
1285static struct clk gfx_l3_ick = {
1286 .name = "gfx_l3_ick",
Russell King57137182008-11-04 16:48:35 +00001287 .ops = &clkops_null,
Högander Jouni59559022008-08-19 11:08:45 +03001288 .parent = &gfx_l3_ck,
Paul Walmsley333943b2008-08-19 11:08:45 +03001289 .clkdm_name = "gfx_3430es1_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001290 .recalc = &followparent_recalc,
1291};
1292
1293static struct clk gfx_cg1_ck = {
1294 .name = "gfx_cg1_ck",
Russell Kingb36ee722008-11-04 17:59:52 +00001295 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001296 .parent = &gfx_l3_fck, /* REVISIT: correct? */
Paul Walmsley333943b2008-08-19 11:08:45 +03001297 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001298 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1299 .enable_bit = OMAP3430ES1_EN_2D_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001300 .clkdm_name = "gfx_3430es1_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001301 .recalc = &followparent_recalc,
1302};
1303
1304static struct clk gfx_cg2_ck = {
1305 .name = "gfx_cg2_ck",
Russell Kingb36ee722008-11-04 17:59:52 +00001306 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001307 .parent = &gfx_l3_fck, /* REVISIT: correct? */
Paul Walmsley333943b2008-08-19 11:08:45 +03001308 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001309 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1310 .enable_bit = OMAP3430ES1_EN_3D_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001311 .clkdm_name = "gfx_3430es1_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001312 .recalc = &followparent_recalc,
1313};
1314
1315/* SGX power domain - 3430ES2 only */
1316
1317static const struct clksel_rate sgx_core_rates[] = {
1318 { .div = 3, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1319 { .div = 4, .val = 1, .flags = RATE_IN_343X },
1320 { .div = 6, .val = 2, .flags = RATE_IN_343X },
1321 { .div = 0 },
1322};
1323
1324static const struct clksel_rate sgx_96m_rates[] = {
1325 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
1326 { .div = 0 },
1327};
1328
1329static const struct clksel sgx_clksel[] = {
1330 { .parent = &core_ck, .rates = sgx_core_rates },
1331 { .parent = &cm_96m_fck, .rates = sgx_96m_rates },
1332 { .parent = NULL },
1333};
1334
1335static struct clk sgx_fck = {
1336 .name = "sgx_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001337 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001338 .init = &omap2_init_clksel_parent,
1339 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_FCLKEN),
Daniel Stone712d7c82009-01-27 19:13:05 -07001340 .enable_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001341 .clksel_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_CLKSEL),
1342 .clksel_mask = OMAP3430ES2_CLKSEL_SGX_MASK,
1343 .clksel = sgx_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03001344 .clkdm_name = "sgx_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001345 .recalc = &omap2_clksel_recalc,
1346};
1347
1348static struct clk sgx_ick = {
1349 .name = "sgx_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001350 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001351 .parent = &l3_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03001352 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001353 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN),
Daniel Stone712d7c82009-01-27 19:13:05 -07001354 .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001355 .clkdm_name = "sgx_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001356 .recalc = &followparent_recalc,
1357};
1358
1359/* CORE power domain */
1360
1361static struct clk d2d_26m_fck = {
1362 .name = "d2d_26m_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001363 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001364 .parent = &sys_ck,
Paul Walmsley333943b2008-08-19 11:08:45 +03001365 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001366 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1367 .enable_bit = OMAP3430ES1_EN_D2D_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001368 .clkdm_name = "d2d_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001369 .recalc = &followparent_recalc,
1370};
1371
1372static const struct clksel omap343x_gpt_clksel[] = {
1373 { .parent = &omap_32k_fck, .rates = gpt_32k_rates },
1374 { .parent = &sys_ck, .rates = gpt_sys_rates },
1375 { .parent = NULL}
1376};
1377
1378static struct clk gpt10_fck = {
1379 .name = "gpt10_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001380 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001381 .parent = &sys_ck,
1382 .init = &omap2_init_clksel_parent,
1383 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1384 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
1385 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1386 .clksel_mask = OMAP3430_CLKSEL_GPT10_MASK,
1387 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03001388 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001389 .recalc = &omap2_clksel_recalc,
1390};
1391
1392static struct clk gpt11_fck = {
1393 .name = "gpt11_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001394 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001395 .parent = &sys_ck,
1396 .init = &omap2_init_clksel_parent,
1397 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1398 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
1399 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1400 .clksel_mask = OMAP3430_CLKSEL_GPT11_MASK,
1401 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03001402 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001403 .recalc = &omap2_clksel_recalc,
1404};
1405
1406static struct clk cpefuse_fck = {
1407 .name = "cpefuse_fck",
Russell Kingc1168dc2008-11-04 21:24:00 +00001408 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001409 .parent = &sys_ck,
1410 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1411 .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001412 .recalc = &followparent_recalc,
1413};
1414
1415static struct clk ts_fck = {
1416 .name = "ts_fck",
Russell Kingc1168dc2008-11-04 21:24:00 +00001417 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001418 .parent = &omap_32k_fck,
1419 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1420 .enable_bit = OMAP3430ES2_EN_TS_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001421 .recalc = &followparent_recalc,
1422};
1423
1424static struct clk usbtll_fck = {
1425 .name = "usbtll_fck",
Russell Kingc1168dc2008-11-04 21:24:00 +00001426 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001427 .parent = &omap_120m_fck,
1428 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1429 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001430 .recalc = &followparent_recalc,
1431};
1432
1433/* CORE 96M FCLK-derived clocks */
1434
1435static struct clk core_96m_fck = {
1436 .name = "core_96m_fck",
Russell King57137182008-11-04 16:48:35 +00001437 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001438 .parent = &omap_96m_fck,
Russell King44dc9d02009-01-19 15:51:11 +00001439 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001440 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001441 .recalc = &followparent_recalc,
1442};
1443
1444static struct clk mmchs3_fck = {
1445 .name = "mmchs_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001446 .ops = &clkops_omap2_dflt_wait,
Tony Lindgrend8874662008-12-10 17:37:16 -08001447 .id = 2,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001448 .parent = &core_96m_fck,
1449 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1450 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001451 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001452 .recalc = &followparent_recalc,
1453};
1454
1455static struct clk mmchs2_fck = {
1456 .name = "mmchs_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001457 .ops = &clkops_omap2_dflt_wait,
Tony Lindgrend8874662008-12-10 17:37:16 -08001458 .id = 1,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001459 .parent = &core_96m_fck,
1460 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1461 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001462 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001463 .recalc = &followparent_recalc,
1464};
1465
1466static struct clk mspro_fck = {
1467 .name = "mspro_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001468 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001469 .parent = &core_96m_fck,
1470 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1471 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001472 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001473 .recalc = &followparent_recalc,
1474};
1475
1476static struct clk mmchs1_fck = {
1477 .name = "mmchs_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001478 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001479 .parent = &core_96m_fck,
1480 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1481 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001482 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001483 .recalc = &followparent_recalc,
1484};
1485
1486static struct clk i2c3_fck = {
1487 .name = "i2c_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001488 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001489 .id = 3,
1490 .parent = &core_96m_fck,
1491 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1492 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001493 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001494 .recalc = &followparent_recalc,
1495};
1496
1497static struct clk i2c2_fck = {
1498 .name = "i2c_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001499 .ops = &clkops_omap2_dflt_wait,
Paul Walmsley333943b2008-08-19 11:08:45 +03001500 .id = 2,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001501 .parent = &core_96m_fck,
1502 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1503 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001504 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001505 .recalc = &followparent_recalc,
1506};
1507
1508static struct clk i2c1_fck = {
1509 .name = "i2c_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001510 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001511 .id = 1,
1512 .parent = &core_96m_fck,
1513 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1514 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001515 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001516 .recalc = &followparent_recalc,
1517};
1518
1519/*
1520 * MCBSP 1 & 5 get their 96MHz clock from core_96m_fck;
1521 * MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck.
1522 */
1523static const struct clksel_rate common_mcbsp_96m_rates[] = {
1524 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1525 { .div = 0 }
1526};
1527
1528static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
1529 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1530 { .div = 0 }
1531};
1532
1533static const struct clksel mcbsp_15_clksel[] = {
1534 { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
1535 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
1536 { .parent = NULL }
1537};
1538
1539static struct clk mcbsp5_fck = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03001540 .name = "mcbsp_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001541 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03001542 .id = 5,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001543 .init = &omap2_init_clksel_parent,
1544 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1545 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
1546 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
1547 .clksel_mask = OMAP2_MCBSP5_CLKS_MASK,
1548 .clksel = mcbsp_15_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03001549 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001550 .recalc = &omap2_clksel_recalc,
1551};
1552
1553static struct clk mcbsp1_fck = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03001554 .name = "mcbsp_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001555 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03001556 .id = 1,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001557 .init = &omap2_init_clksel_parent,
1558 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1559 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
1560 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1561 .clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
1562 .clksel = mcbsp_15_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03001563 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001564 .recalc = &omap2_clksel_recalc,
1565};
1566
1567/* CORE_48M_FCK-derived clocks */
1568
1569static struct clk core_48m_fck = {
1570 .name = "core_48m_fck",
Russell King57137182008-11-04 16:48:35 +00001571 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001572 .parent = &omap_48m_fck,
Russell King44dc9d02009-01-19 15:51:11 +00001573 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001574 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001575 .recalc = &followparent_recalc,
1576};
1577
1578static struct clk mcspi4_fck = {
1579 .name = "mcspi_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001580 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001581 .id = 4,
1582 .parent = &core_48m_fck,
1583 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1584 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001585 .recalc = &followparent_recalc,
1586};
1587
1588static struct clk mcspi3_fck = {
1589 .name = "mcspi_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001590 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001591 .id = 3,
1592 .parent = &core_48m_fck,
1593 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1594 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001595 .recalc = &followparent_recalc,
1596};
1597
1598static struct clk mcspi2_fck = {
1599 .name = "mcspi_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001600 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001601 .id = 2,
1602 .parent = &core_48m_fck,
1603 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1604 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001605 .recalc = &followparent_recalc,
1606};
1607
1608static struct clk mcspi1_fck = {
1609 .name = "mcspi_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001610 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001611 .id = 1,
1612 .parent = &core_48m_fck,
1613 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1614 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001615 .recalc = &followparent_recalc,
1616};
1617
1618static struct clk uart2_fck = {
1619 .name = "uart2_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001620 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001621 .parent = &core_48m_fck,
1622 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1623 .enable_bit = OMAP3430_EN_UART2_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001624 .recalc = &followparent_recalc,
1625};
1626
1627static struct clk uart1_fck = {
1628 .name = "uart1_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001629 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001630 .parent = &core_48m_fck,
1631 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1632 .enable_bit = OMAP3430_EN_UART1_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001633 .recalc = &followparent_recalc,
1634};
1635
1636static struct clk fshostusb_fck = {
1637 .name = "fshostusb_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001638 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001639 .parent = &core_48m_fck,
1640 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1641 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001642 .recalc = &followparent_recalc,
1643};
1644
1645/* CORE_12M_FCK based clocks */
1646
1647static struct clk core_12m_fck = {
1648 .name = "core_12m_fck",
Russell King57137182008-11-04 16:48:35 +00001649 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001650 .parent = &omap_12m_fck,
Russell King44dc9d02009-01-19 15:51:11 +00001651 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001652 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001653 .recalc = &followparent_recalc,
1654};
1655
1656static struct clk hdq_fck = {
1657 .name = "hdq_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00001658 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001659 .parent = &core_12m_fck,
1660 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1661 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001662 .recalc = &followparent_recalc,
1663};
1664
1665/* DPLL3-derived clock */
1666
1667static const struct clksel_rate ssi_ssr_corex2_rates[] = {
1668 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1669 { .div = 2, .val = 2, .flags = RATE_IN_343X },
1670 { .div = 3, .val = 3, .flags = RATE_IN_343X },
1671 { .div = 4, .val = 4, .flags = RATE_IN_343X },
1672 { .div = 6, .val = 6, .flags = RATE_IN_343X },
1673 { .div = 8, .val = 8, .flags = RATE_IN_343X },
1674 { .div = 0 }
1675};
1676
1677static const struct clksel ssi_ssr_clksel[] = {
1678 { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates },
1679 { .parent = NULL }
1680};
1681
1682static struct clk ssi_ssr_fck = {
1683 .name = "ssi_ssr_fck",
Russell Kingbc51da42008-11-04 18:59:32 +00001684 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001685 .init = &omap2_init_clksel_parent,
1686 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1687 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1688 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1689 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1690 .clksel = ssi_ssr_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00001691 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001692 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001693 .recalc = &omap2_clksel_recalc,
1694};
1695
1696static struct clk ssi_sst_fck = {
1697 .name = "ssi_sst_fck",
Russell King57137182008-11-04 16:48:35 +00001698 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001699 .parent = &ssi_ssr_fck,
1700 .fixed_div = 2,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001701 .recalc = &omap2_fixed_divisor_recalc,
1702};
1703
1704
1705
1706/* CORE_L3_ICK based clocks */
1707
Paul Walmsley333943b2008-08-19 11:08:45 +03001708/*
1709 * XXX must add clk_enable/clk_disable for these if standard code won't
1710 * handle it
1711 */
Paul Walmsleyb045d082008-03-18 11:24:28 +02001712static struct clk core_l3_ick = {
1713 .name = "core_l3_ick",
Russell King57137182008-11-04 16:48:35 +00001714 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001715 .parent = &l3_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03001716 .init = &omap2_init_clk_clkdm,
Russell King44dc9d02009-01-19 15:51:11 +00001717 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001718 .clkdm_name = "core_l3_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001719 .recalc = &followparent_recalc,
1720};
1721
1722static struct clk hsotgusb_ick = {
1723 .name = "hsotgusb_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001724 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001725 .parent = &core_l3_ick,
1726 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1727 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001728 .clkdm_name = "core_l3_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001729 .recalc = &followparent_recalc,
1730};
1731
1732static struct clk sdrc_ick = {
1733 .name = "sdrc_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001734 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001735 .parent = &core_l3_ick,
1736 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1737 .enable_bit = OMAP3430_EN_SDRC_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +00001738 .flags = ENABLE_ON_INIT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001739 .clkdm_name = "core_l3_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001740 .recalc = &followparent_recalc,
1741};
1742
1743static struct clk gpmc_fck = {
1744 .name = "gpmc_fck",
Russell King57137182008-11-04 16:48:35 +00001745 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001746 .parent = &core_l3_ick,
Russell King44dc9d02009-01-19 15:51:11 +00001747 .flags = ENABLE_ON_INIT, /* huh? */
Paul Walmsley333943b2008-08-19 11:08:45 +03001748 .clkdm_name = "core_l3_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001749 .recalc = &followparent_recalc,
1750};
1751
1752/* SECURITY_L3_ICK based clocks */
1753
1754static struct clk security_l3_ick = {
1755 .name = "security_l3_ick",
Russell King57137182008-11-04 16:48:35 +00001756 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001757 .parent = &l3_ick,
Russell King44dc9d02009-01-19 15:51:11 +00001758 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001759 .recalc = &followparent_recalc,
1760};
1761
1762static struct clk pka_ick = {
1763 .name = "pka_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001764 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001765 .parent = &security_l3_ick,
1766 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1767 .enable_bit = OMAP3430_EN_PKA_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001768 .recalc = &followparent_recalc,
1769};
1770
1771/* CORE_L4_ICK based clocks */
1772
1773static struct clk core_l4_ick = {
1774 .name = "core_l4_ick",
Russell King57137182008-11-04 16:48:35 +00001775 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001776 .parent = &l4_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03001777 .init = &omap2_init_clk_clkdm,
Russell King44dc9d02009-01-19 15:51:11 +00001778 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03001779 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001780 .recalc = &followparent_recalc,
1781};
1782
1783static struct clk usbtll_ick = {
1784 .name = "usbtll_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001785 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001786 .parent = &core_l4_ick,
1787 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1788 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001789 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001790 .recalc = &followparent_recalc,
1791};
1792
1793static struct clk mmchs3_ick = {
1794 .name = "mmchs_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001795 .ops = &clkops_omap2_dflt_wait,
Tony Lindgrend8874662008-12-10 17:37:16 -08001796 .id = 2,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001797 .parent = &core_l4_ick,
1798 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1799 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001800 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001801 .recalc = &followparent_recalc,
1802};
1803
1804/* Intersystem Communication Registers - chassis mode only */
1805static struct clk icr_ick = {
1806 .name = "icr_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001807 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001808 .parent = &core_l4_ick,
1809 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1810 .enable_bit = OMAP3430_EN_ICR_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001811 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001812 .recalc = &followparent_recalc,
1813};
1814
1815static struct clk aes2_ick = {
1816 .name = "aes2_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001817 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001818 .parent = &core_l4_ick,
1819 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1820 .enable_bit = OMAP3430_EN_AES2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001821 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001822 .recalc = &followparent_recalc,
1823};
1824
1825static struct clk sha12_ick = {
1826 .name = "sha12_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001827 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001828 .parent = &core_l4_ick,
1829 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1830 .enable_bit = OMAP3430_EN_SHA12_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001831 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001832 .recalc = &followparent_recalc,
1833};
1834
1835static struct clk des2_ick = {
1836 .name = "des2_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001837 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001838 .parent = &core_l4_ick,
1839 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1840 .enable_bit = OMAP3430_EN_DES2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001841 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001842 .recalc = &followparent_recalc,
1843};
1844
1845static struct clk mmchs2_ick = {
1846 .name = "mmchs_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001847 .ops = &clkops_omap2_dflt_wait,
Tony Lindgrend8874662008-12-10 17:37:16 -08001848 .id = 1,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001849 .parent = &core_l4_ick,
1850 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1851 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001852 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001853 .recalc = &followparent_recalc,
1854};
1855
1856static struct clk mmchs1_ick = {
1857 .name = "mmchs_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001858 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001859 .parent = &core_l4_ick,
1860 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1861 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001862 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001863 .recalc = &followparent_recalc,
1864};
1865
1866static struct clk mspro_ick = {
1867 .name = "mspro_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001868 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001869 .parent = &core_l4_ick,
1870 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1871 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001872 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001873 .recalc = &followparent_recalc,
1874};
1875
1876static struct clk hdq_ick = {
1877 .name = "hdq_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001878 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001879 .parent = &core_l4_ick,
1880 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1881 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001882 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001883 .recalc = &followparent_recalc,
1884};
1885
1886static struct clk mcspi4_ick = {
1887 .name = "mcspi_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001888 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001889 .id = 4,
1890 .parent = &core_l4_ick,
1891 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1892 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001893 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001894 .recalc = &followparent_recalc,
1895};
1896
1897static struct clk mcspi3_ick = {
1898 .name = "mcspi_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001899 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001900 .id = 3,
1901 .parent = &core_l4_ick,
1902 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1903 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001904 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001905 .recalc = &followparent_recalc,
1906};
1907
1908static struct clk mcspi2_ick = {
1909 .name = "mcspi_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001910 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001911 .id = 2,
1912 .parent = &core_l4_ick,
1913 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1914 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001915 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001916 .recalc = &followparent_recalc,
1917};
1918
1919static struct clk mcspi1_ick = {
1920 .name = "mcspi_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001921 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001922 .id = 1,
1923 .parent = &core_l4_ick,
1924 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1925 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001926 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001927 .recalc = &followparent_recalc,
1928};
1929
1930static struct clk i2c3_ick = {
1931 .name = "i2c_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001932 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001933 .id = 3,
1934 .parent = &core_l4_ick,
1935 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1936 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001937 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001938 .recalc = &followparent_recalc,
1939};
1940
1941static struct clk i2c2_ick = {
1942 .name = "i2c_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001943 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001944 .id = 2,
1945 .parent = &core_l4_ick,
1946 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1947 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001948 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001949 .recalc = &followparent_recalc,
1950};
1951
1952static struct clk i2c1_ick = {
1953 .name = "i2c_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001954 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001955 .id = 1,
1956 .parent = &core_l4_ick,
1957 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1958 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001959 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001960 .recalc = &followparent_recalc,
1961};
1962
1963static struct clk uart2_ick = {
1964 .name = "uart2_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001965 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001966 .parent = &core_l4_ick,
1967 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1968 .enable_bit = OMAP3430_EN_UART2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001969 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001970 .recalc = &followparent_recalc,
1971};
1972
1973static struct clk uart1_ick = {
1974 .name = "uart1_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001975 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001976 .parent = &core_l4_ick,
1977 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1978 .enable_bit = OMAP3430_EN_UART1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001979 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001980 .recalc = &followparent_recalc,
1981};
1982
1983static struct clk gpt11_ick = {
1984 .name = "gpt11_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001985 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001986 .parent = &core_l4_ick,
1987 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1988 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001989 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02001990 .recalc = &followparent_recalc,
1991};
1992
1993static struct clk gpt10_ick = {
1994 .name = "gpt10_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00001995 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02001996 .parent = &core_l4_ick,
1997 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1998 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03001999 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002000 .recalc = &followparent_recalc,
2001};
2002
2003static struct clk mcbsp5_ick = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002004 .name = "mcbsp_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002005 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002006 .id = 5,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002007 .parent = &core_l4_ick,
2008 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2009 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002010 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002011 .recalc = &followparent_recalc,
2012};
2013
2014static struct clk mcbsp1_ick = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002015 .name = "mcbsp_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002016 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002017 .id = 1,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002018 .parent = &core_l4_ick,
2019 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2020 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002021 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002022 .recalc = &followparent_recalc,
2023};
2024
2025static struct clk fac_ick = {
2026 .name = "fac_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002027 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002028 .parent = &core_l4_ick,
2029 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2030 .enable_bit = OMAP3430ES1_EN_FAC_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002031 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002032 .recalc = &followparent_recalc,
2033};
2034
2035static struct clk mailboxes_ick = {
2036 .name = "mailboxes_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002037 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002038 .parent = &core_l4_ick,
2039 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2040 .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002041 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002042 .recalc = &followparent_recalc,
2043};
2044
2045static struct clk omapctrl_ick = {
2046 .name = "omapctrl_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002047 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002048 .parent = &core_l4_ick,
2049 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2050 .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +00002051 .flags = ENABLE_ON_INIT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002052 .recalc = &followparent_recalc,
2053};
2054
2055/* SSI_L4_ICK based clocks */
2056
2057static struct clk ssi_l4_ick = {
2058 .name = "ssi_l4_ick",
Russell King57137182008-11-04 16:48:35 +00002059 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002060 .parent = &l4_ick,
Russell King44dc9d02009-01-19 15:51:11 +00002061 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002062 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002063 .recalc = &followparent_recalc,
2064};
2065
2066static struct clk ssi_ick = {
2067 .name = "ssi_ick",
Russell Kingbc51da42008-11-04 18:59:32 +00002068 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002069 .parent = &ssi_l4_ick,
2070 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2071 .enable_bit = OMAP3430_EN_SSI_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002072 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002073 .recalc = &followparent_recalc,
2074};
2075
2076/* REVISIT: Technically the TRM claims that this is CORE_CLK based,
2077 * but l4_ick makes more sense to me */
2078
2079static const struct clksel usb_l4_clksel[] = {
2080 { .parent = &l4_ick, .rates = div2_rates },
2081 { .parent = NULL },
2082};
2083
2084static struct clk usb_l4_ick = {
2085 .name = "usb_l4_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002086 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002087 .parent = &l4_ick,
2088 .init = &omap2_init_clksel_parent,
2089 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2090 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
2091 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
2092 .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK,
2093 .clksel = usb_l4_clksel,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002094 .recalc = &omap2_clksel_recalc,
2095};
2096
2097/* XXX MDM_INTC_ICK, SAD2D_ICK ?? */
2098
2099/* SECURITY_L4_ICK2 based clocks */
2100
2101static struct clk security_l4_ick2 = {
2102 .name = "security_l4_ick2",
Russell King57137182008-11-04 16:48:35 +00002103 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002104 .parent = &l4_ick,
Russell King44dc9d02009-01-19 15:51:11 +00002105 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002106 .recalc = &followparent_recalc,
2107};
2108
2109static struct clk aes1_ick = {
2110 .name = "aes1_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002111 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002112 .parent = &security_l4_ick2,
2113 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2114 .enable_bit = OMAP3430_EN_AES1_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002115 .recalc = &followparent_recalc,
2116};
2117
2118static struct clk rng_ick = {
2119 .name = "rng_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002120 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002121 .parent = &security_l4_ick2,
2122 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2123 .enable_bit = OMAP3430_EN_RNG_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002124 .recalc = &followparent_recalc,
2125};
2126
2127static struct clk sha11_ick = {
2128 .name = "sha11_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002129 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002130 .parent = &security_l4_ick2,
2131 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2132 .enable_bit = OMAP3430_EN_SHA11_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002133 .recalc = &followparent_recalc,
2134};
2135
2136static struct clk des1_ick = {
2137 .name = "des1_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002138 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002139 .parent = &security_l4_ick2,
2140 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2141 .enable_bit = OMAP3430_EN_DES1_SHIFT,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002142 .recalc = &followparent_recalc,
2143};
2144
2145/* DSS */
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002146static const struct clksel dss1_alwon_fck_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +03002147 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002148 { .parent = &dpll4_m4x2_ck, .rates = dpll_locked_rates },
2149 { .parent = NULL }
2150};
Paul Walmsleyb045d082008-03-18 11:24:28 +02002151
2152static struct clk dss1_alwon_fck = {
2153 .name = "dss1_alwon_fck",
Russell Kingbc51da42008-11-04 18:59:32 +00002154 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002155 .parent = &dpll4_m4x2_ck,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002156 .init = &omap2_init_clksel_parent,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002157 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2158 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002159 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +03002160 .clksel_mask = OMAP3430_ST_PERIPH_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002161 .clksel = dss1_alwon_fck_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002162 .clkdm_name = "dss_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002163 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002164};
2165
2166static struct clk dss_tv_fck = {
2167 .name = "dss_tv_fck",
Russell Kingbc51da42008-11-04 18:59:32 +00002168 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002169 .parent = &omap_54m_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002170 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002171 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2172 .enable_bit = OMAP3430_EN_TV_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002173 .clkdm_name = "dss_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002174 .recalc = &followparent_recalc,
2175};
2176
2177static struct clk dss_96m_fck = {
2178 .name = "dss_96m_fck",
Russell Kingbc51da42008-11-04 18:59:32 +00002179 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002180 .parent = &omap_96m_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002181 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002182 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2183 .enable_bit = OMAP3430_EN_TV_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002184 .clkdm_name = "dss_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002185 .recalc = &followparent_recalc,
2186};
2187
2188static struct clk dss2_alwon_fck = {
2189 .name = "dss2_alwon_fck",
Russell Kingbc51da42008-11-04 18:59:32 +00002190 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002191 .parent = &sys_ck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002192 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002193 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2194 .enable_bit = OMAP3430_EN_DSS2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002195 .clkdm_name = "dss_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002196 .recalc = &followparent_recalc,
2197};
2198
2199static struct clk dss_ick = {
2200 /* Handles both L3 and L4 clocks */
2201 .name = "dss_ick",
Russell Kingbc51da42008-11-04 18:59:32 +00002202 .ops = &clkops_omap2_dflt,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002203 .parent = &l4_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03002204 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002205 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2206 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002207 .clkdm_name = "dss_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002208 .recalc = &followparent_recalc,
2209};
2210
2211/* CAM */
2212
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002213static const struct clksel cam_mclk_clksel[] = {
Paul Walmsley333943b2008-08-19 11:08:45 +03002214 { .parent = &sys_ck, .rates = dpll_bypass_rates },
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002215 { .parent = &dpll4_m5x2_ck, .rates = dpll_locked_rates },
2216 { .parent = NULL }
2217};
2218
Paul Walmsleyb045d082008-03-18 11:24:28 +02002219static struct clk cam_mclk = {
2220 .name = "cam_mclk",
Russell Kingb36ee722008-11-04 17:59:52 +00002221 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002222 .parent = &dpll4_m5x2_ck,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002223 .init = &omap2_init_clksel_parent,
2224 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
Paul Walmsley542313c2008-07-03 12:24:45 +03002225 .clksel_mask = OMAP3430_ST_PERIPH_CLK_MASK,
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002226 .clksel = cam_mclk_clksel,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002227 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2228 .enable_bit = OMAP3430_EN_CAM_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002229 .clkdm_name = "cam_clkdm",
Roman Tereshonkov3760d312008-03-13 21:35:09 +02002230 .recalc = &omap2_clksel_recalc,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002231};
2232
Högander Jouni59559022008-08-19 11:08:45 +03002233static struct clk cam_ick = {
2234 /* Handles both L3 and L4 clocks */
2235 .name = "cam_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002236 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002237 .parent = &l4_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03002238 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002239 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN),
2240 .enable_bit = OMAP3430_EN_CAM_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002241 .clkdm_name = "cam_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002242 .recalc = &followparent_recalc,
2243};
2244
Sergio Aguirre6c8fe0b2009-01-27 19:13:09 -07002245static struct clk csi2_96m_fck = {
2246 .name = "csi2_96m_fck",
2247 .ops = &clkops_omap2_dflt_wait,
2248 .parent = &core_96m_fck,
2249 .init = &omap2_init_clk_clkdm,
2250 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2251 .enable_bit = OMAP3430_EN_CSI2_SHIFT,
2252 .clkdm_name = "cam_clkdm",
2253 .recalc = &followparent_recalc,
2254};
2255
Paul Walmsleyb045d082008-03-18 11:24:28 +02002256/* USBHOST - 3430ES2 only */
2257
2258static struct clk usbhost_120m_fck = {
2259 .name = "usbhost_120m_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002260 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002261 .parent = &omap_120m_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002262 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002263 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2264 .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002265 .clkdm_name = "usbhost_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002266 .recalc = &followparent_recalc,
2267};
2268
2269static struct clk usbhost_48m_fck = {
2270 .name = "usbhost_48m_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002271 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002272 .parent = &omap_48m_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002273 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002274 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2275 .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002276 .clkdm_name = "usbhost_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002277 .recalc = &followparent_recalc,
2278};
2279
Högander Jouni59559022008-08-19 11:08:45 +03002280static struct clk usbhost_ick = {
2281 /* Handles both L3 and L4 clocks */
2282 .name = "usbhost_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002283 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002284 .parent = &l4_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03002285 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002286 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN),
2287 .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002288 .clkdm_name = "usbhost_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002289 .recalc = &followparent_recalc,
2290};
2291
Paul Walmsleyb045d082008-03-18 11:24:28 +02002292/* WKUP */
2293
2294static const struct clksel_rate usim_96m_rates[] = {
2295 { .div = 2, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
2296 { .div = 4, .val = 4, .flags = RATE_IN_343X },
2297 { .div = 8, .val = 5, .flags = RATE_IN_343X },
2298 { .div = 10, .val = 6, .flags = RATE_IN_343X },
2299 { .div = 0 },
2300};
2301
2302static const struct clksel_rate usim_120m_rates[] = {
2303 { .div = 4, .val = 7, .flags = RATE_IN_343X | DEFAULT_RATE },
2304 { .div = 8, .val = 8, .flags = RATE_IN_343X },
2305 { .div = 16, .val = 9, .flags = RATE_IN_343X },
2306 { .div = 20, .val = 10, .flags = RATE_IN_343X },
2307 { .div = 0 },
2308};
2309
2310static const struct clksel usim_clksel[] = {
2311 { .parent = &omap_96m_fck, .rates = usim_96m_rates },
2312 { .parent = &omap_120m_fck, .rates = usim_120m_rates },
2313 { .parent = &sys_ck, .rates = div2_rates },
2314 { .parent = NULL },
2315};
2316
2317/* 3430ES2 only */
2318static struct clk usim_fck = {
2319 .name = "usim_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002320 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002321 .init = &omap2_init_clksel_parent,
2322 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2323 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2324 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2325 .clksel_mask = OMAP3430ES2_CLKSEL_USIMOCP_MASK,
2326 .clksel = usim_clksel,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002327 .recalc = &omap2_clksel_recalc,
2328};
2329
Paul Walmsley333943b2008-08-19 11:08:45 +03002330/* XXX should gpt1's clksel have wkup_32k_fck as the 32k opt? */
Paul Walmsleyb045d082008-03-18 11:24:28 +02002331static struct clk gpt1_fck = {
2332 .name = "gpt1_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002333 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002334 .init = &omap2_init_clksel_parent,
2335 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2336 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2337 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2338 .clksel_mask = OMAP3430_CLKSEL_GPT1_MASK,
2339 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002340 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002341 .recalc = &omap2_clksel_recalc,
2342};
2343
2344static struct clk wkup_32k_fck = {
2345 .name = "wkup_32k_fck",
Russell King897dcde2008-11-04 16:35:03 +00002346 .ops = &clkops_null,
Paul Walmsley333943b2008-08-19 11:08:45 +03002347 .init = &omap2_init_clk_clkdm,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002348 .parent = &omap_32k_fck,
Russell King44dc9d02009-01-19 15:51:11 +00002349 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002350 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002351 .recalc = &followparent_recalc,
2352};
2353
Jouni Hogander89db9482008-12-10 17:35:24 -08002354static struct clk gpio1_dbck = {
2355 .name = "gpio1_dbck",
Russell Kingb36ee722008-11-04 17:59:52 +00002356 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002357 .parent = &wkup_32k_fck,
2358 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2359 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002360 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002361 .recalc = &followparent_recalc,
2362};
2363
2364static struct clk wdt2_fck = {
2365 .name = "wdt2_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002366 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002367 .parent = &wkup_32k_fck,
2368 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2369 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002370 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002371 .recalc = &followparent_recalc,
2372};
2373
2374static struct clk wkup_l4_ick = {
2375 .name = "wkup_l4_ick",
Russell King897dcde2008-11-04 16:35:03 +00002376 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002377 .parent = &sys_ck,
Russell King44dc9d02009-01-19 15:51:11 +00002378 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002379 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002380 .recalc = &followparent_recalc,
2381};
2382
2383/* 3430ES2 only */
2384/* Never specifically named in the TRM, so we have to infer a likely name */
2385static struct clk usim_ick = {
2386 .name = "usim_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002387 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002388 .parent = &wkup_l4_ick,
2389 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2390 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002391 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002392 .recalc = &followparent_recalc,
2393};
2394
2395static struct clk wdt2_ick = {
2396 .name = "wdt2_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002397 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002398 .parent = &wkup_l4_ick,
2399 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2400 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002401 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002402 .recalc = &followparent_recalc,
2403};
2404
2405static struct clk wdt1_ick = {
2406 .name = "wdt1_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002407 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002408 .parent = &wkup_l4_ick,
2409 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2410 .enable_bit = OMAP3430_EN_WDT1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002411 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002412 .recalc = &followparent_recalc,
2413};
2414
2415static struct clk gpio1_ick = {
2416 .name = "gpio1_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002417 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002418 .parent = &wkup_l4_ick,
2419 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2420 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002421 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002422 .recalc = &followparent_recalc,
2423};
2424
2425static struct clk omap_32ksync_ick = {
2426 .name = "omap_32ksync_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002427 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002428 .parent = &wkup_l4_ick,
2429 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2430 .enable_bit = OMAP3430_EN_32KSYNC_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002431 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002432 .recalc = &followparent_recalc,
2433};
2434
Paul Walmsley333943b2008-08-19 11:08:45 +03002435/* XXX This clock no longer exists in 3430 TRM rev F */
Paul Walmsleyb045d082008-03-18 11:24:28 +02002436static struct clk gpt12_ick = {
2437 .name = "gpt12_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002438 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002439 .parent = &wkup_l4_ick,
2440 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2441 .enable_bit = OMAP3430_EN_GPT12_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002442 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002443 .recalc = &followparent_recalc,
2444};
2445
2446static struct clk gpt1_ick = {
2447 .name = "gpt1_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002448 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002449 .parent = &wkup_l4_ick,
2450 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2451 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002452 .clkdm_name = "wkup_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002453 .recalc = &followparent_recalc,
2454};
2455
2456
2457
2458/* PER clock domain */
2459
2460static struct clk per_96m_fck = {
2461 .name = "per_96m_fck",
Russell King57137182008-11-04 16:48:35 +00002462 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002463 .parent = &omap_96m_alwon_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002464 .init = &omap2_init_clk_clkdm,
Russell King44dc9d02009-01-19 15:51:11 +00002465 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002466 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002467 .recalc = &followparent_recalc,
2468};
2469
2470static struct clk per_48m_fck = {
2471 .name = "per_48m_fck",
Russell King57137182008-11-04 16:48:35 +00002472 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002473 .parent = &omap_48m_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002474 .init = &omap2_init_clk_clkdm,
Russell King44dc9d02009-01-19 15:51:11 +00002475 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002476 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002477 .recalc = &followparent_recalc,
2478};
2479
2480static struct clk uart3_fck = {
2481 .name = "uart3_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002482 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002483 .parent = &per_48m_fck,
2484 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2485 .enable_bit = OMAP3430_EN_UART3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002486 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002487 .recalc = &followparent_recalc,
2488};
2489
2490static struct clk gpt2_fck = {
2491 .name = "gpt2_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002492 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002493 .init = &omap2_init_clksel_parent,
2494 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2495 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2496 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2497 .clksel_mask = OMAP3430_CLKSEL_GPT2_MASK,
2498 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002499 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002500 .recalc = &omap2_clksel_recalc,
2501};
2502
2503static struct clk gpt3_fck = {
2504 .name = "gpt3_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002505 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002506 .init = &omap2_init_clksel_parent,
2507 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2508 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2509 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2510 .clksel_mask = OMAP3430_CLKSEL_GPT3_MASK,
2511 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002512 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002513 .recalc = &omap2_clksel_recalc,
2514};
2515
2516static struct clk gpt4_fck = {
2517 .name = "gpt4_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002518 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002519 .init = &omap2_init_clksel_parent,
2520 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2521 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2522 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2523 .clksel_mask = OMAP3430_CLKSEL_GPT4_MASK,
2524 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002525 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002526 .recalc = &omap2_clksel_recalc,
2527};
2528
2529static struct clk gpt5_fck = {
2530 .name = "gpt5_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002531 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002532 .init = &omap2_init_clksel_parent,
2533 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2534 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2535 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2536 .clksel_mask = OMAP3430_CLKSEL_GPT5_MASK,
2537 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002538 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002539 .recalc = &omap2_clksel_recalc,
2540};
2541
2542static struct clk gpt6_fck = {
2543 .name = "gpt6_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002544 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002545 .init = &omap2_init_clksel_parent,
2546 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2547 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2548 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2549 .clksel_mask = OMAP3430_CLKSEL_GPT6_MASK,
2550 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002551 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002552 .recalc = &omap2_clksel_recalc,
2553};
2554
2555static struct clk gpt7_fck = {
2556 .name = "gpt7_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002557 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002558 .init = &omap2_init_clksel_parent,
2559 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2560 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2561 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2562 .clksel_mask = OMAP3430_CLKSEL_GPT7_MASK,
2563 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002564 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002565 .recalc = &omap2_clksel_recalc,
2566};
2567
2568static struct clk gpt8_fck = {
2569 .name = "gpt8_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002570 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002571 .init = &omap2_init_clksel_parent,
2572 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2573 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2574 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2575 .clksel_mask = OMAP3430_CLKSEL_GPT8_MASK,
2576 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002577 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002578 .recalc = &omap2_clksel_recalc,
2579};
2580
2581static struct clk gpt9_fck = {
2582 .name = "gpt9_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002583 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002584 .init = &omap2_init_clksel_parent,
2585 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2586 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2587 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2588 .clksel_mask = OMAP3430_CLKSEL_GPT9_MASK,
2589 .clksel = omap343x_gpt_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002590 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002591 .recalc = &omap2_clksel_recalc,
2592};
2593
2594static struct clk per_32k_alwon_fck = {
2595 .name = "per_32k_alwon_fck",
Russell King897dcde2008-11-04 16:35:03 +00002596 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002597 .parent = &omap_32k_fck,
Paul Walmsley333943b2008-08-19 11:08:45 +03002598 .clkdm_name = "per_clkdm",
Russell King44dc9d02009-01-19 15:51:11 +00002599 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002600 .recalc = &followparent_recalc,
2601};
2602
Jouni Hogander89db9482008-12-10 17:35:24 -08002603static struct clk gpio6_dbck = {
2604 .name = "gpio6_dbck",
Russell Kingb36ee722008-11-04 17:59:52 +00002605 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002606 .parent = &per_32k_alwon_fck,
2607 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
Jouni Höganderc3aa044a2008-03-28 14:57:50 +02002608 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002609 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002610 .recalc = &followparent_recalc,
2611};
2612
Jouni Hogander89db9482008-12-10 17:35:24 -08002613static struct clk gpio5_dbck = {
2614 .name = "gpio5_dbck",
Russell Kingb36ee722008-11-04 17:59:52 +00002615 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002616 .parent = &per_32k_alwon_fck,
2617 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
Jouni Höganderc3aa044a2008-03-28 14:57:50 +02002618 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002619 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002620 .recalc = &followparent_recalc,
2621};
2622
Jouni Hogander89db9482008-12-10 17:35:24 -08002623static struct clk gpio4_dbck = {
2624 .name = "gpio4_dbck",
Russell Kingb36ee722008-11-04 17:59:52 +00002625 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002626 .parent = &per_32k_alwon_fck,
2627 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
Jouni Höganderc3aa044a2008-03-28 14:57:50 +02002628 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002629 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002630 .recalc = &followparent_recalc,
2631};
2632
Jouni Hogander89db9482008-12-10 17:35:24 -08002633static struct clk gpio3_dbck = {
2634 .name = "gpio3_dbck",
Russell Kingb36ee722008-11-04 17:59:52 +00002635 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002636 .parent = &per_32k_alwon_fck,
2637 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
Jouni Höganderc3aa044a2008-03-28 14:57:50 +02002638 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002639 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002640 .recalc = &followparent_recalc,
2641};
2642
Jouni Hogander89db9482008-12-10 17:35:24 -08002643static struct clk gpio2_dbck = {
2644 .name = "gpio2_dbck",
Russell Kingb36ee722008-11-04 17:59:52 +00002645 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002646 .parent = &per_32k_alwon_fck,
2647 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
Jouni Höganderc3aa044a2008-03-28 14:57:50 +02002648 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002649 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002650 .recalc = &followparent_recalc,
2651};
2652
2653static struct clk wdt3_fck = {
2654 .name = "wdt3_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002655 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002656 .parent = &per_32k_alwon_fck,
2657 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2658 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002659 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002660 .recalc = &followparent_recalc,
2661};
2662
2663static struct clk per_l4_ick = {
2664 .name = "per_l4_ick",
Russell King57137182008-11-04 16:48:35 +00002665 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002666 .parent = &l4_ick,
Russell King44dc9d02009-01-19 15:51:11 +00002667 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002668 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002669 .recalc = &followparent_recalc,
2670};
2671
2672static struct clk gpio6_ick = {
2673 .name = "gpio6_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002674 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002675 .parent = &per_l4_ick,
2676 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2677 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002678 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002679 .recalc = &followparent_recalc,
2680};
2681
2682static struct clk gpio5_ick = {
2683 .name = "gpio5_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002684 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002685 .parent = &per_l4_ick,
2686 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2687 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002688 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002689 .recalc = &followparent_recalc,
2690};
2691
2692static struct clk gpio4_ick = {
2693 .name = "gpio4_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002694 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002695 .parent = &per_l4_ick,
2696 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2697 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002698 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002699 .recalc = &followparent_recalc,
2700};
2701
2702static struct clk gpio3_ick = {
2703 .name = "gpio3_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002704 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002705 .parent = &per_l4_ick,
2706 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2707 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002708 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002709 .recalc = &followparent_recalc,
2710};
2711
2712static struct clk gpio2_ick = {
2713 .name = "gpio2_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002714 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002715 .parent = &per_l4_ick,
2716 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2717 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002718 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002719 .recalc = &followparent_recalc,
2720};
2721
2722static struct clk wdt3_ick = {
2723 .name = "wdt3_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002724 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002725 .parent = &per_l4_ick,
2726 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2727 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002728 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002729 .recalc = &followparent_recalc,
2730};
2731
2732static struct clk uart3_ick = {
2733 .name = "uart3_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002734 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002735 .parent = &per_l4_ick,
2736 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2737 .enable_bit = OMAP3430_EN_UART3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002738 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002739 .recalc = &followparent_recalc,
2740};
2741
2742static struct clk gpt9_ick = {
2743 .name = "gpt9_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002744 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002745 .parent = &per_l4_ick,
2746 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2747 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002748 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002749 .recalc = &followparent_recalc,
2750};
2751
2752static struct clk gpt8_ick = {
2753 .name = "gpt8_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002754 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002755 .parent = &per_l4_ick,
2756 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2757 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002758 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002759 .recalc = &followparent_recalc,
2760};
2761
2762static struct clk gpt7_ick = {
2763 .name = "gpt7_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002764 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002765 .parent = &per_l4_ick,
2766 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2767 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002768 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002769 .recalc = &followparent_recalc,
2770};
2771
2772static struct clk gpt6_ick = {
2773 .name = "gpt6_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002774 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002775 .parent = &per_l4_ick,
2776 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2777 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002778 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002779 .recalc = &followparent_recalc,
2780};
2781
2782static struct clk gpt5_ick = {
2783 .name = "gpt5_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002784 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002785 .parent = &per_l4_ick,
2786 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2787 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002788 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002789 .recalc = &followparent_recalc,
2790};
2791
2792static struct clk gpt4_ick = {
2793 .name = "gpt4_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002794 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002795 .parent = &per_l4_ick,
2796 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2797 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002798 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002799 .recalc = &followparent_recalc,
2800};
2801
2802static struct clk gpt3_ick = {
2803 .name = "gpt3_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002804 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002805 .parent = &per_l4_ick,
2806 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2807 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002808 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002809 .recalc = &followparent_recalc,
2810};
2811
2812static struct clk gpt2_ick = {
2813 .name = "gpt2_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002814 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002815 .parent = &per_l4_ick,
2816 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2817 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002818 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002819 .recalc = &followparent_recalc,
2820};
2821
2822static struct clk mcbsp2_ick = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002823 .name = "mcbsp_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002824 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002825 .id = 2,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002826 .parent = &per_l4_ick,
2827 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2828 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002829 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002830 .recalc = &followparent_recalc,
2831};
2832
2833static struct clk mcbsp3_ick = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002834 .name = "mcbsp_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002835 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002836 .id = 3,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002837 .parent = &per_l4_ick,
2838 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2839 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002840 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002841 .recalc = &followparent_recalc,
2842};
2843
2844static struct clk mcbsp4_ick = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002845 .name = "mcbsp_ick",
Russell Kingb36ee722008-11-04 17:59:52 +00002846 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002847 .id = 4,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002848 .parent = &per_l4_ick,
2849 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2850 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
Paul Walmsley333943b2008-08-19 11:08:45 +03002851 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002852 .recalc = &followparent_recalc,
2853};
2854
2855static const struct clksel mcbsp_234_clksel[] = {
Paul Walmsley9cfd9852009-01-27 19:13:02 -07002856 { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
2857 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
Paul Walmsleyb045d082008-03-18 11:24:28 +02002858 { .parent = NULL }
2859};
2860
2861static struct clk mcbsp2_fck = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002862 .name = "mcbsp_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002863 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002864 .id = 2,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002865 .init = &omap2_init_clksel_parent,
2866 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2867 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2868 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
2869 .clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
2870 .clksel = mcbsp_234_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002871 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002872 .recalc = &omap2_clksel_recalc,
2873};
2874
2875static struct clk mcbsp3_fck = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002876 .name = "mcbsp_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002877 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002878 .id = 3,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002879 .init = &omap2_init_clksel_parent,
2880 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2881 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2882 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2883 .clksel_mask = OMAP2_MCBSP3_CLKS_MASK,
2884 .clksel = mcbsp_234_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002885 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002886 .recalc = &omap2_clksel_recalc,
2887};
2888
2889static struct clk mcbsp4_fck = {
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002890 .name = "mcbsp_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00002891 .ops = &clkops_omap2_dflt_wait,
Eduardo Valentin78673bc2008-07-03 12:24:40 +03002892 .id = 4,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002893 .init = &omap2_init_clksel_parent,
2894 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2895 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2896 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2897 .clksel_mask = OMAP2_MCBSP4_CLKS_MASK,
2898 .clksel = mcbsp_234_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03002899 .clkdm_name = "per_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002900 .recalc = &omap2_clksel_recalc,
2901};
2902
2903/* EMU clocks */
2904
2905/* More information: ARM Cortex-A8 Technical Reference Manual, sect 10.1 */
2906
2907static const struct clksel_rate emu_src_sys_rates[] = {
2908 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
2909 { .div = 0 },
2910};
2911
2912static const struct clksel_rate emu_src_core_rates[] = {
2913 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
2914 { .div = 0 },
2915};
2916
2917static const struct clksel_rate emu_src_per_rates[] = {
2918 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
2919 { .div = 0 },
2920};
2921
2922static const struct clksel_rate emu_src_mpu_rates[] = {
2923 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
2924 { .div = 0 },
2925};
2926
2927static const struct clksel emu_src_clksel[] = {
2928 { .parent = &sys_ck, .rates = emu_src_sys_rates },
2929 { .parent = &emu_core_alwon_ck, .rates = emu_src_core_rates },
2930 { .parent = &emu_per_alwon_ck, .rates = emu_src_per_rates },
2931 { .parent = &emu_mpu_alwon_ck, .rates = emu_src_mpu_rates },
2932 { .parent = NULL },
2933};
2934
2935/*
2936 * Like the clkout_src clocks, emu_src_clk is a virtual clock, existing only
2937 * to switch the source of some of the EMU clocks.
2938 * XXX Are there CLKEN bits for these EMU clks?
2939 */
2940static struct clk emu_src_ck = {
2941 .name = "emu_src_ck",
Russell King897dcde2008-11-04 16:35:03 +00002942 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002943 .init = &omap2_init_clksel_parent,
2944 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2945 .clksel_mask = OMAP3430_MUX_CTRL_MASK,
2946 .clksel = emu_src_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00002947 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002948 .clkdm_name = "emu_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002949 .recalc = &omap2_clksel_recalc,
2950};
2951
2952static const struct clksel_rate pclk_emu_rates[] = {
2953 { .div = 2, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
2954 { .div = 3, .val = 3, .flags = RATE_IN_343X },
2955 { .div = 4, .val = 4, .flags = RATE_IN_343X },
2956 { .div = 6, .val = 6, .flags = RATE_IN_343X },
2957 { .div = 0 },
2958};
2959
2960static const struct clksel pclk_emu_clksel[] = {
2961 { .parent = &emu_src_ck, .rates = pclk_emu_rates },
2962 { .parent = NULL },
2963};
2964
2965static struct clk pclk_fck = {
2966 .name = "pclk_fck",
Russell King897dcde2008-11-04 16:35:03 +00002967 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002968 .init = &omap2_init_clksel_parent,
2969 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2970 .clksel_mask = OMAP3430_CLKSEL_PCLK_MASK,
2971 .clksel = pclk_emu_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00002972 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002973 .clkdm_name = "emu_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002974 .recalc = &omap2_clksel_recalc,
2975};
2976
2977static const struct clksel_rate pclkx2_emu_rates[] = {
2978 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
2979 { .div = 2, .val = 2, .flags = RATE_IN_343X },
2980 { .div = 3, .val = 3, .flags = RATE_IN_343X },
2981 { .div = 0 },
2982};
2983
2984static const struct clksel pclkx2_emu_clksel[] = {
2985 { .parent = &emu_src_ck, .rates = pclkx2_emu_rates },
2986 { .parent = NULL },
2987};
2988
2989static struct clk pclkx2_fck = {
2990 .name = "pclkx2_fck",
Russell King897dcde2008-11-04 16:35:03 +00002991 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02002992 .init = &omap2_init_clksel_parent,
2993 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2994 .clksel_mask = OMAP3430_CLKSEL_PCLKX2_MASK,
2995 .clksel = pclkx2_emu_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00002996 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03002997 .clkdm_name = "emu_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02002998 .recalc = &omap2_clksel_recalc,
2999};
3000
3001static const struct clksel atclk_emu_clksel[] = {
3002 { .parent = &emu_src_ck, .rates = div2_rates },
3003 { .parent = NULL },
3004};
3005
3006static struct clk atclk_fck = {
3007 .name = "atclk_fck",
Russell King897dcde2008-11-04 16:35:03 +00003008 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003009 .init = &omap2_init_clksel_parent,
3010 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3011 .clksel_mask = OMAP3430_CLKSEL_ATCLK_MASK,
3012 .clksel = atclk_emu_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00003013 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03003014 .clkdm_name = "emu_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02003015 .recalc = &omap2_clksel_recalc,
3016};
3017
3018static struct clk traceclk_src_fck = {
3019 .name = "traceclk_src_fck",
Russell King897dcde2008-11-04 16:35:03 +00003020 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003021 .init = &omap2_init_clksel_parent,
3022 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3023 .clksel_mask = OMAP3430_TRACE_MUX_CTRL_MASK,
3024 .clksel = emu_src_clksel,
Russell King44dc9d02009-01-19 15:51:11 +00003025 .flags = RATE_PROPAGATES,
Paul Walmsley333943b2008-08-19 11:08:45 +03003026 .clkdm_name = "emu_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02003027 .recalc = &omap2_clksel_recalc,
3028};
3029
3030static const struct clksel_rate traceclk_rates[] = {
3031 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
3032 { .div = 2, .val = 2, .flags = RATE_IN_343X },
3033 { .div = 4, .val = 4, .flags = RATE_IN_343X },
3034 { .div = 0 },
3035};
3036
3037static const struct clksel traceclk_clksel[] = {
3038 { .parent = &traceclk_src_fck, .rates = traceclk_rates },
3039 { .parent = NULL },
3040};
3041
3042static struct clk traceclk_fck = {
3043 .name = "traceclk_fck",
Russell King897dcde2008-11-04 16:35:03 +00003044 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003045 .init = &omap2_init_clksel_parent,
3046 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3047 .clksel_mask = OMAP3430_CLKSEL_TRACECLK_MASK,
3048 .clksel = traceclk_clksel,
Paul Walmsley333943b2008-08-19 11:08:45 +03003049 .clkdm_name = "emu_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02003050 .recalc = &omap2_clksel_recalc,
3051};
3052
3053/* SR clocks */
3054
3055/* SmartReflex fclk (VDD1) */
3056static struct clk sr1_fck = {
3057 .name = "sr1_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00003058 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003059 .parent = &sys_ck,
3060 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
3061 .enable_bit = OMAP3430_EN_SR1_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +00003062 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003063 .recalc = &followparent_recalc,
3064};
3065
3066/* SmartReflex fclk (VDD2) */
3067static struct clk sr2_fck = {
3068 .name = "sr2_fck",
Russell Kingb36ee722008-11-04 17:59:52 +00003069 .ops = &clkops_omap2_dflt_wait,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003070 .parent = &sys_ck,
3071 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
3072 .enable_bit = OMAP3430_EN_SR2_SHIFT,
Russell King44dc9d02009-01-19 15:51:11 +00003073 .flags = RATE_PROPAGATES,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003074 .recalc = &followparent_recalc,
3075};
3076
3077static struct clk sr_l4_ick = {
3078 .name = "sr_l4_ick",
Russell King897dcde2008-11-04 16:35:03 +00003079 .ops = &clkops_null, /* RMK: missing? */
Paul Walmsleyb045d082008-03-18 11:24:28 +02003080 .parent = &l4_ick,
Paul Walmsley333943b2008-08-19 11:08:45 +03003081 .clkdm_name = "core_l4_clkdm",
Paul Walmsleyb045d082008-03-18 11:24:28 +02003082 .recalc = &followparent_recalc,
3083};
3084
3085/* SECURE_32K_FCK clocks */
3086
Paul Walmsley333943b2008-08-19 11:08:45 +03003087/* XXX This clock no longer exists in 3430 TRM rev F */
Paul Walmsleyb045d082008-03-18 11:24:28 +02003088static struct clk gpt12_fck = {
3089 .name = "gpt12_fck",
Russell King897dcde2008-11-04 16:35:03 +00003090 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003091 .parent = &secure_32k_fck,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003092 .recalc = &followparent_recalc,
3093};
3094
3095static struct clk wdt1_fck = {
3096 .name = "wdt1_fck",
Russell King897dcde2008-11-04 16:35:03 +00003097 .ops = &clkops_null,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003098 .parent = &secure_32k_fck,
Paul Walmsleyb045d082008-03-18 11:24:28 +02003099 .recalc = &followparent_recalc,
3100};
3101
Paul Walmsleyb045d082008-03-18 11:24:28 +02003102#endif