Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-omap2/clock2420_data.c
10817 views
1
/*
2
* OMAP2420 clock data
3
*
4
* Copyright (C) 2005-2009 Texas Instruments, Inc.
5
* Copyright (C) 2004-2011 Nokia Corporation
6
*
7
* Contacts:
8
* Richard Woodruff <[email protected]>
9
* Paul Walmsley
10
*
11
* This program is free software; you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License version 2 as
13
* published by the Free Software Foundation.
14
*/
15
16
#include <linux/kernel.h>
17
#include <linux/clk.h>
18
#include <linux/list.h>
19
20
#include <plat/clkdev_omap.h>
21
22
#include "clock.h"
23
#include "clock2xxx.h"
24
#include "opp2xxx.h"
25
#include "cm2xxx_3xxx.h"
26
#include "prm2xxx_3xxx.h"
27
#include "prm-regbits-24xx.h"
28
#include "cm-regbits-24xx.h"
29
#include "sdrc.h"
30
#include "control.h"
31
32
#define OMAP_CM_REGADDR OMAP2420_CM_REGADDR
33
34
/*
35
* 2420 clock tree.
36
*
37
* NOTE:In many cases here we are assigning a 'default' parent. In
38
* many cases the parent is selectable. The set parent calls will
39
* also switch sources.
40
*
41
* Several sources are given initial rates which may be wrong, this will
42
* be fixed up in the init func.
43
*
44
* Things are broadly separated below by clock domains. It is
45
* noteworthy that most peripherals have dependencies on multiple clock
46
* domains. Many get their interface clocks from the L4 domain, but get
47
* functional clocks from fixed sources or other core domain derived
48
* clocks.
49
*/
50
51
/* Base external input clocks */
52
static struct clk func_32k_ck = {
53
.name = "func_32k_ck",
54
.ops = &clkops_null,
55
.rate = 32768,
56
.clkdm_name = "wkup_clkdm",
57
};
58
59
static struct clk secure_32k_ck = {
60
.name = "secure_32k_ck",
61
.ops = &clkops_null,
62
.rate = 32768,
63
.clkdm_name = "wkup_clkdm",
64
};
65
66
/* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */
67
static struct clk osc_ck = { /* (*12, *13, 19.2, *26, 38.4)MHz */
68
.name = "osc_ck",
69
.ops = &clkops_oscck,
70
.clkdm_name = "wkup_clkdm",
71
.recalc = &omap2_osc_clk_recalc,
72
};
73
74
/* Without modem likely 12MHz, with modem likely 13MHz */
75
static struct clk sys_ck = { /* (*12, *13, 19.2, 26, 38.4)MHz */
76
.name = "sys_ck", /* ~ ref_clk also */
77
.ops = &clkops_null,
78
.parent = &osc_ck,
79
.clkdm_name = "wkup_clkdm",
80
.recalc = &omap2xxx_sys_clk_recalc,
81
};
82
83
static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */
84
.name = "alt_ck",
85
.ops = &clkops_null,
86
.rate = 54000000,
87
.clkdm_name = "wkup_clkdm",
88
};
89
90
/* Optional external clock input for McBSP CLKS */
91
static struct clk mcbsp_clks = {
92
.name = "mcbsp_clks",
93
.ops = &clkops_null,
94
};
95
96
/*
97
* Analog domain root source clocks
98
*/
99
100
/* dpll_ck, is broken out in to special cases through clksel */
101
/* REVISIT: Rate changes on dpll_ck trigger a full set change. ...
102
* deal with this
103
*/
104
105
static struct dpll_data dpll_dd = {
106
.mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
107
.mult_mask = OMAP24XX_DPLL_MULT_MASK,
108
.div1_mask = OMAP24XX_DPLL_DIV_MASK,
109
.clk_bypass = &sys_ck,
110
.clk_ref = &sys_ck,
111
.control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
112
.enable_mask = OMAP24XX_EN_DPLL_MASK,
113
.max_multiplier = 1023,
114
.min_divider = 1,
115
.max_divider = 16,
116
};
117
118
/*
119
* XXX Cannot add round_rate here yet, as this is still a composite clock,
120
* not just a DPLL
121
*/
122
static struct clk dpll_ck = {
123
.name = "dpll_ck",
124
.ops = &clkops_omap2xxx_dpll_ops,
125
.parent = &sys_ck, /* Can be func_32k also */
126
.dpll_data = &dpll_dd,
127
.clkdm_name = "wkup_clkdm",
128
.recalc = &omap2_dpllcore_recalc,
129
.set_rate = &omap2_reprogram_dpllcore,
130
};
131
132
static struct clk apll96_ck = {
133
.name = "apll96_ck",
134
.ops = &clkops_apll96,
135
.parent = &sys_ck,
136
.rate = 96000000,
137
.flags = ENABLE_ON_INIT,
138
.clkdm_name = "wkup_clkdm",
139
.enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
140
.enable_bit = OMAP24XX_EN_96M_PLL_SHIFT,
141
};
142
143
static struct clk apll54_ck = {
144
.name = "apll54_ck",
145
.ops = &clkops_apll54,
146
.parent = &sys_ck,
147
.rate = 54000000,
148
.flags = ENABLE_ON_INIT,
149
.clkdm_name = "wkup_clkdm",
150
.enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
151
.enable_bit = OMAP24XX_EN_54M_PLL_SHIFT,
152
};
153
154
/*
155
* PRCM digital base sources
156
*/
157
158
/* func_54m_ck */
159
160
static const struct clksel_rate func_54m_apll54_rates[] = {
161
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
162
{ .div = 0 },
163
};
164
165
static const struct clksel_rate func_54m_alt_rates[] = {
166
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
167
{ .div = 0 },
168
};
169
170
static const struct clksel func_54m_clksel[] = {
171
{ .parent = &apll54_ck, .rates = func_54m_apll54_rates, },
172
{ .parent = &alt_ck, .rates = func_54m_alt_rates, },
173
{ .parent = NULL },
174
};
175
176
static struct clk func_54m_ck = {
177
.name = "func_54m_ck",
178
.ops = &clkops_null,
179
.parent = &apll54_ck, /* can also be alt_clk */
180
.clkdm_name = "wkup_clkdm",
181
.init = &omap2_init_clksel_parent,
182
.clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
183
.clksel_mask = OMAP24XX_54M_SOURCE_MASK,
184
.clksel = func_54m_clksel,
185
.recalc = &omap2_clksel_recalc,
186
};
187
188
static struct clk core_ck = {
189
.name = "core_ck",
190
.ops = &clkops_null,
191
.parent = &dpll_ck, /* can also be 32k */
192
.clkdm_name = "wkup_clkdm",
193
.recalc = &followparent_recalc,
194
};
195
196
static struct clk func_96m_ck = {
197
.name = "func_96m_ck",
198
.ops = &clkops_null,
199
.parent = &apll96_ck,
200
.clkdm_name = "wkup_clkdm",
201
.recalc = &followparent_recalc,
202
};
203
204
/* func_48m_ck */
205
206
static const struct clksel_rate func_48m_apll96_rates[] = {
207
{ .div = 2, .val = 0, .flags = RATE_IN_24XX },
208
{ .div = 0 },
209
};
210
211
static const struct clksel_rate func_48m_alt_rates[] = {
212
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
213
{ .div = 0 },
214
};
215
216
static const struct clksel func_48m_clksel[] = {
217
{ .parent = &apll96_ck, .rates = func_48m_apll96_rates },
218
{ .parent = &alt_ck, .rates = func_48m_alt_rates },
219
{ .parent = NULL }
220
};
221
222
static struct clk func_48m_ck = {
223
.name = "func_48m_ck",
224
.ops = &clkops_null,
225
.parent = &apll96_ck, /* 96M or Alt */
226
.clkdm_name = "wkup_clkdm",
227
.init = &omap2_init_clksel_parent,
228
.clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
229
.clksel_mask = OMAP24XX_48M_SOURCE_MASK,
230
.clksel = func_48m_clksel,
231
.recalc = &omap2_clksel_recalc,
232
.round_rate = &omap2_clksel_round_rate,
233
.set_rate = &omap2_clksel_set_rate
234
};
235
236
static struct clk func_12m_ck = {
237
.name = "func_12m_ck",
238
.ops = &clkops_null,
239
.parent = &func_48m_ck,
240
.fixed_div = 4,
241
.clkdm_name = "wkup_clkdm",
242
.recalc = &omap_fixed_divisor_recalc,
243
};
244
245
/* Secure timer, only available in secure mode */
246
static struct clk wdt1_osc_ck = {
247
.name = "ck_wdt1_osc",
248
.ops = &clkops_null, /* RMK: missing? */
249
.parent = &osc_ck,
250
.recalc = &followparent_recalc,
251
};
252
253
/*
254
* The common_clkout* clksel_rate structs are common to
255
* sys_clkout, sys_clkout_src, sys_clkout2, and sys_clkout2_src.
256
* sys_clkout2_* are 2420-only, so the
257
* clksel_rate flags fields are inaccurate for those clocks. This is
258
* harmless since access to those clocks are gated by the struct clk
259
* flags fields, which mark them as 2420-only.
260
*/
261
static const struct clksel_rate common_clkout_src_core_rates[] = {
262
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
263
{ .div = 0 }
264
};
265
266
static const struct clksel_rate common_clkout_src_sys_rates[] = {
267
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
268
{ .div = 0 }
269
};
270
271
static const struct clksel_rate common_clkout_src_96m_rates[] = {
272
{ .div = 1, .val = 2, .flags = RATE_IN_24XX },
273
{ .div = 0 }
274
};
275
276
static const struct clksel_rate common_clkout_src_54m_rates[] = {
277
{ .div = 1, .val = 3, .flags = RATE_IN_24XX },
278
{ .div = 0 }
279
};
280
281
static const struct clksel common_clkout_src_clksel[] = {
282
{ .parent = &core_ck, .rates = common_clkout_src_core_rates },
283
{ .parent = &sys_ck, .rates = common_clkout_src_sys_rates },
284
{ .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },
285
{ .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },
286
{ .parent = NULL }
287
};
288
289
static struct clk sys_clkout_src = {
290
.name = "sys_clkout_src",
291
.ops = &clkops_omap2_dflt,
292
.parent = &func_54m_ck,
293
.clkdm_name = "wkup_clkdm",
294
.enable_reg = OMAP2420_PRCM_CLKOUT_CTRL,
295
.enable_bit = OMAP24XX_CLKOUT_EN_SHIFT,
296
.init = &omap2_init_clksel_parent,
297
.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
298
.clksel_mask = OMAP24XX_CLKOUT_SOURCE_MASK,
299
.clksel = common_clkout_src_clksel,
300
.recalc = &omap2_clksel_recalc,
301
.round_rate = &omap2_clksel_round_rate,
302
.set_rate = &omap2_clksel_set_rate
303
};
304
305
static const struct clksel_rate common_clkout_rates[] = {
306
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
307
{ .div = 2, .val = 1, .flags = RATE_IN_24XX },
308
{ .div = 4, .val = 2, .flags = RATE_IN_24XX },
309
{ .div = 8, .val = 3, .flags = RATE_IN_24XX },
310
{ .div = 16, .val = 4, .flags = RATE_IN_24XX },
311
{ .div = 0 },
312
};
313
314
static const struct clksel sys_clkout_clksel[] = {
315
{ .parent = &sys_clkout_src, .rates = common_clkout_rates },
316
{ .parent = NULL }
317
};
318
319
static struct clk sys_clkout = {
320
.name = "sys_clkout",
321
.ops = &clkops_null,
322
.parent = &sys_clkout_src,
323
.clkdm_name = "wkup_clkdm",
324
.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
325
.clksel_mask = OMAP24XX_CLKOUT_DIV_MASK,
326
.clksel = sys_clkout_clksel,
327
.recalc = &omap2_clksel_recalc,
328
.round_rate = &omap2_clksel_round_rate,
329
.set_rate = &omap2_clksel_set_rate
330
};
331
332
/* In 2430, new in 2420 ES2 */
333
static struct clk sys_clkout2_src = {
334
.name = "sys_clkout2_src",
335
.ops = &clkops_omap2_dflt,
336
.parent = &func_54m_ck,
337
.clkdm_name = "wkup_clkdm",
338
.enable_reg = OMAP2420_PRCM_CLKOUT_CTRL,
339
.enable_bit = OMAP2420_CLKOUT2_EN_SHIFT,
340
.init = &omap2_init_clksel_parent,
341
.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
342
.clksel_mask = OMAP2420_CLKOUT2_SOURCE_MASK,
343
.clksel = common_clkout_src_clksel,
344
.recalc = &omap2_clksel_recalc,
345
.round_rate = &omap2_clksel_round_rate,
346
.set_rate = &omap2_clksel_set_rate
347
};
348
349
static const struct clksel sys_clkout2_clksel[] = {
350
{ .parent = &sys_clkout2_src, .rates = common_clkout_rates },
351
{ .parent = NULL }
352
};
353
354
/* In 2430, new in 2420 ES2 */
355
static struct clk sys_clkout2 = {
356
.name = "sys_clkout2",
357
.ops = &clkops_null,
358
.parent = &sys_clkout2_src,
359
.clkdm_name = "wkup_clkdm",
360
.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
361
.clksel_mask = OMAP2420_CLKOUT2_DIV_MASK,
362
.clksel = sys_clkout2_clksel,
363
.recalc = &omap2_clksel_recalc,
364
.round_rate = &omap2_clksel_round_rate,
365
.set_rate = &omap2_clksel_set_rate
366
};
367
368
static struct clk emul_ck = {
369
.name = "emul_ck",
370
.ops = &clkops_omap2_dflt,
371
.parent = &func_54m_ck,
372
.clkdm_name = "wkup_clkdm",
373
.enable_reg = OMAP2420_PRCM_CLKEMUL_CTRL,
374
.enable_bit = OMAP24XX_EMULATION_EN_SHIFT,
375
.recalc = &followparent_recalc,
376
377
};
378
379
/*
380
* MPU clock domain
381
* Clocks:
382
* MPU_FCLK, MPU_ICLK
383
* INT_M_FCLK, INT_M_I_CLK
384
*
385
* - Individual clocks are hardware managed.
386
* - Base divider comes from: CM_CLKSEL_MPU
387
*
388
*/
389
static const struct clksel_rate mpu_core_rates[] = {
390
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
391
{ .div = 2, .val = 2, .flags = RATE_IN_24XX },
392
{ .div = 4, .val = 4, .flags = RATE_IN_242X },
393
{ .div = 6, .val = 6, .flags = RATE_IN_242X },
394
{ .div = 8, .val = 8, .flags = RATE_IN_242X },
395
{ .div = 0 },
396
};
397
398
static const struct clksel mpu_clksel[] = {
399
{ .parent = &core_ck, .rates = mpu_core_rates },
400
{ .parent = NULL }
401
};
402
403
static struct clk mpu_ck = { /* Control cpu */
404
.name = "mpu_ck",
405
.ops = &clkops_null,
406
.parent = &core_ck,
407
.clkdm_name = "mpu_clkdm",
408
.init = &omap2_init_clksel_parent,
409
.clksel_reg = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
410
.clksel_mask = OMAP24XX_CLKSEL_MPU_MASK,
411
.clksel = mpu_clksel,
412
.recalc = &omap2_clksel_recalc,
413
};
414
415
/*
416
* DSP (2420-UMA+IVA1) clock domain
417
* Clocks:
418
* 2420: UMA_FCLK, UMA_ICLK, IVA_MPU, IVA_COP
419
*
420
* Won't be too specific here. The core clock comes into this block
421
* it is divided then tee'ed. One branch goes directly to xyz enable
422
* controls. The other branch gets further divided by 2 then possibly
423
* routed into a synchronizer and out of clocks abc.
424
*/
425
static const struct clksel_rate dsp_fck_core_rates[] = {
426
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
427
{ .div = 2, .val = 2, .flags = RATE_IN_24XX },
428
{ .div = 3, .val = 3, .flags = RATE_IN_24XX },
429
{ .div = 4, .val = 4, .flags = RATE_IN_24XX },
430
{ .div = 6, .val = 6, .flags = RATE_IN_242X },
431
{ .div = 8, .val = 8, .flags = RATE_IN_242X },
432
{ .div = 12, .val = 12, .flags = RATE_IN_242X },
433
{ .div = 0 },
434
};
435
436
static const struct clksel dsp_fck_clksel[] = {
437
{ .parent = &core_ck, .rates = dsp_fck_core_rates },
438
{ .parent = NULL }
439
};
440
441
static struct clk dsp_fck = {
442
.name = "dsp_fck",
443
.ops = &clkops_omap2_dflt_wait,
444
.parent = &core_ck,
445
.clkdm_name = "dsp_clkdm",
446
.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
447
.enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
448
.clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
449
.clksel_mask = OMAP24XX_CLKSEL_DSP_MASK,
450
.clksel = dsp_fck_clksel,
451
.recalc = &omap2_clksel_recalc,
452
};
453
454
static const struct clksel dsp_ick_clksel[] = {
455
{ .parent = &dsp_fck, .rates = dsp_ick_rates },
456
{ .parent = NULL }
457
};
458
459
static struct clk dsp_ick = {
460
.name = "dsp_ick", /* apparently ipi and isp */
461
.ops = &clkops_omap2_iclk_dflt_wait,
462
.parent = &dsp_fck,
463
.clkdm_name = "dsp_clkdm",
464
.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN),
465
.enable_bit = OMAP2420_EN_DSP_IPI_SHIFT, /* for ipi */
466
.clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
467
.clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK,
468
.clksel = dsp_ick_clksel,
469
.recalc = &omap2_clksel_recalc,
470
};
471
472
/*
473
* The IVA1 is an ARM7 core on the 2420 that has nothing to do with
474
* the C54x, but which is contained in the DSP powerdomain. Does not
475
* exist on later OMAPs.
476
*/
477
static struct clk iva1_ifck = {
478
.name = "iva1_ifck",
479
.ops = &clkops_omap2_dflt_wait,
480
.parent = &core_ck,
481
.clkdm_name = "iva1_clkdm",
482
.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
483
.enable_bit = OMAP2420_EN_IVA_COP_SHIFT,
484
.clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
485
.clksel_mask = OMAP2420_CLKSEL_IVA_MASK,
486
.clksel = dsp_fck_clksel,
487
.recalc = &omap2_clksel_recalc,
488
};
489
490
/* IVA1 mpu/int/i/f clocks are /2 of parent */
491
static struct clk iva1_mpu_int_ifck = {
492
.name = "iva1_mpu_int_ifck",
493
.ops = &clkops_omap2_dflt_wait,
494
.parent = &iva1_ifck,
495
.clkdm_name = "iva1_clkdm",
496
.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
497
.enable_bit = OMAP2420_EN_IVA_MPU_SHIFT,
498
.fixed_div = 2,
499
.recalc = &omap_fixed_divisor_recalc,
500
};
501
502
/*
503
* L3 clock domain
504
* L3 clocks are used for both interface and functional clocks to
505
* multiple entities. Some of these clocks are completely managed
506
* by hardware, and some others allow software control. Hardware
507
* managed ones general are based on directly CLK_REQ signals and
508
* various auto idle settings. The functional spec sets many of these
509
* as 'tie-high' for their enables.
510
*
511
* I-CLOCKS:
512
* L3-Interconnect, SMS, GPMC, SDRC, OCM_RAM, OCM_ROM, SDMA
513
* CAM, HS-USB.
514
* F-CLOCK
515
* SSI.
516
*
517
* GPMC memories and SDRC have timing and clock sensitive registers which
518
* may very well need notification when the clock changes. Currently for low
519
* operating points, these are taken care of in sleep.S.
520
*/
521
static const struct clksel_rate core_l3_core_rates[] = {
522
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
523
{ .div = 2, .val = 2, .flags = RATE_IN_242X },
524
{ .div = 4, .val = 4, .flags = RATE_IN_24XX },
525
{ .div = 6, .val = 6, .flags = RATE_IN_24XX },
526
{ .div = 8, .val = 8, .flags = RATE_IN_242X },
527
{ .div = 12, .val = 12, .flags = RATE_IN_242X },
528
{ .div = 16, .val = 16, .flags = RATE_IN_242X },
529
{ .div = 0 }
530
};
531
532
static const struct clksel core_l3_clksel[] = {
533
{ .parent = &core_ck, .rates = core_l3_core_rates },
534
{ .parent = NULL }
535
};
536
537
static struct clk core_l3_ck = { /* Used for ick and fck, interconnect */
538
.name = "core_l3_ck",
539
.ops = &clkops_null,
540
.parent = &core_ck,
541
.clkdm_name = "core_l3_clkdm",
542
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
543
.clksel_mask = OMAP24XX_CLKSEL_L3_MASK,
544
.clksel = core_l3_clksel,
545
.recalc = &omap2_clksel_recalc,
546
};
547
548
/* usb_l4_ick */
549
static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {
550
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
551
{ .div = 2, .val = 2, .flags = RATE_IN_24XX },
552
{ .div = 4, .val = 4, .flags = RATE_IN_24XX },
553
{ .div = 0 }
554
};
555
556
static const struct clksel usb_l4_ick_clksel[] = {
557
{ .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },
558
{ .parent = NULL },
559
};
560
561
/* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */
562
static struct clk usb_l4_ick = { /* FS-USB interface clock */
563
.name = "usb_l4_ick",
564
.ops = &clkops_omap2_iclk_dflt_wait,
565
.parent = &core_l3_ck,
566
.clkdm_name = "core_l4_clkdm",
567
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
568
.enable_bit = OMAP24XX_EN_USB_SHIFT,
569
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
570
.clksel_mask = OMAP24XX_CLKSEL_USB_MASK,
571
.clksel = usb_l4_ick_clksel,
572
.recalc = &omap2_clksel_recalc,
573
};
574
575
/*
576
* L4 clock management domain
577
*
578
* This domain contains lots of interface clocks from the L4 interface, some
579
* functional clocks. Fixed APLL functional source clocks are managed in
580
* this domain.
581
*/
582
static const struct clksel_rate l4_core_l3_rates[] = {
583
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
584
{ .div = 2, .val = 2, .flags = RATE_IN_24XX },
585
{ .div = 0 }
586
};
587
588
static const struct clksel l4_clksel[] = {
589
{ .parent = &core_l3_ck, .rates = l4_core_l3_rates },
590
{ .parent = NULL }
591
};
592
593
static struct clk l4_ck = { /* used both as an ick and fck */
594
.name = "l4_ck",
595
.ops = &clkops_null,
596
.parent = &core_l3_ck,
597
.clkdm_name = "core_l4_clkdm",
598
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
599
.clksel_mask = OMAP24XX_CLKSEL_L4_MASK,
600
.clksel = l4_clksel,
601
.recalc = &omap2_clksel_recalc,
602
};
603
604
/*
605
* SSI is in L3 management domain, its direct parent is core not l3,
606
* many core power domain entities are grouped into the L3 clock
607
* domain.
608
* SSI_SSR_FCLK, SSI_SST_FCLK, SSI_L4_ICLK
609
*
610
* ssr = core/1/2/3/4/5, sst = 1/2 ssr.
611
*/
612
static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
613
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
614
{ .div = 2, .val = 2, .flags = RATE_IN_24XX },
615
{ .div = 3, .val = 3, .flags = RATE_IN_24XX },
616
{ .div = 4, .val = 4, .flags = RATE_IN_24XX },
617
{ .div = 6, .val = 6, .flags = RATE_IN_242X },
618
{ .div = 8, .val = 8, .flags = RATE_IN_242X },
619
{ .div = 0 }
620
};
621
622
static const struct clksel ssi_ssr_sst_fck_clksel[] = {
623
{ .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },
624
{ .parent = NULL }
625
};
626
627
static struct clk ssi_ssr_sst_fck = {
628
.name = "ssi_fck",
629
.ops = &clkops_omap2_dflt_wait,
630
.parent = &core_ck,
631
.clkdm_name = "core_l3_clkdm",
632
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
633
.enable_bit = OMAP24XX_EN_SSI_SHIFT,
634
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
635
.clksel_mask = OMAP24XX_CLKSEL_SSI_MASK,
636
.clksel = ssi_ssr_sst_fck_clksel,
637
.recalc = &omap2_clksel_recalc,
638
};
639
640
/*
641
* Presumably this is the same as SSI_ICLK.
642
* TRM contradicts itself on what clockdomain SSI_ICLK is in
643
*/
644
static struct clk ssi_l4_ick = {
645
.name = "ssi_l4_ick",
646
.ops = &clkops_omap2_iclk_dflt_wait,
647
.parent = &l4_ck,
648
.clkdm_name = "core_l4_clkdm",
649
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
650
.enable_bit = OMAP24XX_EN_SSI_SHIFT,
651
.recalc = &followparent_recalc,
652
};
653
654
655
/*
656
* GFX clock domain
657
* Clocks:
658
* GFX_FCLK, GFX_ICLK
659
* GFX_CG1(2d), GFX_CG2(3d)
660
*
661
* GFX_FCLK runs from L3, and is divided by (1,2,3,4)
662
* The 2d and 3d clocks run at a hardware determined
663
* divided value of fclk.
664
*
665
*/
666
667
/* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */
668
static const struct clksel gfx_fck_clksel[] = {
669
{ .parent = &core_l3_ck, .rates = gfx_l3_rates },
670
{ .parent = NULL },
671
};
672
673
static struct clk gfx_3d_fck = {
674
.name = "gfx_3d_fck",
675
.ops = &clkops_omap2_dflt_wait,
676
.parent = &core_l3_ck,
677
.clkdm_name = "gfx_clkdm",
678
.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
679
.enable_bit = OMAP24XX_EN_3D_SHIFT,
680
.clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
681
.clksel_mask = OMAP_CLKSEL_GFX_MASK,
682
.clksel = gfx_fck_clksel,
683
.recalc = &omap2_clksel_recalc,
684
.round_rate = &omap2_clksel_round_rate,
685
.set_rate = &omap2_clksel_set_rate
686
};
687
688
static struct clk gfx_2d_fck = {
689
.name = "gfx_2d_fck",
690
.ops = &clkops_omap2_dflt_wait,
691
.parent = &core_l3_ck,
692
.clkdm_name = "gfx_clkdm",
693
.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
694
.enable_bit = OMAP24XX_EN_2D_SHIFT,
695
.clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
696
.clksel_mask = OMAP_CLKSEL_GFX_MASK,
697
.clksel = gfx_fck_clksel,
698
.recalc = &omap2_clksel_recalc,
699
};
700
701
/* This interface clock does not have a CM_AUTOIDLE bit */
702
static struct clk gfx_ick = {
703
.name = "gfx_ick", /* From l3 */
704
.ops = &clkops_omap2_dflt_wait,
705
.parent = &core_l3_ck,
706
.clkdm_name = "gfx_clkdm",
707
.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
708
.enable_bit = OMAP_EN_GFX_SHIFT,
709
.recalc = &followparent_recalc,
710
};
711
712
/*
713
* DSS clock domain
714
* CLOCKs:
715
* DSS_L4_ICLK, DSS_L3_ICLK,
716
* DSS_CLK1, DSS_CLK2, DSS_54MHz_CLK
717
*
718
* DSS is both initiator and target.
719
*/
720
/* XXX Add RATE_NOT_VALIDATED */
721
722
static const struct clksel_rate dss1_fck_sys_rates[] = {
723
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
724
{ .div = 0 }
725
};
726
727
static const struct clksel_rate dss1_fck_core_rates[] = {
728
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
729
{ .div = 2, .val = 2, .flags = RATE_IN_24XX },
730
{ .div = 3, .val = 3, .flags = RATE_IN_24XX },
731
{ .div = 4, .val = 4, .flags = RATE_IN_24XX },
732
{ .div = 5, .val = 5, .flags = RATE_IN_24XX },
733
{ .div = 6, .val = 6, .flags = RATE_IN_24XX },
734
{ .div = 8, .val = 8, .flags = RATE_IN_24XX },
735
{ .div = 9, .val = 9, .flags = RATE_IN_24XX },
736
{ .div = 12, .val = 12, .flags = RATE_IN_24XX },
737
{ .div = 16, .val = 16, .flags = RATE_IN_24XX },
738
{ .div = 0 }
739
};
740
741
static const struct clksel dss1_fck_clksel[] = {
742
{ .parent = &sys_ck, .rates = dss1_fck_sys_rates },
743
{ .parent = &core_ck, .rates = dss1_fck_core_rates },
744
{ .parent = NULL },
745
};
746
747
static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */
748
.name = "dss_ick",
749
.ops = &clkops_omap2_iclk_dflt,
750
.parent = &l4_ck, /* really both l3 and l4 */
751
.clkdm_name = "dss_clkdm",
752
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
753
.enable_bit = OMAP24XX_EN_DSS1_SHIFT,
754
.recalc = &followparent_recalc,
755
};
756
757
static struct clk dss1_fck = {
758
.name = "dss1_fck",
759
.ops = &clkops_omap2_dflt,
760
.parent = &core_ck, /* Core or sys */
761
.clkdm_name = "dss_clkdm",
762
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
763
.enable_bit = OMAP24XX_EN_DSS1_SHIFT,
764
.init = &omap2_init_clksel_parent,
765
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
766
.clksel_mask = OMAP24XX_CLKSEL_DSS1_MASK,
767
.clksel = dss1_fck_clksel,
768
.recalc = &omap2_clksel_recalc,
769
};
770
771
static const struct clksel_rate dss2_fck_sys_rates[] = {
772
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
773
{ .div = 0 }
774
};
775
776
static const struct clksel_rate dss2_fck_48m_rates[] = {
777
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
778
{ .div = 0 }
779
};
780
781
static const struct clksel dss2_fck_clksel[] = {
782
{ .parent = &sys_ck, .rates = dss2_fck_sys_rates },
783
{ .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },
784
{ .parent = NULL }
785
};
786
787
static struct clk dss2_fck = { /* Alt clk used in power management */
788
.name = "dss2_fck",
789
.ops = &clkops_omap2_dflt,
790
.parent = &sys_ck, /* fixed at sys_ck or 48MHz */
791
.clkdm_name = "dss_clkdm",
792
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
793
.enable_bit = OMAP24XX_EN_DSS2_SHIFT,
794
.init = &omap2_init_clksel_parent,
795
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
796
.clksel_mask = OMAP24XX_CLKSEL_DSS2_MASK,
797
.clksel = dss2_fck_clksel,
798
.recalc = &omap2_clksel_recalc,
799
};
800
801
static struct clk dss_54m_fck = { /* Alt clk used in power management */
802
.name = "dss_54m_fck", /* 54m tv clk */
803
.ops = &clkops_omap2_dflt_wait,
804
.parent = &func_54m_ck,
805
.clkdm_name = "dss_clkdm",
806
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
807
.enable_bit = OMAP24XX_EN_TV_SHIFT,
808
.recalc = &followparent_recalc,
809
};
810
811
static struct clk wu_l4_ick = {
812
.name = "wu_l4_ick",
813
.ops = &clkops_null,
814
.parent = &sys_ck,
815
.clkdm_name = "wkup_clkdm",
816
.recalc = &followparent_recalc,
817
};
818
819
/*
820
* CORE power domain ICLK & FCLK defines.
821
* Many of the these can have more than one possible parent. Entries
822
* here will likely have an L4 interface parent, and may have multiple
823
* functional clock parents.
824
*/
825
static const struct clksel_rate gpt_alt_rates[] = {
826
{ .div = 1, .val = 2, .flags = RATE_IN_24XX },
827
{ .div = 0 }
828
};
829
830
static const struct clksel omap24xx_gpt_clksel[] = {
831
{ .parent = &func_32k_ck, .rates = gpt_32k_rates },
832
{ .parent = &sys_ck, .rates = gpt_sys_rates },
833
{ .parent = &alt_ck, .rates = gpt_alt_rates },
834
{ .parent = NULL },
835
};
836
837
static struct clk gpt1_ick = {
838
.name = "gpt1_ick",
839
.ops = &clkops_omap2_iclk_dflt_wait,
840
.parent = &wu_l4_ick,
841
.clkdm_name = "wkup_clkdm",
842
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
843
.enable_bit = OMAP24XX_EN_GPT1_SHIFT,
844
.recalc = &followparent_recalc,
845
};
846
847
static struct clk gpt1_fck = {
848
.name = "gpt1_fck",
849
.ops = &clkops_omap2_dflt_wait,
850
.parent = &func_32k_ck,
851
.clkdm_name = "core_l4_clkdm",
852
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
853
.enable_bit = OMAP24XX_EN_GPT1_SHIFT,
854
.init = &omap2_init_clksel_parent,
855
.clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),
856
.clksel_mask = OMAP24XX_CLKSEL_GPT1_MASK,
857
.clksel = omap24xx_gpt_clksel,
858
.recalc = &omap2_clksel_recalc,
859
.round_rate = &omap2_clksel_round_rate,
860
.set_rate = &omap2_clksel_set_rate
861
};
862
863
static struct clk gpt2_ick = {
864
.name = "gpt2_ick",
865
.ops = &clkops_omap2_iclk_dflt_wait,
866
.parent = &l4_ck,
867
.clkdm_name = "core_l4_clkdm",
868
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
869
.enable_bit = OMAP24XX_EN_GPT2_SHIFT,
870
.recalc = &followparent_recalc,
871
};
872
873
static struct clk gpt2_fck = {
874
.name = "gpt2_fck",
875
.ops = &clkops_omap2_dflt_wait,
876
.parent = &func_32k_ck,
877
.clkdm_name = "core_l4_clkdm",
878
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
879
.enable_bit = OMAP24XX_EN_GPT2_SHIFT,
880
.init = &omap2_init_clksel_parent,
881
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
882
.clksel_mask = OMAP24XX_CLKSEL_GPT2_MASK,
883
.clksel = omap24xx_gpt_clksel,
884
.recalc = &omap2_clksel_recalc,
885
};
886
887
static struct clk gpt3_ick = {
888
.name = "gpt3_ick",
889
.ops = &clkops_omap2_iclk_dflt_wait,
890
.parent = &l4_ck,
891
.clkdm_name = "core_l4_clkdm",
892
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
893
.enable_bit = OMAP24XX_EN_GPT3_SHIFT,
894
.recalc = &followparent_recalc,
895
};
896
897
static struct clk gpt3_fck = {
898
.name = "gpt3_fck",
899
.ops = &clkops_omap2_dflt_wait,
900
.parent = &func_32k_ck,
901
.clkdm_name = "core_l4_clkdm",
902
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
903
.enable_bit = OMAP24XX_EN_GPT3_SHIFT,
904
.init = &omap2_init_clksel_parent,
905
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
906
.clksel_mask = OMAP24XX_CLKSEL_GPT3_MASK,
907
.clksel = omap24xx_gpt_clksel,
908
.recalc = &omap2_clksel_recalc,
909
};
910
911
static struct clk gpt4_ick = {
912
.name = "gpt4_ick",
913
.ops = &clkops_omap2_iclk_dflt_wait,
914
.parent = &l4_ck,
915
.clkdm_name = "core_l4_clkdm",
916
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
917
.enable_bit = OMAP24XX_EN_GPT4_SHIFT,
918
.recalc = &followparent_recalc,
919
};
920
921
static struct clk gpt4_fck = {
922
.name = "gpt4_fck",
923
.ops = &clkops_omap2_dflt_wait,
924
.parent = &func_32k_ck,
925
.clkdm_name = "core_l4_clkdm",
926
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
927
.enable_bit = OMAP24XX_EN_GPT4_SHIFT,
928
.init = &omap2_init_clksel_parent,
929
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
930
.clksel_mask = OMAP24XX_CLKSEL_GPT4_MASK,
931
.clksel = omap24xx_gpt_clksel,
932
.recalc = &omap2_clksel_recalc,
933
};
934
935
static struct clk gpt5_ick = {
936
.name = "gpt5_ick",
937
.ops = &clkops_omap2_iclk_dflt_wait,
938
.parent = &l4_ck,
939
.clkdm_name = "core_l4_clkdm",
940
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
941
.enable_bit = OMAP24XX_EN_GPT5_SHIFT,
942
.recalc = &followparent_recalc,
943
};
944
945
static struct clk gpt5_fck = {
946
.name = "gpt5_fck",
947
.ops = &clkops_omap2_dflt_wait,
948
.parent = &func_32k_ck,
949
.clkdm_name = "core_l4_clkdm",
950
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
951
.enable_bit = OMAP24XX_EN_GPT5_SHIFT,
952
.init = &omap2_init_clksel_parent,
953
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
954
.clksel_mask = OMAP24XX_CLKSEL_GPT5_MASK,
955
.clksel = omap24xx_gpt_clksel,
956
.recalc = &omap2_clksel_recalc,
957
};
958
959
static struct clk gpt6_ick = {
960
.name = "gpt6_ick",
961
.ops = &clkops_omap2_iclk_dflt_wait,
962
.parent = &l4_ck,
963
.clkdm_name = "core_l4_clkdm",
964
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
965
.enable_bit = OMAP24XX_EN_GPT6_SHIFT,
966
.recalc = &followparent_recalc,
967
};
968
969
static struct clk gpt6_fck = {
970
.name = "gpt6_fck",
971
.ops = &clkops_omap2_dflt_wait,
972
.parent = &func_32k_ck,
973
.clkdm_name = "core_l4_clkdm",
974
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
975
.enable_bit = OMAP24XX_EN_GPT6_SHIFT,
976
.init = &omap2_init_clksel_parent,
977
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
978
.clksel_mask = OMAP24XX_CLKSEL_GPT6_MASK,
979
.clksel = omap24xx_gpt_clksel,
980
.recalc = &omap2_clksel_recalc,
981
};
982
983
static struct clk gpt7_ick = {
984
.name = "gpt7_ick",
985
.ops = &clkops_omap2_iclk_dflt_wait,
986
.parent = &l4_ck,
987
.clkdm_name = "core_l4_clkdm",
988
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
989
.enable_bit = OMAP24XX_EN_GPT7_SHIFT,
990
.recalc = &followparent_recalc,
991
};
992
993
static struct clk gpt7_fck = {
994
.name = "gpt7_fck",
995
.ops = &clkops_omap2_dflt_wait,
996
.parent = &func_32k_ck,
997
.clkdm_name = "core_l4_clkdm",
998
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
999
.enable_bit = OMAP24XX_EN_GPT7_SHIFT,
1000
.init = &omap2_init_clksel_parent,
1001
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1002
.clksel_mask = OMAP24XX_CLKSEL_GPT7_MASK,
1003
.clksel = omap24xx_gpt_clksel,
1004
.recalc = &omap2_clksel_recalc,
1005
};
1006
1007
static struct clk gpt8_ick = {
1008
.name = "gpt8_ick",
1009
.ops = &clkops_omap2_iclk_dflt_wait,
1010
.parent = &l4_ck,
1011
.clkdm_name = "core_l4_clkdm",
1012
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1013
.enable_bit = OMAP24XX_EN_GPT8_SHIFT,
1014
.recalc = &followparent_recalc,
1015
};
1016
1017
static struct clk gpt8_fck = {
1018
.name = "gpt8_fck",
1019
.ops = &clkops_omap2_dflt_wait,
1020
.parent = &func_32k_ck,
1021
.clkdm_name = "core_l4_clkdm",
1022
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1023
.enable_bit = OMAP24XX_EN_GPT8_SHIFT,
1024
.init = &omap2_init_clksel_parent,
1025
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1026
.clksel_mask = OMAP24XX_CLKSEL_GPT8_MASK,
1027
.clksel = omap24xx_gpt_clksel,
1028
.recalc = &omap2_clksel_recalc,
1029
};
1030
1031
static struct clk gpt9_ick = {
1032
.name = "gpt9_ick",
1033
.ops = &clkops_omap2_iclk_dflt_wait,
1034
.parent = &l4_ck,
1035
.clkdm_name = "core_l4_clkdm",
1036
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1037
.enable_bit = OMAP24XX_EN_GPT9_SHIFT,
1038
.recalc = &followparent_recalc,
1039
};
1040
1041
static struct clk gpt9_fck = {
1042
.name = "gpt9_fck",
1043
.ops = &clkops_omap2_dflt_wait,
1044
.parent = &func_32k_ck,
1045
.clkdm_name = "core_l4_clkdm",
1046
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1047
.enable_bit = OMAP24XX_EN_GPT9_SHIFT,
1048
.init = &omap2_init_clksel_parent,
1049
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1050
.clksel_mask = OMAP24XX_CLKSEL_GPT9_MASK,
1051
.clksel = omap24xx_gpt_clksel,
1052
.recalc = &omap2_clksel_recalc,
1053
};
1054
1055
static struct clk gpt10_ick = {
1056
.name = "gpt10_ick",
1057
.ops = &clkops_omap2_iclk_dflt_wait,
1058
.parent = &l4_ck,
1059
.clkdm_name = "core_l4_clkdm",
1060
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1061
.enable_bit = OMAP24XX_EN_GPT10_SHIFT,
1062
.recalc = &followparent_recalc,
1063
};
1064
1065
static struct clk gpt10_fck = {
1066
.name = "gpt10_fck",
1067
.ops = &clkops_omap2_dflt_wait,
1068
.parent = &func_32k_ck,
1069
.clkdm_name = "core_l4_clkdm",
1070
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1071
.enable_bit = OMAP24XX_EN_GPT10_SHIFT,
1072
.init = &omap2_init_clksel_parent,
1073
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1074
.clksel_mask = OMAP24XX_CLKSEL_GPT10_MASK,
1075
.clksel = omap24xx_gpt_clksel,
1076
.recalc = &omap2_clksel_recalc,
1077
};
1078
1079
static struct clk gpt11_ick = {
1080
.name = "gpt11_ick",
1081
.ops = &clkops_omap2_iclk_dflt_wait,
1082
.parent = &l4_ck,
1083
.clkdm_name = "core_l4_clkdm",
1084
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1085
.enable_bit = OMAP24XX_EN_GPT11_SHIFT,
1086
.recalc = &followparent_recalc,
1087
};
1088
1089
static struct clk gpt11_fck = {
1090
.name = "gpt11_fck",
1091
.ops = &clkops_omap2_dflt_wait,
1092
.parent = &func_32k_ck,
1093
.clkdm_name = "core_l4_clkdm",
1094
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1095
.enable_bit = OMAP24XX_EN_GPT11_SHIFT,
1096
.init = &omap2_init_clksel_parent,
1097
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1098
.clksel_mask = OMAP24XX_CLKSEL_GPT11_MASK,
1099
.clksel = omap24xx_gpt_clksel,
1100
.recalc = &omap2_clksel_recalc,
1101
};
1102
1103
static struct clk gpt12_ick = {
1104
.name = "gpt12_ick",
1105
.ops = &clkops_omap2_iclk_dflt_wait,
1106
.parent = &l4_ck,
1107
.clkdm_name = "core_l4_clkdm",
1108
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1109
.enable_bit = OMAP24XX_EN_GPT12_SHIFT,
1110
.recalc = &followparent_recalc,
1111
};
1112
1113
static struct clk gpt12_fck = {
1114
.name = "gpt12_fck",
1115
.ops = &clkops_omap2_dflt_wait,
1116
.parent = &secure_32k_ck,
1117
.clkdm_name = "core_l4_clkdm",
1118
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1119
.enable_bit = OMAP24XX_EN_GPT12_SHIFT,
1120
.init = &omap2_init_clksel_parent,
1121
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1122
.clksel_mask = OMAP24XX_CLKSEL_GPT12_MASK,
1123
.clksel = omap24xx_gpt_clksel,
1124
.recalc = &omap2_clksel_recalc,
1125
};
1126
1127
static struct clk mcbsp1_ick = {
1128
.name = "mcbsp1_ick",
1129
.ops = &clkops_omap2_iclk_dflt_wait,
1130
.parent = &l4_ck,
1131
.clkdm_name = "core_l4_clkdm",
1132
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1133
.enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
1134
.recalc = &followparent_recalc,
1135
};
1136
1137
static const struct clksel_rate common_mcbsp_96m_rates[] = {
1138
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
1139
{ .div = 0 }
1140
};
1141
1142
static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
1143
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
1144
{ .div = 0 }
1145
};
1146
1147
static const struct clksel mcbsp_fck_clksel[] = {
1148
{ .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },
1149
{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
1150
{ .parent = NULL }
1151
};
1152
1153
static struct clk mcbsp1_fck = {
1154
.name = "mcbsp1_fck",
1155
.ops = &clkops_omap2_dflt_wait,
1156
.parent = &func_96m_ck,
1157
.init = &omap2_init_clksel_parent,
1158
.clkdm_name = "core_l4_clkdm",
1159
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1160
.enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
1161
.clksel_reg = OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1162
.clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
1163
.clksel = mcbsp_fck_clksel,
1164
.recalc = &omap2_clksel_recalc,
1165
};
1166
1167
static struct clk mcbsp2_ick = {
1168
.name = "mcbsp2_ick",
1169
.ops = &clkops_omap2_iclk_dflt_wait,
1170
.parent = &l4_ck,
1171
.clkdm_name = "core_l4_clkdm",
1172
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1173
.enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
1174
.recalc = &followparent_recalc,
1175
};
1176
1177
static struct clk mcbsp2_fck = {
1178
.name = "mcbsp2_fck",
1179
.ops = &clkops_omap2_dflt_wait,
1180
.parent = &func_96m_ck,
1181
.init = &omap2_init_clksel_parent,
1182
.clkdm_name = "core_l4_clkdm",
1183
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1184
.enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
1185
.clksel_reg = OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1186
.clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
1187
.clksel = mcbsp_fck_clksel,
1188
.recalc = &omap2_clksel_recalc,
1189
};
1190
1191
static struct clk mcspi1_ick = {
1192
.name = "mcspi1_ick",
1193
.ops = &clkops_omap2_iclk_dflt_wait,
1194
.parent = &l4_ck,
1195
.clkdm_name = "core_l4_clkdm",
1196
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1197
.enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,
1198
.recalc = &followparent_recalc,
1199
};
1200
1201
static struct clk mcspi1_fck = {
1202
.name = "mcspi1_fck",
1203
.ops = &clkops_omap2_dflt_wait,
1204
.parent = &func_48m_ck,
1205
.clkdm_name = "core_l4_clkdm",
1206
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1207
.enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,
1208
.recalc = &followparent_recalc,
1209
};
1210
1211
static struct clk mcspi2_ick = {
1212
.name = "mcspi2_ick",
1213
.ops = &clkops_omap2_iclk_dflt_wait,
1214
.parent = &l4_ck,
1215
.clkdm_name = "core_l4_clkdm",
1216
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1217
.enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,
1218
.recalc = &followparent_recalc,
1219
};
1220
1221
static struct clk mcspi2_fck = {
1222
.name = "mcspi2_fck",
1223
.ops = &clkops_omap2_dflt_wait,
1224
.parent = &func_48m_ck,
1225
.clkdm_name = "core_l4_clkdm",
1226
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1227
.enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,
1228
.recalc = &followparent_recalc,
1229
};
1230
1231
static struct clk uart1_ick = {
1232
.name = "uart1_ick",
1233
.ops = &clkops_omap2_iclk_dflt_wait,
1234
.parent = &l4_ck,
1235
.clkdm_name = "core_l4_clkdm",
1236
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1237
.enable_bit = OMAP24XX_EN_UART1_SHIFT,
1238
.recalc = &followparent_recalc,
1239
};
1240
1241
static struct clk uart1_fck = {
1242
.name = "uart1_fck",
1243
.ops = &clkops_omap2_dflt_wait,
1244
.parent = &func_48m_ck,
1245
.clkdm_name = "core_l4_clkdm",
1246
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1247
.enable_bit = OMAP24XX_EN_UART1_SHIFT,
1248
.recalc = &followparent_recalc,
1249
};
1250
1251
static struct clk uart2_ick = {
1252
.name = "uart2_ick",
1253
.ops = &clkops_omap2_iclk_dflt_wait,
1254
.parent = &l4_ck,
1255
.clkdm_name = "core_l4_clkdm",
1256
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1257
.enable_bit = OMAP24XX_EN_UART2_SHIFT,
1258
.recalc = &followparent_recalc,
1259
};
1260
1261
static struct clk uart2_fck = {
1262
.name = "uart2_fck",
1263
.ops = &clkops_omap2_dflt_wait,
1264
.parent = &func_48m_ck,
1265
.clkdm_name = "core_l4_clkdm",
1266
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1267
.enable_bit = OMAP24XX_EN_UART2_SHIFT,
1268
.recalc = &followparent_recalc,
1269
};
1270
1271
static struct clk uart3_ick = {
1272
.name = "uart3_ick",
1273
.ops = &clkops_omap2_iclk_dflt_wait,
1274
.parent = &l4_ck,
1275
.clkdm_name = "core_l4_clkdm",
1276
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1277
.enable_bit = OMAP24XX_EN_UART3_SHIFT,
1278
.recalc = &followparent_recalc,
1279
};
1280
1281
static struct clk uart3_fck = {
1282
.name = "uart3_fck",
1283
.ops = &clkops_omap2_dflt_wait,
1284
.parent = &func_48m_ck,
1285
.clkdm_name = "core_l4_clkdm",
1286
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1287
.enable_bit = OMAP24XX_EN_UART3_SHIFT,
1288
.recalc = &followparent_recalc,
1289
};
1290
1291
static struct clk gpios_ick = {
1292
.name = "gpios_ick",
1293
.ops = &clkops_omap2_iclk_dflt_wait,
1294
.parent = &wu_l4_ick,
1295
.clkdm_name = "wkup_clkdm",
1296
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1297
.enable_bit = OMAP24XX_EN_GPIOS_SHIFT,
1298
.recalc = &followparent_recalc,
1299
};
1300
1301
static struct clk gpios_fck = {
1302
.name = "gpios_fck",
1303
.ops = &clkops_omap2_dflt_wait,
1304
.parent = &func_32k_ck,
1305
.clkdm_name = "wkup_clkdm",
1306
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
1307
.enable_bit = OMAP24XX_EN_GPIOS_SHIFT,
1308
.recalc = &followparent_recalc,
1309
};
1310
1311
static struct clk mpu_wdt_ick = {
1312
.name = "mpu_wdt_ick",
1313
.ops = &clkops_omap2_iclk_dflt_wait,
1314
.parent = &wu_l4_ick,
1315
.clkdm_name = "wkup_clkdm",
1316
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1317
.enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
1318
.recalc = &followparent_recalc,
1319
};
1320
1321
static struct clk mpu_wdt_fck = {
1322
.name = "mpu_wdt_fck",
1323
.ops = &clkops_omap2_dflt_wait,
1324
.parent = &func_32k_ck,
1325
.clkdm_name = "wkup_clkdm",
1326
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
1327
.enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
1328
.recalc = &followparent_recalc,
1329
};
1330
1331
static struct clk sync_32k_ick = {
1332
.name = "sync_32k_ick",
1333
.ops = &clkops_omap2_iclk_dflt_wait,
1334
.parent = &wu_l4_ick,
1335
.clkdm_name = "wkup_clkdm",
1336
.flags = ENABLE_ON_INIT,
1337
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1338
.enable_bit = OMAP24XX_EN_32KSYNC_SHIFT,
1339
.recalc = &followparent_recalc,
1340
};
1341
1342
static struct clk wdt1_ick = {
1343
.name = "wdt1_ick",
1344
.ops = &clkops_omap2_iclk_dflt_wait,
1345
.parent = &wu_l4_ick,
1346
.clkdm_name = "wkup_clkdm",
1347
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1348
.enable_bit = OMAP24XX_EN_WDT1_SHIFT,
1349
.recalc = &followparent_recalc,
1350
};
1351
1352
static struct clk omapctrl_ick = {
1353
.name = "omapctrl_ick",
1354
.ops = &clkops_omap2_iclk_dflt_wait,
1355
.parent = &wu_l4_ick,
1356
.clkdm_name = "wkup_clkdm",
1357
.flags = ENABLE_ON_INIT,
1358
.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1359
.enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT,
1360
.recalc = &followparent_recalc,
1361
};
1362
1363
static struct clk cam_ick = {
1364
.name = "cam_ick",
1365
.ops = &clkops_omap2_iclk_dflt,
1366
.parent = &l4_ck,
1367
.clkdm_name = "core_l4_clkdm",
1368
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1369
.enable_bit = OMAP24XX_EN_CAM_SHIFT,
1370
.recalc = &followparent_recalc,
1371
};
1372
1373
/*
1374
* cam_fck controls both CAM_MCLK and CAM_FCLK. It should probably be
1375
* split into two separate clocks, since the parent clocks are different
1376
* and the clockdomains are also different.
1377
*/
1378
static struct clk cam_fck = {
1379
.name = "cam_fck",
1380
.ops = &clkops_omap2_dflt,
1381
.parent = &func_96m_ck,
1382
.clkdm_name = "core_l3_clkdm",
1383
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1384
.enable_bit = OMAP24XX_EN_CAM_SHIFT,
1385
.recalc = &followparent_recalc,
1386
};
1387
1388
static struct clk mailboxes_ick = {
1389
.name = "mailboxes_ick",
1390
.ops = &clkops_omap2_iclk_dflt_wait,
1391
.parent = &l4_ck,
1392
.clkdm_name = "core_l4_clkdm",
1393
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1394
.enable_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
1395
.recalc = &followparent_recalc,
1396
};
1397
1398
static struct clk wdt4_ick = {
1399
.name = "wdt4_ick",
1400
.ops = &clkops_omap2_iclk_dflt_wait,
1401
.parent = &l4_ck,
1402
.clkdm_name = "core_l4_clkdm",
1403
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1404
.enable_bit = OMAP24XX_EN_WDT4_SHIFT,
1405
.recalc = &followparent_recalc,
1406
};
1407
1408
static struct clk wdt4_fck = {
1409
.name = "wdt4_fck",
1410
.ops = &clkops_omap2_dflt_wait,
1411
.parent = &func_32k_ck,
1412
.clkdm_name = "core_l4_clkdm",
1413
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1414
.enable_bit = OMAP24XX_EN_WDT4_SHIFT,
1415
.recalc = &followparent_recalc,
1416
};
1417
1418
static struct clk wdt3_ick = {
1419
.name = "wdt3_ick",
1420
.ops = &clkops_omap2_iclk_dflt_wait,
1421
.parent = &l4_ck,
1422
.clkdm_name = "core_l4_clkdm",
1423
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1424
.enable_bit = OMAP2420_EN_WDT3_SHIFT,
1425
.recalc = &followparent_recalc,
1426
};
1427
1428
static struct clk wdt3_fck = {
1429
.name = "wdt3_fck",
1430
.ops = &clkops_omap2_dflt_wait,
1431
.parent = &func_32k_ck,
1432
.clkdm_name = "core_l4_clkdm",
1433
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1434
.enable_bit = OMAP2420_EN_WDT3_SHIFT,
1435
.recalc = &followparent_recalc,
1436
};
1437
1438
static struct clk mspro_ick = {
1439
.name = "mspro_ick",
1440
.ops = &clkops_omap2_iclk_dflt_wait,
1441
.parent = &l4_ck,
1442
.clkdm_name = "core_l4_clkdm",
1443
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1444
.enable_bit = OMAP24XX_EN_MSPRO_SHIFT,
1445
.recalc = &followparent_recalc,
1446
};
1447
1448
static struct clk mspro_fck = {
1449
.name = "mspro_fck",
1450
.ops = &clkops_omap2_dflt_wait,
1451
.parent = &func_96m_ck,
1452
.clkdm_name = "core_l4_clkdm",
1453
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1454
.enable_bit = OMAP24XX_EN_MSPRO_SHIFT,
1455
.recalc = &followparent_recalc,
1456
};
1457
1458
static struct clk mmc_ick = {
1459
.name = "mmc_ick",
1460
.ops = &clkops_omap2_iclk_dflt_wait,
1461
.parent = &l4_ck,
1462
.clkdm_name = "core_l4_clkdm",
1463
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1464
.enable_bit = OMAP2420_EN_MMC_SHIFT,
1465
.recalc = &followparent_recalc,
1466
};
1467
1468
static struct clk mmc_fck = {
1469
.name = "mmc_fck",
1470
.ops = &clkops_omap2_dflt_wait,
1471
.parent = &func_96m_ck,
1472
.clkdm_name = "core_l4_clkdm",
1473
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1474
.enable_bit = OMAP2420_EN_MMC_SHIFT,
1475
.recalc = &followparent_recalc,
1476
};
1477
1478
static struct clk fac_ick = {
1479
.name = "fac_ick",
1480
.ops = &clkops_omap2_iclk_dflt_wait,
1481
.parent = &l4_ck,
1482
.clkdm_name = "core_l4_clkdm",
1483
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1484
.enable_bit = OMAP24XX_EN_FAC_SHIFT,
1485
.recalc = &followparent_recalc,
1486
};
1487
1488
static struct clk fac_fck = {
1489
.name = "fac_fck",
1490
.ops = &clkops_omap2_dflt_wait,
1491
.parent = &func_12m_ck,
1492
.clkdm_name = "core_l4_clkdm",
1493
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1494
.enable_bit = OMAP24XX_EN_FAC_SHIFT,
1495
.recalc = &followparent_recalc,
1496
};
1497
1498
static struct clk eac_ick = {
1499
.name = "eac_ick",
1500
.ops = &clkops_omap2_iclk_dflt_wait,
1501
.parent = &l4_ck,
1502
.clkdm_name = "core_l4_clkdm",
1503
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1504
.enable_bit = OMAP2420_EN_EAC_SHIFT,
1505
.recalc = &followparent_recalc,
1506
};
1507
1508
static struct clk eac_fck = {
1509
.name = "eac_fck",
1510
.ops = &clkops_omap2_dflt_wait,
1511
.parent = &func_96m_ck,
1512
.clkdm_name = "core_l4_clkdm",
1513
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1514
.enable_bit = OMAP2420_EN_EAC_SHIFT,
1515
.recalc = &followparent_recalc,
1516
};
1517
1518
static struct clk hdq_ick = {
1519
.name = "hdq_ick",
1520
.ops = &clkops_omap2_iclk_dflt_wait,
1521
.parent = &l4_ck,
1522
.clkdm_name = "core_l4_clkdm",
1523
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1524
.enable_bit = OMAP24XX_EN_HDQ_SHIFT,
1525
.recalc = &followparent_recalc,
1526
};
1527
1528
static struct clk hdq_fck = {
1529
.name = "hdq_fck",
1530
.ops = &clkops_omap2_dflt_wait,
1531
.parent = &func_12m_ck,
1532
.clkdm_name = "core_l4_clkdm",
1533
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1534
.enable_bit = OMAP24XX_EN_HDQ_SHIFT,
1535
.recalc = &followparent_recalc,
1536
};
1537
1538
static struct clk i2c2_ick = {
1539
.name = "i2c2_ick",
1540
.ops = &clkops_omap2_iclk_dflt_wait,
1541
.parent = &l4_ck,
1542
.clkdm_name = "core_l4_clkdm",
1543
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1544
.enable_bit = OMAP2420_EN_I2C2_SHIFT,
1545
.recalc = &followparent_recalc,
1546
};
1547
1548
static struct clk i2c2_fck = {
1549
.name = "i2c2_fck",
1550
.ops = &clkops_omap2_dflt_wait,
1551
.parent = &func_12m_ck,
1552
.clkdm_name = "core_l4_clkdm",
1553
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1554
.enable_bit = OMAP2420_EN_I2C2_SHIFT,
1555
.recalc = &followparent_recalc,
1556
};
1557
1558
static struct clk i2c1_ick = {
1559
.name = "i2c1_ick",
1560
.ops = &clkops_omap2_iclk_dflt_wait,
1561
.parent = &l4_ck,
1562
.clkdm_name = "core_l4_clkdm",
1563
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1564
.enable_bit = OMAP2420_EN_I2C1_SHIFT,
1565
.recalc = &followparent_recalc,
1566
};
1567
1568
static struct clk i2c1_fck = {
1569
.name = "i2c1_fck",
1570
.ops = &clkops_omap2_dflt_wait,
1571
.parent = &func_12m_ck,
1572
.clkdm_name = "core_l4_clkdm",
1573
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1574
.enable_bit = OMAP2420_EN_I2C1_SHIFT,
1575
.recalc = &followparent_recalc,
1576
};
1577
1578
/*
1579
* The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
1580
* accesses derived from this data.
1581
*/
1582
static struct clk gpmc_fck = {
1583
.name = "gpmc_fck",
1584
.ops = &clkops_omap2_iclk_idle_only,
1585
.parent = &core_l3_ck,
1586
.flags = ENABLE_ON_INIT,
1587
.clkdm_name = "core_l3_clkdm",
1588
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1589
.enable_bit = OMAP24XX_AUTO_GPMC_SHIFT,
1590
.recalc = &followparent_recalc,
1591
};
1592
1593
static struct clk sdma_fck = {
1594
.name = "sdma_fck",
1595
.ops = &clkops_null, /* RMK: missing? */
1596
.parent = &core_l3_ck,
1597
.clkdm_name = "core_l3_clkdm",
1598
.recalc = &followparent_recalc,
1599
};
1600
1601
/*
1602
* The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
1603
* accesses derived from this data.
1604
*/
1605
static struct clk sdma_ick = {
1606
.name = "sdma_ick",
1607
.ops = &clkops_omap2_iclk_idle_only,
1608
.parent = &core_l3_ck,
1609
.clkdm_name = "core_l3_clkdm",
1610
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1611
.enable_bit = OMAP24XX_AUTO_SDMA_SHIFT,
1612
.recalc = &followparent_recalc,
1613
};
1614
1615
/*
1616
* The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
1617
* accesses derived from this data.
1618
*/
1619
static struct clk sdrc_ick = {
1620
.name = "sdrc_ick",
1621
.ops = &clkops_omap2_iclk_idle_only,
1622
.parent = &core_l3_ck,
1623
.flags = ENABLE_ON_INIT,
1624
.clkdm_name = "core_l3_clkdm",
1625
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1626
.enable_bit = OMAP24XX_AUTO_SDRC_SHIFT,
1627
.recalc = &followparent_recalc,
1628
};
1629
1630
static struct clk vlynq_ick = {
1631
.name = "vlynq_ick",
1632
.ops = &clkops_omap2_iclk_dflt_wait,
1633
.parent = &core_l3_ck,
1634
.clkdm_name = "core_l3_clkdm",
1635
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1636
.enable_bit = OMAP2420_EN_VLYNQ_SHIFT,
1637
.recalc = &followparent_recalc,
1638
};
1639
1640
static const struct clksel_rate vlynq_fck_96m_rates[] = {
1641
{ .div = 1, .val = 0, .flags = RATE_IN_242X },
1642
{ .div = 0 }
1643
};
1644
1645
static const struct clksel_rate vlynq_fck_core_rates[] = {
1646
{ .div = 1, .val = 1, .flags = RATE_IN_242X },
1647
{ .div = 2, .val = 2, .flags = RATE_IN_242X },
1648
{ .div = 3, .val = 3, .flags = RATE_IN_242X },
1649
{ .div = 4, .val = 4, .flags = RATE_IN_242X },
1650
{ .div = 6, .val = 6, .flags = RATE_IN_242X },
1651
{ .div = 8, .val = 8, .flags = RATE_IN_242X },
1652
{ .div = 9, .val = 9, .flags = RATE_IN_242X },
1653
{ .div = 12, .val = 12, .flags = RATE_IN_242X },
1654
{ .div = 16, .val = 16, .flags = RATE_IN_242X },
1655
{ .div = 18, .val = 18, .flags = RATE_IN_242X },
1656
{ .div = 0 }
1657
};
1658
1659
static const struct clksel vlynq_fck_clksel[] = {
1660
{ .parent = &func_96m_ck, .rates = vlynq_fck_96m_rates },
1661
{ .parent = &core_ck, .rates = vlynq_fck_core_rates },
1662
{ .parent = NULL }
1663
};
1664
1665
static struct clk vlynq_fck = {
1666
.name = "vlynq_fck",
1667
.ops = &clkops_omap2_dflt_wait,
1668
.parent = &func_96m_ck,
1669
.clkdm_name = "core_l3_clkdm",
1670
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1671
.enable_bit = OMAP2420_EN_VLYNQ_SHIFT,
1672
.init = &omap2_init_clksel_parent,
1673
.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
1674
.clksel_mask = OMAP2420_CLKSEL_VLYNQ_MASK,
1675
.clksel = vlynq_fck_clksel,
1676
.recalc = &omap2_clksel_recalc,
1677
};
1678
1679
static struct clk des_ick = {
1680
.name = "des_ick",
1681
.ops = &clkops_omap2_iclk_dflt_wait,
1682
.parent = &l4_ck,
1683
.clkdm_name = "core_l4_clkdm",
1684
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1685
.enable_bit = OMAP24XX_EN_DES_SHIFT,
1686
.recalc = &followparent_recalc,
1687
};
1688
1689
static struct clk sha_ick = {
1690
.name = "sha_ick",
1691
.ops = &clkops_omap2_iclk_dflt_wait,
1692
.parent = &l4_ck,
1693
.clkdm_name = "core_l4_clkdm",
1694
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1695
.enable_bit = OMAP24XX_EN_SHA_SHIFT,
1696
.recalc = &followparent_recalc,
1697
};
1698
1699
static struct clk rng_ick = {
1700
.name = "rng_ick",
1701
.ops = &clkops_omap2_iclk_dflt_wait,
1702
.parent = &l4_ck,
1703
.clkdm_name = "core_l4_clkdm",
1704
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1705
.enable_bit = OMAP24XX_EN_RNG_SHIFT,
1706
.recalc = &followparent_recalc,
1707
};
1708
1709
static struct clk aes_ick = {
1710
.name = "aes_ick",
1711
.ops = &clkops_omap2_iclk_dflt_wait,
1712
.parent = &l4_ck,
1713
.clkdm_name = "core_l4_clkdm",
1714
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1715
.enable_bit = OMAP24XX_EN_AES_SHIFT,
1716
.recalc = &followparent_recalc,
1717
};
1718
1719
static struct clk pka_ick = {
1720
.name = "pka_ick",
1721
.ops = &clkops_omap2_iclk_dflt_wait,
1722
.parent = &l4_ck,
1723
.clkdm_name = "core_l4_clkdm",
1724
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1725
.enable_bit = OMAP24XX_EN_PKA_SHIFT,
1726
.recalc = &followparent_recalc,
1727
};
1728
1729
static struct clk usb_fck = {
1730
.name = "usb_fck",
1731
.ops = &clkops_omap2_dflt_wait,
1732
.parent = &func_48m_ck,
1733
.clkdm_name = "core_l3_clkdm",
1734
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1735
.enable_bit = OMAP24XX_EN_USB_SHIFT,
1736
.recalc = &followparent_recalc,
1737
};
1738
1739
/*
1740
* This clock is a composite clock which does entire set changes then
1741
* forces a rebalance. It keys on the MPU speed, but it really could
1742
* be any key speed part of a set in the rate table.
1743
*
1744
* to really change a set, you need memory table sets which get changed
1745
* in sram, pre-notifiers & post notifiers, changing the top set, without
1746
* having low level display recalc's won't work... this is why dpm notifiers
1747
* work, isr's off, walk a list of clocks already _off_ and not messing with
1748
* the bus.
1749
*
1750
* This clock should have no parent. It embodies the entire upper level
1751
* active set. A parent will mess up some of the init also.
1752
*/
1753
static struct clk virt_prcm_set = {
1754
.name = "virt_prcm_set",
1755
.ops = &clkops_null,
1756
.parent = &mpu_ck, /* Indexed by mpu speed, no parent */
1757
.recalc = &omap2_table_mpu_recalc, /* sets are keyed on mpu rate */
1758
.set_rate = &omap2_select_table_rate,
1759
.round_rate = &omap2_round_to_table_rate,
1760
};
1761
1762
1763
/*
1764
* clkdev integration
1765
*/
1766
1767
static struct omap_clk omap2420_clks[] = {
1768
/* external root sources */
1769
CLK(NULL, "func_32k_ck", &func_32k_ck, CK_242X),
1770
CLK(NULL, "secure_32k_ck", &secure_32k_ck, CK_242X),
1771
CLK(NULL, "osc_ck", &osc_ck, CK_242X),
1772
CLK(NULL, "sys_ck", &sys_ck, CK_242X),
1773
CLK(NULL, "alt_ck", &alt_ck, CK_242X),
1774
CLK("omap-mcbsp.1", "pad_fck", &mcbsp_clks, CK_242X),
1775
CLK("omap-mcbsp.2", "pad_fck", &mcbsp_clks, CK_242X),
1776
CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_242X),
1777
/* internal analog sources */
1778
CLK(NULL, "dpll_ck", &dpll_ck, CK_242X),
1779
CLK(NULL, "apll96_ck", &apll96_ck, CK_242X),
1780
CLK(NULL, "apll54_ck", &apll54_ck, CK_242X),
1781
/* internal prcm root sources */
1782
CLK(NULL, "func_54m_ck", &func_54m_ck, CK_242X),
1783
CLK(NULL, "core_ck", &core_ck, CK_242X),
1784
CLK("omap-mcbsp.1", "prcm_fck", &func_96m_ck, CK_242X),
1785
CLK("omap-mcbsp.2", "prcm_fck", &func_96m_ck, CK_242X),
1786
CLK(NULL, "func_96m_ck", &func_96m_ck, CK_242X),
1787
CLK(NULL, "func_48m_ck", &func_48m_ck, CK_242X),
1788
CLK(NULL, "func_12m_ck", &func_12m_ck, CK_242X),
1789
CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_242X),
1790
CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_242X),
1791
CLK(NULL, "sys_clkout", &sys_clkout, CK_242X),
1792
CLK(NULL, "sys_clkout2_src", &sys_clkout2_src, CK_242X),
1793
CLK(NULL, "sys_clkout2", &sys_clkout2, CK_242X),
1794
CLK(NULL, "emul_ck", &emul_ck, CK_242X),
1795
/* mpu domain clocks */
1796
CLK(NULL, "mpu_ck", &mpu_ck, CK_242X),
1797
/* dsp domain clocks */
1798
CLK(NULL, "dsp_fck", &dsp_fck, CK_242X),
1799
CLK(NULL, "dsp_ick", &dsp_ick, CK_242X),
1800
CLK(NULL, "iva1_ifck", &iva1_ifck, CK_242X),
1801
CLK(NULL, "iva1_mpu_int_ifck", &iva1_mpu_int_ifck, CK_242X),
1802
/* GFX domain clocks */
1803
CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_242X),
1804
CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_242X),
1805
CLK(NULL, "gfx_ick", &gfx_ick, CK_242X),
1806
/* DSS domain clocks */
1807
CLK("omapdss_dss", "ick", &dss_ick, CK_242X),
1808
CLK("omapdss_dss", "fck", &dss1_fck, CK_242X),
1809
CLK("omapdss_dss", "sys_clk", &dss2_fck, CK_242X),
1810
CLK("omapdss_dss", "tv_clk", &dss_54m_fck, CK_242X),
1811
/* L3 domain clocks */
1812
CLK(NULL, "core_l3_ck", &core_l3_ck, CK_242X),
1813
CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_242X),
1814
CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_242X),
1815
/* L4 domain clocks */
1816
CLK(NULL, "l4_ck", &l4_ck, CK_242X),
1817
CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X),
1818
CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_242X),
1819
/* virtual meta-group clock */
1820
CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X),
1821
/* general l4 interface ck, multi-parent functional clk */
1822
CLK(NULL, "gpt1_ick", &gpt1_ick, CK_242X),
1823
CLK(NULL, "gpt1_fck", &gpt1_fck, CK_242X),
1824
CLK(NULL, "gpt2_ick", &gpt2_ick, CK_242X),
1825
CLK(NULL, "gpt2_fck", &gpt2_fck, CK_242X),
1826
CLK(NULL, "gpt3_ick", &gpt3_ick, CK_242X),
1827
CLK(NULL, "gpt3_fck", &gpt3_fck, CK_242X),
1828
CLK(NULL, "gpt4_ick", &gpt4_ick, CK_242X),
1829
CLK(NULL, "gpt4_fck", &gpt4_fck, CK_242X),
1830
CLK(NULL, "gpt5_ick", &gpt5_ick, CK_242X),
1831
CLK(NULL, "gpt5_fck", &gpt5_fck, CK_242X),
1832
CLK(NULL, "gpt6_ick", &gpt6_ick, CK_242X),
1833
CLK(NULL, "gpt6_fck", &gpt6_fck, CK_242X),
1834
CLK(NULL, "gpt7_ick", &gpt7_ick, CK_242X),
1835
CLK(NULL, "gpt7_fck", &gpt7_fck, CK_242X),
1836
CLK(NULL, "gpt8_ick", &gpt8_ick, CK_242X),
1837
CLK(NULL, "gpt8_fck", &gpt8_fck, CK_242X),
1838
CLK(NULL, "gpt9_ick", &gpt9_ick, CK_242X),
1839
CLK(NULL, "gpt9_fck", &gpt9_fck, CK_242X),
1840
CLK(NULL, "gpt10_ick", &gpt10_ick, CK_242X),
1841
CLK(NULL, "gpt10_fck", &gpt10_fck, CK_242X),
1842
CLK(NULL, "gpt11_ick", &gpt11_ick, CK_242X),
1843
CLK(NULL, "gpt11_fck", &gpt11_fck, CK_242X),
1844
CLK(NULL, "gpt12_ick", &gpt12_ick, CK_242X),
1845
CLK(NULL, "gpt12_fck", &gpt12_fck, CK_242X),
1846
CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_242X),
1847
CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_242X),
1848
CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_242X),
1849
CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_242X),
1850
CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_242X),
1851
CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_242X),
1852
CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_242X),
1853
CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_242X),
1854
CLK(NULL, "uart1_ick", &uart1_ick, CK_242X),
1855
CLK(NULL, "uart1_fck", &uart1_fck, CK_242X),
1856
CLK(NULL, "uart2_ick", &uart2_ick, CK_242X),
1857
CLK(NULL, "uart2_fck", &uart2_fck, CK_242X),
1858
CLK(NULL, "uart3_ick", &uart3_ick, CK_242X),
1859
CLK(NULL, "uart3_fck", &uart3_fck, CK_242X),
1860
CLK(NULL, "gpios_ick", &gpios_ick, CK_242X),
1861
CLK(NULL, "gpios_fck", &gpios_fck, CK_242X),
1862
CLK("omap_wdt", "ick", &mpu_wdt_ick, CK_242X),
1863
CLK("omap_wdt", "fck", &mpu_wdt_fck, CK_242X),
1864
CLK(NULL, "sync_32k_ick", &sync_32k_ick, CK_242X),
1865
CLK(NULL, "wdt1_ick", &wdt1_ick, CK_242X),
1866
CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_242X),
1867
CLK("omap24xxcam", "fck", &cam_fck, CK_242X),
1868
CLK("omap24xxcam", "ick", &cam_ick, CK_242X),
1869
CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_242X),
1870
CLK(NULL, "wdt4_ick", &wdt4_ick, CK_242X),
1871
CLK(NULL, "wdt4_fck", &wdt4_fck, CK_242X),
1872
CLK(NULL, "wdt3_ick", &wdt3_ick, CK_242X),
1873
CLK(NULL, "wdt3_fck", &wdt3_fck, CK_242X),
1874
CLK(NULL, "mspro_ick", &mspro_ick, CK_242X),
1875
CLK(NULL, "mspro_fck", &mspro_fck, CK_242X),
1876
CLK("mmci-omap.0", "ick", &mmc_ick, CK_242X),
1877
CLK("mmci-omap.0", "fck", &mmc_fck, CK_242X),
1878
CLK(NULL, "fac_ick", &fac_ick, CK_242X),
1879
CLK(NULL, "fac_fck", &fac_fck, CK_242X),
1880
CLK(NULL, "eac_ick", &eac_ick, CK_242X),
1881
CLK(NULL, "eac_fck", &eac_fck, CK_242X),
1882
CLK("omap_hdq.0", "ick", &hdq_ick, CK_242X),
1883
CLK("omap_hdq.1", "fck", &hdq_fck, CK_242X),
1884
CLK("omap_i2c.1", "ick", &i2c1_ick, CK_242X),
1885
CLK("omap_i2c.1", "fck", &i2c1_fck, CK_242X),
1886
CLK("omap_i2c.2", "ick", &i2c2_ick, CK_242X),
1887
CLK("omap_i2c.2", "fck", &i2c2_fck, CK_242X),
1888
CLK(NULL, "gpmc_fck", &gpmc_fck, CK_242X),
1889
CLK(NULL, "sdma_fck", &sdma_fck, CK_242X),
1890
CLK(NULL, "sdma_ick", &sdma_ick, CK_242X),
1891
CLK(NULL, "sdrc_ick", &sdrc_ick, CK_242X),
1892
CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X),
1893
CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X),
1894
CLK(NULL, "des_ick", &des_ick, CK_242X),
1895
CLK("omap-sham", "ick", &sha_ick, CK_242X),
1896
CLK("omap_rng", "ick", &rng_ick, CK_242X),
1897
CLK("omap-aes", "ick", &aes_ick, CK_242X),
1898
CLK(NULL, "pka_ick", &pka_ick, CK_242X),
1899
CLK(NULL, "usb_fck", &usb_fck, CK_242X),
1900
CLK("musb-hdrc", "fck", &osc_ck, CK_242X),
1901
};
1902
1903
/*
1904
* init code
1905
*/
1906
1907
int __init omap2420_clk_init(void)
1908
{
1909
const struct prcm_config *prcm;
1910
struct omap_clk *c;
1911
u32 clkrate;
1912
1913
prcm_clksrc_ctrl = OMAP2420_PRCM_CLKSRC_CTRL;
1914
cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);
1915
cpu_mask = RATE_IN_242X;
1916
rate_table = omap2420_rate_table;
1917
1918
clk_init(&omap2_clk_functions);
1919
1920
for (c = omap2420_clks; c < omap2420_clks + ARRAY_SIZE(omap2420_clks);
1921
c++)
1922
clk_preinit(c->lk.clk);
1923
1924
osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
1925
propagate_rate(&osc_ck);
1926
sys_ck.rate = omap2xxx_sys_clk_recalc(&sys_ck);
1927
propagate_rate(&sys_ck);
1928
1929
for (c = omap2420_clks; c < omap2420_clks + ARRAY_SIZE(omap2420_clks);
1930
c++) {
1931
clkdev_add(&c->lk);
1932
clk_register(c->lk.clk);
1933
omap2_init_clk_clkdm(c->lk.clk);
1934
}
1935
1936
/* Disable autoidle on all clocks; let the PM code enable it later */
1937
omap_clk_disable_autoidle_all();
1938
1939
/* Check the MPU rate set by bootloader */
1940
clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);
1941
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
1942
if (!(prcm->flags & cpu_mask))
1943
continue;
1944
if (prcm->xtal_speed != sys_ck.rate)
1945
continue;
1946
if (prcm->dpll_speed <= clkrate)
1947
break;
1948
}
1949
curr_prcm_set = prcm;
1950
1951
recalculate_root_clocks();
1952
1953
pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
1954
(sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
1955
(dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
1956
1957
/*
1958
* Only enable those clocks we will need, let the drivers
1959
* enable other clocks as necessary
1960
*/
1961
clk_enable_init_clocks();
1962
1963
/* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
1964
vclk = clk_get(NULL, "virt_prcm_set");
1965
sclk = clk_get(NULL, "sys_ck");
1966
dclk = clk_get(NULL, "dpll_ck");
1967
1968
return 0;
1969
}
1970
1971
1972