blob: 4c3f5a32694c68d857a77ba3649f9a67c269abfb [file] [log] [blame]
Rajendra Nayakcb268672012-11-06 15:41:08 -07001/*
2 * OMAP4 Clock data
3 *
4 * Copyright (C) 2009-2012 Texas Instruments, Inc.
5 * Copyright (C) 2009-2010 Nokia Corporation
6 *
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 * Mike Turquette (mturquette@ti.com)
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 *
16 * XXX Some of the ES1 clocks have been removed/changed; once support
17 * is added for discriminating clocks by ES level, these should be added back
18 * in.
Paul Walmsley17b7e7d2013-01-26 00:48:54 -070019 *
20 * XXX All of the CLK_OMAP_MUX_GATE entries with MODULEMODE registers should
21 * be split into separate mux and gate nodes, then the gates should be removed
22 * (handled by hwmod). Also all of the other remaining MODULEMODE entries
23 * should be removed once the drivers are updated to use pm_runtime.
Rajendra Nayakcb268672012-11-06 15:41:08 -070024 */
25
26#include <linux/kernel.h>
27#include <linux/list.h>
28#include <linux/clk-private.h>
29#include <linux/clkdev.h>
30#include <linux/io.h>
31
32#include "soc.h"
33#include "iomap.h"
34#include "clock.h"
35#include "clock44xx.h"
36#include "cm1_44xx.h"
37#include "cm2_44xx.h"
38#include "cm-regbits-44xx.h"
39#include "prm44xx.h"
40#include "prm-regbits-44xx.h"
41#include "control.h"
42#include "scrm44xx.h"
43
44/* OMAP4 modulemode control */
45#define OMAP4430_MODULEMODE_HWCTRL_SHIFT 0
46#define OMAP4430_MODULEMODE_SWCTRL_SHIFT 1
47
Jon Hunter8c197cc2012-12-15 01:35:50 -070048/*
49 * OMAP4 ABE DPLL default frequency. In OMAP4460 TRM version V, section
50 * "3.6.3.2.3 CM1_ABE Clock Generator" states that the "DPLL_ABE_X2_CLK
51 * must be set to 196.608 MHz" and hence, the DPLL locked frequency is
52 * half of this value.
53 */
54#define OMAP4_DPLL_ABE_DEFFREQ 98304000
55
Rajendra Nayakcb268672012-11-06 15:41:08 -070056/* Root clocks */
57
58DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
59
60DEFINE_CLK_FIXED_RATE(pad_clks_src_ck, CLK_IS_ROOT, 12000000, 0x0);
61
62DEFINE_CLK_GATE(pad_clks_ck, "pad_clks_src_ck", &pad_clks_src_ck, 0x0,
63 OMAP4430_CM_CLKSEL_ABE, OMAP4430_PAD_CLKS_GATE_SHIFT,
64 0x0, NULL);
65
66DEFINE_CLK_FIXED_RATE(pad_slimbus_core_clks_ck, CLK_IS_ROOT, 12000000, 0x0);
67
68DEFINE_CLK_FIXED_RATE(secure_32k_clk_src_ck, CLK_IS_ROOT, 32768, 0x0);
69
70DEFINE_CLK_FIXED_RATE(slimbus_src_clk, CLK_IS_ROOT, 12000000, 0x0);
71
72DEFINE_CLK_GATE(slimbus_clk, "slimbus_src_clk", &slimbus_src_clk, 0x0,
73 OMAP4430_CM_CLKSEL_ABE, OMAP4430_SLIMBUS_CLK_GATE_SHIFT,
74 0x0, NULL);
75
76DEFINE_CLK_FIXED_RATE(sys_32k_ck, CLK_IS_ROOT, 32768, 0x0);
77
78DEFINE_CLK_FIXED_RATE(virt_12000000_ck, CLK_IS_ROOT, 12000000, 0x0);
79
80DEFINE_CLK_FIXED_RATE(virt_13000000_ck, CLK_IS_ROOT, 13000000, 0x0);
81
82DEFINE_CLK_FIXED_RATE(virt_16800000_ck, CLK_IS_ROOT, 16800000, 0x0);
83
84DEFINE_CLK_FIXED_RATE(virt_19200000_ck, CLK_IS_ROOT, 19200000, 0x0);
85
86DEFINE_CLK_FIXED_RATE(virt_26000000_ck, CLK_IS_ROOT, 26000000, 0x0);
87
88DEFINE_CLK_FIXED_RATE(virt_27000000_ck, CLK_IS_ROOT, 27000000, 0x0);
89
90DEFINE_CLK_FIXED_RATE(virt_38400000_ck, CLK_IS_ROOT, 38400000, 0x0);
91
92static const char *sys_clkin_ck_parents[] = {
93 "virt_12000000_ck", "virt_13000000_ck", "virt_16800000_ck",
94 "virt_19200000_ck", "virt_26000000_ck", "virt_27000000_ck",
95 "virt_38400000_ck",
96};
97
98DEFINE_CLK_MUX(sys_clkin_ck, sys_clkin_ck_parents, NULL, 0x0,
99 OMAP4430_CM_SYS_CLKSEL, OMAP4430_SYS_CLKSEL_SHIFT,
100 OMAP4430_SYS_CLKSEL_WIDTH, CLK_MUX_INDEX_ONE, NULL);
101
102DEFINE_CLK_FIXED_RATE(tie_low_clock_ck, CLK_IS_ROOT, 0, 0x0);
103
104DEFINE_CLK_FIXED_RATE(utmi_phy_clkout_ck, CLK_IS_ROOT, 60000000, 0x0);
105
106DEFINE_CLK_FIXED_RATE(xclk60mhsp1_ck, CLK_IS_ROOT, 60000000, 0x0);
107
108DEFINE_CLK_FIXED_RATE(xclk60mhsp2_ck, CLK_IS_ROOT, 60000000, 0x0);
109
110DEFINE_CLK_FIXED_RATE(xclk60motg_ck, CLK_IS_ROOT, 60000000, 0x0);
111
112/* Module clocks and DPLL outputs */
113
114static const char *abe_dpll_bypass_clk_mux_ck_parents[] = {
115 "sys_clkin_ck", "sys_32k_ck",
116};
117
118DEFINE_CLK_MUX(abe_dpll_bypass_clk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents,
119 NULL, 0x0, OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_SHIFT,
120 OMAP4430_CLKSEL_WIDTH, 0x0, NULL);
121
122DEFINE_CLK_MUX(abe_dpll_refclk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents, NULL,
123 0x0, OMAP4430_CM_ABE_PLL_REF_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
124 OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
125
126/* DPLL_ABE */
127static struct dpll_data dpll_abe_dd = {
128 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_ABE,
129 .clk_bypass = &abe_dpll_bypass_clk_mux_ck,
130 .clk_ref = &abe_dpll_refclk_mux_ck,
131 .control_reg = OMAP4430_CM_CLKMODE_DPLL_ABE,
132 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
133 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_ABE,
134 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_ABE,
135 .mult_mask = OMAP4430_DPLL_MULT_MASK,
136 .div1_mask = OMAP4430_DPLL_DIV_MASK,
137 .enable_mask = OMAP4430_DPLL_EN_MASK,
138 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
139 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
Jon Hunter3ff51ed2012-12-15 01:35:46 -0700140 .m4xen_mask = OMAP4430_DPLL_REGM4XEN_MASK,
141 .lpmode_mask = OMAP4430_DPLL_LPMODE_EN_MASK,
Rajendra Nayakcb268672012-11-06 15:41:08 -0700142 .max_multiplier = 2047,
143 .max_divider = 128,
144 .min_divider = 1,
145};
146
147
148static const char *dpll_abe_ck_parents[] = {
149 "abe_dpll_refclk_mux_ck",
150};
151
152static struct clk dpll_abe_ck;
153
154static const struct clk_ops dpll_abe_ck_ops = {
155 .enable = &omap3_noncore_dpll_enable,
156 .disable = &omap3_noncore_dpll_disable,
157 .recalc_rate = &omap4_dpll_regm4xen_recalc,
158 .round_rate = &omap4_dpll_regm4xen_round_rate,
159 .set_rate = &omap3_noncore_dpll_set_rate,
160 .get_parent = &omap2_init_dpll_parent,
161};
162
163static struct clk_hw_omap dpll_abe_ck_hw = {
164 .hw = {
165 .clk = &dpll_abe_ck,
166 },
167 .dpll_data = &dpll_abe_dd,
168 .ops = &clkhwops_omap3_dpll,
169};
170
171DEFINE_STRUCT_CLK(dpll_abe_ck, dpll_abe_ck_parents, dpll_abe_ck_ops);
172
173static const char *dpll_abe_x2_ck_parents[] = {
174 "dpll_abe_ck",
175};
176
177static struct clk dpll_abe_x2_ck;
178
179static const struct clk_ops dpll_abe_x2_ck_ops = {
180 .recalc_rate = &omap3_clkoutx2_recalc,
181};
182
183static struct clk_hw_omap dpll_abe_x2_ck_hw = {
184 .hw = {
185 .clk = &dpll_abe_x2_ck,
186 },
187 .flags = CLOCK_CLKOUTX2,
188 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE,
189 .ops = &clkhwops_omap4_dpllmx,
190};
191
192DEFINE_STRUCT_CLK(dpll_abe_x2_ck, dpll_abe_x2_ck_parents, dpll_abe_x2_ck_ops);
193
194static const struct clk_ops omap_hsdivider_ops = {
195 .set_rate = &omap2_clksel_set_rate,
196 .recalc_rate = &omap2_clksel_recalc,
197 .round_rate = &omap2_clksel_round_rate,
198};
199
200DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m2x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
201 0x0, OMAP4430_CM_DIV_M2_DPLL_ABE,
202 OMAP4430_DPLL_CLKOUT_DIV_MASK);
203
204DEFINE_CLK_FIXED_FACTOR(abe_24m_fclk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
205 0x0, 1, 8);
206
207DEFINE_CLK_DIVIDER(abe_clk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, 0x0,
208 OMAP4430_CM_CLKSEL_ABE, OMAP4430_CLKSEL_OPP_SHIFT,
209 OMAP4430_CLKSEL_OPP_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
210
211DEFINE_CLK_DIVIDER(aess_fclk, "abe_clk", &abe_clk, 0x0,
212 OMAP4430_CM1_ABE_AESS_CLKCTRL,
213 OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
214 OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
215 0x0, NULL);
216
217DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m3x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
218 0x0, OMAP4430_CM_DIV_M3_DPLL_ABE,
219 OMAP4430_DPLL_CLKOUTHIF_DIV_MASK);
220
221static const char *core_hsd_byp_clk_mux_ck_parents[] = {
222 "sys_clkin_ck", "dpll_abe_m3x2_ck",
223};
224
225DEFINE_CLK_MUX(core_hsd_byp_clk_mux_ck, core_hsd_byp_clk_mux_ck_parents, NULL,
226 0x0, OMAP4430_CM_CLKSEL_DPLL_CORE,
227 OMAP4430_DPLL_BYP_CLKSEL_SHIFT, OMAP4430_DPLL_BYP_CLKSEL_WIDTH,
228 0x0, NULL);
229
230/* DPLL_CORE */
231static struct dpll_data dpll_core_dd = {
232 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_CORE,
233 .clk_bypass = &core_hsd_byp_clk_mux_ck,
234 .clk_ref = &sys_clkin_ck,
235 .control_reg = OMAP4430_CM_CLKMODE_DPLL_CORE,
236 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
237 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_CORE,
238 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_CORE,
239 .mult_mask = OMAP4430_DPLL_MULT_MASK,
240 .div1_mask = OMAP4430_DPLL_DIV_MASK,
241 .enable_mask = OMAP4430_DPLL_EN_MASK,
242 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
243 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
244 .max_multiplier = 2047,
245 .max_divider = 128,
246 .min_divider = 1,
247};
248
249
250static const char *dpll_core_ck_parents[] = {
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700251 "sys_clkin_ck", "core_hsd_byp_clk_mux_ck"
Rajendra Nayakcb268672012-11-06 15:41:08 -0700252};
253
254static struct clk dpll_core_ck;
255
256static const struct clk_ops dpll_core_ck_ops = {
257 .recalc_rate = &omap3_dpll_recalc,
258 .get_parent = &omap2_init_dpll_parent,
259};
260
261static struct clk_hw_omap dpll_core_ck_hw = {
262 .hw = {
263 .clk = &dpll_core_ck,
264 },
265 .dpll_data = &dpll_core_dd,
266 .ops = &clkhwops_omap3_dpll,
267};
268
269DEFINE_STRUCT_CLK(dpll_core_ck, dpll_core_ck_parents, dpll_core_ck_ops);
270
271static const char *dpll_core_x2_ck_parents[] = {
272 "dpll_core_ck",
273};
274
275static struct clk dpll_core_x2_ck;
276
277static struct clk_hw_omap dpll_core_x2_ck_hw = {
278 .hw = {
279 .clk = &dpll_core_x2_ck,
280 },
281};
282
283DEFINE_STRUCT_CLK(dpll_core_x2_ck, dpll_core_x2_ck_parents, dpll_abe_x2_ck_ops);
284
285DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m6x2_ck, "dpll_core_x2_ck",
286 &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M6_DPLL_CORE,
287 OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
288
289DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m2_ck, "dpll_core_ck", &dpll_core_ck, 0x0,
290 OMAP4430_CM_DIV_M2_DPLL_CORE,
291 OMAP4430_DPLL_CLKOUT_DIV_MASK);
292
293DEFINE_CLK_FIXED_FACTOR(ddrphy_ck, "dpll_core_m2_ck", &dpll_core_m2_ck, 0x0, 1,
294 2);
295
296DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m5x2_ck, "dpll_core_x2_ck",
297 &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M5_DPLL_CORE,
298 OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
299
300DEFINE_CLK_DIVIDER(div_core_ck, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck, 0x0,
301 OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_CORE_SHIFT,
302 OMAP4430_CLKSEL_CORE_WIDTH, 0x0, NULL);
303
Paul Walmsley628a37d2012-12-15 01:35:58 -0700304DEFINE_CLK_DIVIDER(div_iva_hs_clk, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck,
305 0x0, OMAP4430_CM_BYPCLK_DPLL_IVA, OMAP4430_CLKSEL_0_1_SHIFT,
306 OMAP4430_CLKSEL_0_1_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
Rajendra Nayakcb268672012-11-06 15:41:08 -0700307
308DEFINE_CLK_DIVIDER(div_mpu_hs_clk, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck,
309 0x0, OMAP4430_CM_BYPCLK_DPLL_MPU, OMAP4430_CLKSEL_0_1_SHIFT,
310 OMAP4430_CLKSEL_0_1_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
311
312DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m4x2_ck, "dpll_core_x2_ck",
313 &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M4_DPLL_CORE,
314 OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
315
316DEFINE_CLK_FIXED_FACTOR(dll_clk_div_ck, "dpll_core_m4x2_ck", &dpll_core_m4x2_ck,
317 0x0, 1, 2);
318
319DEFINE_CLK_DIVIDER(dpll_abe_m2_ck, "dpll_abe_ck", &dpll_abe_ck, 0x0,
320 OMAP4430_CM_DIV_M2_DPLL_ABE, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
321 OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
322
323static const struct clk_ops dmic_fck_ops = {
324 .enable = &omap2_dflt_clk_enable,
325 .disable = &omap2_dflt_clk_disable,
326 .is_enabled = &omap2_dflt_clk_is_enabled,
327 .recalc_rate = &omap2_clksel_recalc,
328 .get_parent = &omap2_clksel_find_parent_index,
329 .set_parent = &omap2_clksel_set_parent,
330 .init = &omap2_init_clk_clkdm,
331};
332
333static const char *dpll_core_m3x2_ck_parents[] = {
334 "dpll_core_x2_ck",
335};
336
337static const struct clksel dpll_core_m3x2_div[] = {
338 { .parent = &dpll_core_x2_ck, .rates = div31_1to31_rates },
339 { .parent = NULL },
340};
341
342/* XXX Missing round_rate, set_rate in ops */
343DEFINE_CLK_OMAP_MUX_GATE(dpll_core_m3x2_ck, NULL, dpll_core_m3x2_div,
344 OMAP4430_CM_DIV_M3_DPLL_CORE,
345 OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
346 OMAP4430_CM_DIV_M3_DPLL_CORE,
347 OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
348 dpll_core_m3x2_ck_parents, dmic_fck_ops);
349
350DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m7x2_ck, "dpll_core_x2_ck",
351 &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M7_DPLL_CORE,
352 OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
353
354static const char *iva_hsd_byp_clk_mux_ck_parents[] = {
355 "sys_clkin_ck", "div_iva_hs_clk",
356};
357
358DEFINE_CLK_MUX(iva_hsd_byp_clk_mux_ck, iva_hsd_byp_clk_mux_ck_parents, NULL,
359 0x0, OMAP4430_CM_CLKSEL_DPLL_IVA, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
360 OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
361
362/* DPLL_IVA */
363static struct dpll_data dpll_iva_dd = {
364 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_IVA,
365 .clk_bypass = &iva_hsd_byp_clk_mux_ck,
366 .clk_ref = &sys_clkin_ck,
367 .control_reg = OMAP4430_CM_CLKMODE_DPLL_IVA,
368 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
369 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_IVA,
370 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_IVA,
371 .mult_mask = OMAP4430_DPLL_MULT_MASK,
372 .div1_mask = OMAP4430_DPLL_DIV_MASK,
373 .enable_mask = OMAP4430_DPLL_EN_MASK,
374 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
375 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
376 .max_multiplier = 2047,
377 .max_divider = 128,
378 .min_divider = 1,
379};
380
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700381static const char *dpll_iva_ck_parents[] = {
382 "sys_clkin_ck", "iva_hsd_byp_clk_mux_ck"
383};
384
Rajendra Nayakcb268672012-11-06 15:41:08 -0700385static struct clk dpll_iva_ck;
386
Jon Hunter9b4fcc82012-12-15 01:35:43 -0700387static const struct clk_ops dpll_ck_ops = {
388 .enable = &omap3_noncore_dpll_enable,
389 .disable = &omap3_noncore_dpll_disable,
390 .recalc_rate = &omap3_dpll_recalc,
391 .round_rate = &omap2_dpll_round_rate,
392 .set_rate = &omap3_noncore_dpll_set_rate,
393 .get_parent = &omap2_init_dpll_parent,
394};
395
Rajendra Nayakcb268672012-11-06 15:41:08 -0700396static struct clk_hw_omap dpll_iva_ck_hw = {
397 .hw = {
398 .clk = &dpll_iva_ck,
399 },
400 .dpll_data = &dpll_iva_dd,
401 .ops = &clkhwops_omap3_dpll,
402};
403
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700404DEFINE_STRUCT_CLK(dpll_iva_ck, dpll_iva_ck_parents, dpll_ck_ops);
Rajendra Nayakcb268672012-11-06 15:41:08 -0700405
406static const char *dpll_iva_x2_ck_parents[] = {
407 "dpll_iva_ck",
408};
409
410static struct clk dpll_iva_x2_ck;
411
412static struct clk_hw_omap dpll_iva_x2_ck_hw = {
413 .hw = {
414 .clk = &dpll_iva_x2_ck,
415 },
416};
417
418DEFINE_STRUCT_CLK(dpll_iva_x2_ck, dpll_iva_x2_ck_parents, dpll_abe_x2_ck_ops);
419
420DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m4x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
421 0x0, OMAP4430_CM_DIV_M4_DPLL_IVA,
422 OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
423
424DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m5x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
425 0x0, OMAP4430_CM_DIV_M5_DPLL_IVA,
426 OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
427
428/* DPLL_MPU */
429static struct dpll_data dpll_mpu_dd = {
430 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_MPU,
431 .clk_bypass = &div_mpu_hs_clk,
432 .clk_ref = &sys_clkin_ck,
433 .control_reg = OMAP4430_CM_CLKMODE_DPLL_MPU,
434 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
435 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_MPU,
436 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_MPU,
437 .mult_mask = OMAP4430_DPLL_MULT_MASK,
438 .div1_mask = OMAP4430_DPLL_DIV_MASK,
439 .enable_mask = OMAP4430_DPLL_EN_MASK,
440 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
441 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
442 .max_multiplier = 2047,
443 .max_divider = 128,
444 .min_divider = 1,
445};
446
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700447static const char *dpll_mpu_ck_parents[] = {
448 "sys_clkin_ck", "div_mpu_hs_clk"
449};
450
Rajendra Nayakcb268672012-11-06 15:41:08 -0700451static struct clk dpll_mpu_ck;
452
453static struct clk_hw_omap dpll_mpu_ck_hw = {
454 .hw = {
455 .clk = &dpll_mpu_ck,
456 },
457 .dpll_data = &dpll_mpu_dd,
458 .ops = &clkhwops_omap3_dpll,
459};
460
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700461DEFINE_STRUCT_CLK(dpll_mpu_ck, dpll_mpu_ck_parents, dpll_ck_ops);
Rajendra Nayakcb268672012-11-06 15:41:08 -0700462
463DEFINE_CLK_FIXED_FACTOR(mpu_periphclk, "dpll_mpu_ck", &dpll_mpu_ck, 0x0, 1, 2);
464
465DEFINE_CLK_OMAP_HSDIVIDER(dpll_mpu_m2_ck, "dpll_mpu_ck", &dpll_mpu_ck, 0x0,
466 OMAP4430_CM_DIV_M2_DPLL_MPU,
467 OMAP4430_DPLL_CLKOUT_DIV_MASK);
468
469DEFINE_CLK_FIXED_FACTOR(per_hs_clk_div_ck, "dpll_abe_m3x2_ck",
470 &dpll_abe_m3x2_ck, 0x0, 1, 2);
471
472static const char *per_hsd_byp_clk_mux_ck_parents[] = {
473 "sys_clkin_ck", "per_hs_clk_div_ck",
474};
475
476DEFINE_CLK_MUX(per_hsd_byp_clk_mux_ck, per_hsd_byp_clk_mux_ck_parents, NULL,
477 0x0, OMAP4430_CM_CLKSEL_DPLL_PER, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
478 OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
479
480/* DPLL_PER */
481static struct dpll_data dpll_per_dd = {
482 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_PER,
483 .clk_bypass = &per_hsd_byp_clk_mux_ck,
484 .clk_ref = &sys_clkin_ck,
485 .control_reg = OMAP4430_CM_CLKMODE_DPLL_PER,
486 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
487 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_PER,
488 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_PER,
489 .mult_mask = OMAP4430_DPLL_MULT_MASK,
490 .div1_mask = OMAP4430_DPLL_DIV_MASK,
491 .enable_mask = OMAP4430_DPLL_EN_MASK,
492 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
493 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
494 .max_multiplier = 2047,
495 .max_divider = 128,
496 .min_divider = 1,
497};
498
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700499static const char *dpll_per_ck_parents[] = {
500 "sys_clkin_ck", "per_hsd_byp_clk_mux_ck"
501};
Rajendra Nayakcb268672012-11-06 15:41:08 -0700502
503static struct clk dpll_per_ck;
504
505static struct clk_hw_omap dpll_per_ck_hw = {
506 .hw = {
507 .clk = &dpll_per_ck,
508 },
509 .dpll_data = &dpll_per_dd,
510 .ops = &clkhwops_omap3_dpll,
511};
512
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700513DEFINE_STRUCT_CLK(dpll_per_ck, dpll_per_ck_parents, dpll_ck_ops);
Rajendra Nayakcb268672012-11-06 15:41:08 -0700514
515DEFINE_CLK_DIVIDER(dpll_per_m2_ck, "dpll_per_ck", &dpll_per_ck, 0x0,
516 OMAP4430_CM_DIV_M2_DPLL_PER, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
517 OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
518
519static const char *dpll_per_x2_ck_parents[] = {
520 "dpll_per_ck",
521};
522
523static struct clk dpll_per_x2_ck;
524
525static struct clk_hw_omap dpll_per_x2_ck_hw = {
526 .hw = {
527 .clk = &dpll_per_x2_ck,
528 },
529 .flags = CLOCK_CLKOUTX2,
530 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER,
531 .ops = &clkhwops_omap4_dpllmx,
532};
533
534DEFINE_STRUCT_CLK(dpll_per_x2_ck, dpll_per_x2_ck_parents, dpll_abe_x2_ck_ops);
535
536DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m2x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
537 0x0, OMAP4430_CM_DIV_M2_DPLL_PER,
538 OMAP4430_DPLL_CLKOUT_DIV_MASK);
539
540static const char *dpll_per_m3x2_ck_parents[] = {
541 "dpll_per_x2_ck",
542};
543
544static const struct clksel dpll_per_m3x2_div[] = {
545 { .parent = &dpll_per_x2_ck, .rates = div31_1to31_rates },
546 { .parent = NULL },
547};
548
549/* XXX Missing round_rate, set_rate in ops */
550DEFINE_CLK_OMAP_MUX_GATE(dpll_per_m3x2_ck, NULL, dpll_per_m3x2_div,
551 OMAP4430_CM_DIV_M3_DPLL_PER,
552 OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
553 OMAP4430_CM_DIV_M3_DPLL_PER,
554 OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
555 dpll_per_m3x2_ck_parents, dmic_fck_ops);
556
557DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m4x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
558 0x0, OMAP4430_CM_DIV_M4_DPLL_PER,
559 OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
560
561DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m5x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
562 0x0, OMAP4430_CM_DIV_M5_DPLL_PER,
563 OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
564
565DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m6x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
566 0x0, OMAP4430_CM_DIV_M6_DPLL_PER,
567 OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
568
569DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m7x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
570 0x0, OMAP4430_CM_DIV_M7_DPLL_PER,
571 OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
572
573DEFINE_CLK_FIXED_FACTOR(usb_hs_clk_div_ck, "dpll_abe_m3x2_ck",
574 &dpll_abe_m3x2_ck, 0x0, 1, 3);
575
576/* DPLL_USB */
577static struct dpll_data dpll_usb_dd = {
578 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_USB,
579 .clk_bypass = &usb_hs_clk_div_ck,
580 .flags = DPLL_J_TYPE,
581 .clk_ref = &sys_clkin_ck,
582 .control_reg = OMAP4430_CM_CLKMODE_DPLL_USB,
583 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
584 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB,
585 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB,
586 .mult_mask = OMAP4430_DPLL_MULT_USB_MASK,
587 .div1_mask = OMAP4430_DPLL_DIV_0_7_MASK,
588 .enable_mask = OMAP4430_DPLL_EN_MASK,
589 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
590 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
591 .sddiv_mask = OMAP4430_DPLL_SD_DIV_MASK,
592 .max_multiplier = 4095,
593 .max_divider = 256,
594 .min_divider = 1,
595};
596
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700597static const char *dpll_usb_ck_parents[] = {
598 "sys_clkin_ck", "usb_hs_clk_div_ck"
599};
600
Rajendra Nayakcb268672012-11-06 15:41:08 -0700601static struct clk dpll_usb_ck;
602
603static struct clk_hw_omap dpll_usb_ck_hw = {
604 .hw = {
605 .clk = &dpll_usb_ck,
606 },
607 .dpll_data = &dpll_usb_dd,
608 .ops = &clkhwops_omap3_dpll,
609};
610
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700611DEFINE_STRUCT_CLK(dpll_usb_ck, dpll_usb_ck_parents, dpll_ck_ops);
Rajendra Nayakcb268672012-11-06 15:41:08 -0700612
613static const char *dpll_usb_clkdcoldo_ck_parents[] = {
614 "dpll_usb_ck",
615};
616
617static struct clk dpll_usb_clkdcoldo_ck;
618
619static const struct clk_ops dpll_usb_clkdcoldo_ck_ops = {
620};
621
622static struct clk_hw_omap dpll_usb_clkdcoldo_ck_hw = {
623 .hw = {
624 .clk = &dpll_usb_clkdcoldo_ck,
625 },
626 .clksel_reg = OMAP4430_CM_CLKDCOLDO_DPLL_USB,
627 .ops = &clkhwops_omap4_dpllmx,
628};
629
630DEFINE_STRUCT_CLK(dpll_usb_clkdcoldo_ck, dpll_usb_clkdcoldo_ck_parents,
631 dpll_usb_clkdcoldo_ck_ops);
632
633DEFINE_CLK_OMAP_HSDIVIDER(dpll_usb_m2_ck, "dpll_usb_ck", &dpll_usb_ck, 0x0,
634 OMAP4430_CM_DIV_M2_DPLL_USB,
635 OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK);
636
637static const char *ducati_clk_mux_ck_parents[] = {
638 "div_core_ck", "dpll_per_m6x2_ck",
639};
640
641DEFINE_CLK_MUX(ducati_clk_mux_ck, ducati_clk_mux_ck_parents, NULL, 0x0,
642 OMAP4430_CM_CLKSEL_DUCATI_ISS_ROOT, OMAP4430_CLKSEL_0_0_SHIFT,
643 OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
644
645DEFINE_CLK_FIXED_FACTOR(func_12m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
646 0x0, 1, 16);
647
648DEFINE_CLK_FIXED_FACTOR(func_24m_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0,
649 1, 4);
650
651DEFINE_CLK_FIXED_FACTOR(func_24mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
652 0x0, 1, 8);
653
654static const struct clk_div_table func_48m_fclk_rates[] = {
655 { .div = 4, .val = 0 },
656 { .div = 8, .val = 1 },
657 { .div = 0 },
658};
659DEFINE_CLK_DIVIDER_TABLE(func_48m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
660 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
661 OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_48m_fclk_rates,
662 NULL);
663
664DEFINE_CLK_FIXED_FACTOR(func_48mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
665 0x0, 1, 4);
666
667static const struct clk_div_table func_64m_fclk_rates[] = {
668 { .div = 2, .val = 0 },
669 { .div = 4, .val = 1 },
670 { .div = 0 },
671};
672DEFINE_CLK_DIVIDER_TABLE(func_64m_fclk, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck,
673 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
674 OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_64m_fclk_rates,
675 NULL);
676
677static const struct clk_div_table func_96m_fclk_rates[] = {
678 { .div = 2, .val = 0 },
679 { .div = 4, .val = 1 },
680 { .div = 0 },
681};
682DEFINE_CLK_DIVIDER_TABLE(func_96m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
683 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
684 OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_96m_fclk_rates,
685 NULL);
686
687static const struct clk_div_table init_60m_fclk_rates[] = {
688 { .div = 1, .val = 0 },
689 { .div = 8, .val = 1 },
690 { .div = 0 },
691};
692DEFINE_CLK_DIVIDER_TABLE(init_60m_fclk, "dpll_usb_m2_ck", &dpll_usb_m2_ck,
693 0x0, OMAP4430_CM_CLKSEL_USB_60MHZ,
694 OMAP4430_CLKSEL_0_0_SHIFT, OMAP4430_CLKSEL_0_0_WIDTH,
695 0x0, init_60m_fclk_rates, NULL);
696
697DEFINE_CLK_DIVIDER(l3_div_ck, "div_core_ck", &div_core_ck, 0x0,
698 OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L3_SHIFT,
699 OMAP4430_CLKSEL_L3_WIDTH, 0x0, NULL);
700
701DEFINE_CLK_DIVIDER(l4_div_ck, "l3_div_ck", &l3_div_ck, 0x0,
702 OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L4_SHIFT,
703 OMAP4430_CLKSEL_L4_WIDTH, 0x0, NULL);
704
705DEFINE_CLK_FIXED_FACTOR(lp_clk_div_ck, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
706 0x0, 1, 16);
707
708static const char *l4_wkup_clk_mux_ck_parents[] = {
709 "sys_clkin_ck", "lp_clk_div_ck",
710};
711
712DEFINE_CLK_MUX(l4_wkup_clk_mux_ck, l4_wkup_clk_mux_ck_parents, NULL, 0x0,
713 OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
714 OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
715
716static const struct clk_div_table ocp_abe_iclk_rates[] = {
717 { .div = 2, .val = 0 },
718 { .div = 1, .val = 1 },
719 { .div = 0 },
720};
721DEFINE_CLK_DIVIDER_TABLE(ocp_abe_iclk, "aess_fclk", &aess_fclk, 0x0,
722 OMAP4430_CM1_ABE_AESS_CLKCTRL,
723 OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
724 OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
725 0x0, ocp_abe_iclk_rates, NULL);
726
727DEFINE_CLK_FIXED_FACTOR(per_abe_24m_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck,
728 0x0, 1, 4);
729
730DEFINE_CLK_DIVIDER(per_abe_nc_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck, 0x0,
731 OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
732 OMAP4430_SCALE_FCLK_WIDTH, 0x0, NULL);
733
734DEFINE_CLK_DIVIDER(syc_clk_div_ck, "sys_clkin_ck", &sys_clkin_ck, 0x0,
735 OMAP4430_CM_ABE_DSS_SYS_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
736 OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
737
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700738static const char *dbgclk_mux_ck_parents[] = {
739 "sys_clkin_ck"
740};
741
Rajendra Nayakcb268672012-11-06 15:41:08 -0700742static struct clk dbgclk_mux_ck;
743DEFINE_STRUCT_CLK_HW_OMAP(dbgclk_mux_ck, NULL);
Paul Walmsleyb8675e22012-12-15 01:36:04 -0700744DEFINE_STRUCT_CLK(dbgclk_mux_ck, dbgclk_mux_ck_parents,
Rajendra Nayakcb268672012-11-06 15:41:08 -0700745 dpll_usb_clkdcoldo_ck_ops);
746
747/* Leaf clocks controlled by modules */
748
749DEFINE_CLK_GATE(aes1_fck, "l3_div_ck", &l3_div_ck, 0x0,
750 OMAP4430_CM_L4SEC_AES1_CLKCTRL,
751 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
752
753DEFINE_CLK_GATE(aes2_fck, "l3_div_ck", &l3_div_ck, 0x0,
754 OMAP4430_CM_L4SEC_AES2_CLKCTRL,
755 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
756
Rajendra Nayakcb268672012-11-06 15:41:08 -0700757DEFINE_CLK_GATE(bandgap_fclk, "sys_32k_ck", &sys_32k_ck, 0x0,
758 OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
759 OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT, 0x0, NULL);
760
761static const struct clk_div_table div_ts_ck_rates[] = {
762 { .div = 8, .val = 0 },
763 { .div = 16, .val = 1 },
764 { .div = 32, .val = 2 },
765 { .div = 0 },
766};
767DEFINE_CLK_DIVIDER_TABLE(div_ts_ck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
768 0x0, OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
769 OMAP4430_CLKSEL_24_25_SHIFT,
770 OMAP4430_CLKSEL_24_25_WIDTH, 0x0, div_ts_ck_rates,
771 NULL);
772
773DEFINE_CLK_GATE(bandgap_ts_fclk, "div_ts_ck", &div_ts_ck, 0x0,
774 OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
775 OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT,
776 0x0, NULL);
777
Rajendra Nayakcb268672012-11-06 15:41:08 -0700778static const char *dmic_sync_mux_ck_parents[] = {
779 "abe_24m_fclk", "syc_clk_div_ck", "func_24m_clk",
780};
781
782DEFINE_CLK_MUX(dmic_sync_mux_ck, dmic_sync_mux_ck_parents, NULL,
783 0x0, OMAP4430_CM1_ABE_DMIC_CLKCTRL,
784 OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
785 OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
786
787static const struct clksel func_dmic_abe_gfclk_sel[] = {
788 { .parent = &dmic_sync_mux_ck, .rates = div_1_0_rates },
789 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
790 { .parent = &slimbus_clk, .rates = div_1_2_rates },
791 { .parent = NULL },
792};
793
794static const char *dmic_fck_parents[] = {
795 "dmic_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
796};
797
798/* Merged func_dmic_abe_gfclk into dmic */
799static struct clk dmic_fck;
800
801DEFINE_CLK_OMAP_MUX_GATE(dmic_fck, "abe_clkdm", func_dmic_abe_gfclk_sel,
802 OMAP4430_CM1_ABE_DMIC_CLKCTRL,
803 OMAP4430_CLKSEL_SOURCE_MASK,
804 OMAP4430_CM1_ABE_DMIC_CLKCTRL,
805 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
806 dmic_fck_parents, dmic_fck_ops);
807
Rajendra Nayakcb268672012-11-06 15:41:08 -0700808DEFINE_CLK_GATE(dss_sys_clk, "syc_clk_div_ck", &syc_clk_div_ck, 0x0,
809 OMAP4430_CM_DSS_DSS_CLKCTRL,
810 OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT, 0x0, NULL);
811
812DEFINE_CLK_GATE(dss_tv_clk, "extalt_clkin_ck", &extalt_clkin_ck, 0x0,
813 OMAP4430_CM_DSS_DSS_CLKCTRL,
814 OMAP4430_OPTFCLKEN_TV_CLK_SHIFT, 0x0, NULL);
815
816DEFINE_CLK_GATE(dss_dss_clk, "dpll_per_m5x2_ck", &dpll_per_m5x2_ck, 0x0,
817 OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_OPTFCLKEN_DSSCLK_SHIFT,
818 0x0, NULL);
819
820DEFINE_CLK_GATE(dss_48mhz_clk, "func_48mc_fclk", &func_48mc_fclk, 0x0,
821 OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT,
822 0x0, NULL);
823
824DEFINE_CLK_GATE(dss_fck, "l3_div_ck", &l3_div_ck, 0x0,
825 OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT,
826 0x0, NULL);
827
Rajendra Nayakcb268672012-11-06 15:41:08 -0700828DEFINE_CLK_DIVIDER(fdif_fck, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, 0x0,
829 OMAP4430_CM_CAM_FDIF_CLKCTRL, OMAP4430_CLKSEL_FCLK_SHIFT,
830 OMAP4430_CLKSEL_FCLK_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
831
Rajendra Nayakcb268672012-11-06 15:41:08 -0700832DEFINE_CLK_GATE(gpio1_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
833 OMAP4430_CM_WKUP_GPIO1_CLKCTRL,
834 OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL);
835
Rajendra Nayakcb268672012-11-06 15:41:08 -0700836DEFINE_CLK_GATE(gpio2_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
837 OMAP4430_CM_L4PER_GPIO2_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
838 0x0, NULL);
839
Rajendra Nayakcb268672012-11-06 15:41:08 -0700840DEFINE_CLK_GATE(gpio3_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
841 OMAP4430_CM_L4PER_GPIO3_CLKCTRL,
842 OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL);
843
Rajendra Nayakcb268672012-11-06 15:41:08 -0700844DEFINE_CLK_GATE(gpio4_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
845 OMAP4430_CM_L4PER_GPIO4_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
846 0x0, NULL);
847
Rajendra Nayakcb268672012-11-06 15:41:08 -0700848DEFINE_CLK_GATE(gpio5_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
849 OMAP4430_CM_L4PER_GPIO5_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
850 0x0, NULL);
851
Rajendra Nayakcb268672012-11-06 15:41:08 -0700852DEFINE_CLK_GATE(gpio6_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0,
853 OMAP4430_CM_L4PER_GPIO6_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT,
854 0x0, NULL);
855
Rajendra Nayakcb268672012-11-06 15:41:08 -0700856static const struct clksel sgx_clk_mux_sel[] = {
857 { .parent = &dpll_core_m7x2_ck, .rates = div_1_0_rates },
858 { .parent = &dpll_per_m7x2_ck, .rates = div_1_1_rates },
859 { .parent = NULL },
860};
861
862static const char *gpu_fck_parents[] = {
863 "dpll_core_m7x2_ck", "dpll_per_m7x2_ck",
864};
865
866/* Merged sgx_clk_mux into gpu */
867DEFINE_CLK_OMAP_MUX_GATE(gpu_fck, "l3_gfx_clkdm", sgx_clk_mux_sel,
868 OMAP4430_CM_GFX_GFX_CLKCTRL,
869 OMAP4430_CLKSEL_SGX_FCLK_MASK,
870 OMAP4430_CM_GFX_GFX_CLKCTRL,
871 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
872 gpu_fck_parents, dmic_fck_ops);
873
Rajendra Nayakcb268672012-11-06 15:41:08 -0700874DEFINE_CLK_DIVIDER(hsi_fck, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, 0x0,
875 OMAP4430_CM_L3INIT_HSI_CLKCTRL, OMAP4430_CLKSEL_24_25_SHIFT,
876 OMAP4430_CLKSEL_24_25_WIDTH, CLK_DIVIDER_POWER_OF_TWO,
877 NULL);
878
Rajendra Nayakcb268672012-11-06 15:41:08 -0700879DEFINE_CLK_GATE(iss_ctrlclk, "func_96m_fclk", &func_96m_fclk, 0x0,
880 OMAP4430_CM_CAM_ISS_CLKCTRL, OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT,
881 0x0, NULL);
882
Rajendra Nayakcb268672012-11-06 15:41:08 -0700883DEFINE_CLK_MUX(mcasp_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
884 OMAP4430_CM1_ABE_MCASP_CLKCTRL,
885 OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
886 OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
887
888static const struct clksel func_mcasp_abe_gfclk_sel[] = {
889 { .parent = &mcasp_sync_mux_ck, .rates = div_1_0_rates },
890 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
891 { .parent = &slimbus_clk, .rates = div_1_2_rates },
892 { .parent = NULL },
893};
894
895static const char *mcasp_fck_parents[] = {
896 "mcasp_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
897};
898
899/* Merged func_mcasp_abe_gfclk into mcasp */
900DEFINE_CLK_OMAP_MUX_GATE(mcasp_fck, "abe_clkdm", func_mcasp_abe_gfclk_sel,
901 OMAP4430_CM1_ABE_MCASP_CLKCTRL,
902 OMAP4430_CLKSEL_SOURCE_MASK,
903 OMAP4430_CM1_ABE_MCASP_CLKCTRL,
904 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
905 mcasp_fck_parents, dmic_fck_ops);
906
907DEFINE_CLK_MUX(mcbsp1_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
908 OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
909 OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
910 OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
911
912static const struct clksel func_mcbsp1_gfclk_sel[] = {
913 { .parent = &mcbsp1_sync_mux_ck, .rates = div_1_0_rates },
914 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
915 { .parent = &slimbus_clk, .rates = div_1_2_rates },
916 { .parent = NULL },
917};
918
919static const char *mcbsp1_fck_parents[] = {
920 "mcbsp1_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
921};
922
923/* Merged func_mcbsp1_gfclk into mcbsp1 */
924DEFINE_CLK_OMAP_MUX_GATE(mcbsp1_fck, "abe_clkdm", func_mcbsp1_gfclk_sel,
925 OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
926 OMAP4430_CLKSEL_SOURCE_MASK,
927 OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
928 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
929 mcbsp1_fck_parents, dmic_fck_ops);
930
931DEFINE_CLK_MUX(mcbsp2_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
932 OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
933 OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
934 OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
935
936static const struct clksel func_mcbsp2_gfclk_sel[] = {
937 { .parent = &mcbsp2_sync_mux_ck, .rates = div_1_0_rates },
938 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
939 { .parent = &slimbus_clk, .rates = div_1_2_rates },
940 { .parent = NULL },
941};
942
943static const char *mcbsp2_fck_parents[] = {
944 "mcbsp2_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
945};
946
947/* Merged func_mcbsp2_gfclk into mcbsp2 */
948DEFINE_CLK_OMAP_MUX_GATE(mcbsp2_fck, "abe_clkdm", func_mcbsp2_gfclk_sel,
949 OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
950 OMAP4430_CLKSEL_SOURCE_MASK,
951 OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
952 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
953 mcbsp2_fck_parents, dmic_fck_ops);
954
955DEFINE_CLK_MUX(mcbsp3_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0,
956 OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
957 OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
958 OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
959
960static const struct clksel func_mcbsp3_gfclk_sel[] = {
961 { .parent = &mcbsp3_sync_mux_ck, .rates = div_1_0_rates },
962 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
963 { .parent = &slimbus_clk, .rates = div_1_2_rates },
964 { .parent = NULL },
965};
966
967static const char *mcbsp3_fck_parents[] = {
968 "mcbsp3_sync_mux_ck", "pad_clks_ck", "slimbus_clk",
969};
970
971/* Merged func_mcbsp3_gfclk into mcbsp3 */
972DEFINE_CLK_OMAP_MUX_GATE(mcbsp3_fck, "abe_clkdm", func_mcbsp3_gfclk_sel,
973 OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
974 OMAP4430_CLKSEL_SOURCE_MASK,
975 OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
976 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
977 mcbsp3_fck_parents, dmic_fck_ops);
978
979static const char *mcbsp4_sync_mux_ck_parents[] = {
980 "func_96m_fclk", "per_abe_nc_fclk",
981};
982
983DEFINE_CLK_MUX(mcbsp4_sync_mux_ck, mcbsp4_sync_mux_ck_parents, NULL, 0x0,
984 OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
985 OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT,
986 OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH, 0x0, NULL);
987
988static const struct clksel per_mcbsp4_gfclk_sel[] = {
989 { .parent = &mcbsp4_sync_mux_ck, .rates = div_1_0_rates },
990 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
991 { .parent = NULL },
992};
993
994static const char *mcbsp4_fck_parents[] = {
995 "mcbsp4_sync_mux_ck", "pad_clks_ck",
996};
997
998/* Merged per_mcbsp4_gfclk into mcbsp4 */
999DEFINE_CLK_OMAP_MUX_GATE(mcbsp4_fck, "l4_per_clkdm", per_mcbsp4_gfclk_sel,
1000 OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
1001 OMAP4430_CLKSEL_SOURCE_24_24_MASK,
1002 OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
1003 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1004 mcbsp4_fck_parents, dmic_fck_ops);
1005
Rajendra Nayakcb268672012-11-06 15:41:08 -07001006static const struct clksel hsmmc1_fclk_sel[] = {
1007 { .parent = &func_64m_fclk, .rates = div_1_0_rates },
1008 { .parent = &func_96m_fclk, .rates = div_1_1_rates },
1009 { .parent = NULL },
1010};
1011
1012static const char *mmc1_fck_parents[] = {
1013 "func_64m_fclk", "func_96m_fclk",
1014};
1015
1016/* Merged hsmmc1_fclk into mmc1 */
1017DEFINE_CLK_OMAP_MUX_GATE(mmc1_fck, "l3_init_clkdm", hsmmc1_fclk_sel,
1018 OMAP4430_CM_L3INIT_MMC1_CLKCTRL, OMAP4430_CLKSEL_MASK,
1019 OMAP4430_CM_L3INIT_MMC1_CLKCTRL,
1020 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1021 mmc1_fck_parents, dmic_fck_ops);
1022
1023/* Merged hsmmc2_fclk into mmc2 */
1024DEFINE_CLK_OMAP_MUX_GATE(mmc2_fck, "l3_init_clkdm", hsmmc1_fclk_sel,
1025 OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
1026 OMAP4430_CM_L3INIT_MMC2_CLKCTRL,
1027 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1028 mmc1_fck_parents, dmic_fck_ops);
1029
Rajendra Nayakcb268672012-11-06 15:41:08 -07001030DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
1031 OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
1032 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
1033
Rajendra Nayakcb268672012-11-06 15:41:08 -07001034DEFINE_CLK_GATE(slimbus1_fclk_1, "func_24m_clk", &func_24m_clk, 0x0,
1035 OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
1036 OMAP4430_OPTFCLKEN_FCLK1_SHIFT, 0x0, NULL);
1037
1038DEFINE_CLK_GATE(slimbus1_fclk_0, "abe_24m_fclk", &abe_24m_fclk, 0x0,
1039 OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
1040 OMAP4430_OPTFCLKEN_FCLK0_SHIFT, 0x0, NULL);
1041
1042DEFINE_CLK_GATE(slimbus1_fclk_2, "pad_clks_ck", &pad_clks_ck, 0x0,
1043 OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
1044 OMAP4430_OPTFCLKEN_FCLK2_SHIFT, 0x0, NULL);
1045
1046DEFINE_CLK_GATE(slimbus1_slimbus_clk, "slimbus_clk", &slimbus_clk, 0x0,
1047 OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
1048 OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT, 0x0, NULL);
1049
Rajendra Nayakcb268672012-11-06 15:41:08 -07001050DEFINE_CLK_GATE(slimbus2_fclk_1, "per_abe_24m_fclk", &per_abe_24m_fclk, 0x0,
1051 OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
1052 OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT, 0x0, NULL);
1053
1054DEFINE_CLK_GATE(slimbus2_fclk_0, "func_24mc_fclk", &func_24mc_fclk, 0x0,
1055 OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
1056 OMAP4430_OPTFCLKEN_PER24MC_GFCLK_SHIFT, 0x0, NULL);
1057
1058DEFINE_CLK_GATE(slimbus2_slimbus_clk, "pad_slimbus_core_clks_ck",
1059 &pad_slimbus_core_clks_ck, 0x0,
1060 OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
1061 OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT, 0x0, NULL);
1062
Rajendra Nayakcb268672012-11-06 15:41:08 -07001063DEFINE_CLK_GATE(smartreflex_core_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
1064 0x0, OMAP4430_CM_ALWON_SR_CORE_CLKCTRL,
1065 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
1066
1067DEFINE_CLK_GATE(smartreflex_iva_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
1068 0x0, OMAP4430_CM_ALWON_SR_IVA_CLKCTRL,
1069 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
1070
1071DEFINE_CLK_GATE(smartreflex_mpu_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck,
1072 0x0, OMAP4430_CM_ALWON_SR_MPU_CLKCTRL,
1073 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
1074
1075static const struct clksel dmt1_clk_mux_sel[] = {
1076 { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
1077 { .parent = &sys_32k_ck, .rates = div_1_1_rates },
1078 { .parent = NULL },
1079};
1080
1081/* Merged dmt1_clk_mux into timer1 */
1082DEFINE_CLK_OMAP_MUX_GATE(timer1_fck, "l4_wkup_clkdm", dmt1_clk_mux_sel,
1083 OMAP4430_CM_WKUP_TIMER1_CLKCTRL, OMAP4430_CLKSEL_MASK,
1084 OMAP4430_CM_WKUP_TIMER1_CLKCTRL,
1085 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1086 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1087
1088/* Merged cm2_dm10_mux into timer10 */
1089DEFINE_CLK_OMAP_MUX_GATE(timer10_fck, "l4_per_clkdm", dmt1_clk_mux_sel,
1090 OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL,
1091 OMAP4430_CLKSEL_MASK,
1092 OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL,
1093 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1094 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1095
1096/* Merged cm2_dm11_mux into timer11 */
1097DEFINE_CLK_OMAP_MUX_GATE(timer11_fck, "l4_per_clkdm", dmt1_clk_mux_sel,
1098 OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL,
1099 OMAP4430_CLKSEL_MASK,
1100 OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL,
1101 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1102 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1103
1104/* Merged cm2_dm2_mux into timer2 */
1105DEFINE_CLK_OMAP_MUX_GATE(timer2_fck, "l4_per_clkdm", dmt1_clk_mux_sel,
1106 OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL,
1107 OMAP4430_CLKSEL_MASK,
1108 OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL,
1109 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1110 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1111
1112/* Merged cm2_dm3_mux into timer3 */
1113DEFINE_CLK_OMAP_MUX_GATE(timer3_fck, "l4_per_clkdm", dmt1_clk_mux_sel,
1114 OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL,
1115 OMAP4430_CLKSEL_MASK,
1116 OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL,
1117 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1118 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1119
1120/* Merged cm2_dm4_mux into timer4 */
1121DEFINE_CLK_OMAP_MUX_GATE(timer4_fck, "l4_per_clkdm", dmt1_clk_mux_sel,
1122 OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL,
1123 OMAP4430_CLKSEL_MASK,
1124 OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL,
1125 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1126 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1127
1128static const struct clksel timer5_sync_mux_sel[] = {
1129 { .parent = &syc_clk_div_ck, .rates = div_1_0_rates },
1130 { .parent = &sys_32k_ck, .rates = div_1_1_rates },
1131 { .parent = NULL },
1132};
1133
1134static const char *timer5_fck_parents[] = {
1135 "syc_clk_div_ck", "sys_32k_ck",
1136};
1137
1138/* Merged timer5_sync_mux into timer5 */
1139DEFINE_CLK_OMAP_MUX_GATE(timer5_fck, "abe_clkdm", timer5_sync_mux_sel,
1140 OMAP4430_CM1_ABE_TIMER5_CLKCTRL, OMAP4430_CLKSEL_MASK,
1141 OMAP4430_CM1_ABE_TIMER5_CLKCTRL,
1142 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1143 timer5_fck_parents, dmic_fck_ops);
1144
1145/* Merged timer6_sync_mux into timer6 */
1146DEFINE_CLK_OMAP_MUX_GATE(timer6_fck, "abe_clkdm", timer5_sync_mux_sel,
1147 OMAP4430_CM1_ABE_TIMER6_CLKCTRL, OMAP4430_CLKSEL_MASK,
1148 OMAP4430_CM1_ABE_TIMER6_CLKCTRL,
1149 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1150 timer5_fck_parents, dmic_fck_ops);
1151
1152/* Merged timer7_sync_mux into timer7 */
1153DEFINE_CLK_OMAP_MUX_GATE(timer7_fck, "abe_clkdm", timer5_sync_mux_sel,
1154 OMAP4430_CM1_ABE_TIMER7_CLKCTRL, OMAP4430_CLKSEL_MASK,
1155 OMAP4430_CM1_ABE_TIMER7_CLKCTRL,
1156 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1157 timer5_fck_parents, dmic_fck_ops);
1158
1159/* Merged timer8_sync_mux into timer8 */
1160DEFINE_CLK_OMAP_MUX_GATE(timer8_fck, "abe_clkdm", timer5_sync_mux_sel,
1161 OMAP4430_CM1_ABE_TIMER8_CLKCTRL, OMAP4430_CLKSEL_MASK,
1162 OMAP4430_CM1_ABE_TIMER8_CLKCTRL,
1163 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1164 timer5_fck_parents, dmic_fck_ops);
1165
1166/* Merged cm2_dm9_mux into timer9 */
1167DEFINE_CLK_OMAP_MUX_GATE(timer9_fck, "l4_per_clkdm", dmt1_clk_mux_sel,
1168 OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL,
1169 OMAP4430_CLKSEL_MASK,
1170 OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL,
1171 OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL,
1172 abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops);
1173
Rajendra Nayakcb268672012-11-06 15:41:08 -07001174static struct clk usb_host_fs_fck;
1175
1176static const char *usb_host_fs_fck_parent_names[] = {
1177 "func_48mc_fclk",
1178};
1179
1180static const struct clk_ops usb_host_fs_fck_ops = {
1181 .enable = &omap2_dflt_clk_enable,
1182 .disable = &omap2_dflt_clk_disable,
1183 .is_enabled = &omap2_dflt_clk_is_enabled,
1184};
1185
1186static struct clk_hw_omap usb_host_fs_fck_hw = {
1187 .hw = {
1188 .clk = &usb_host_fs_fck,
1189 },
1190 .enable_reg = OMAP4430_CM_L3INIT_USB_HOST_FS_CLKCTRL,
1191 .enable_bit = OMAP4430_MODULEMODE_SWCTRL_SHIFT,
1192 .clkdm_name = "l3_init_clkdm",
1193};
1194
1195DEFINE_STRUCT_CLK(usb_host_fs_fck, usb_host_fs_fck_parent_names,
1196 usb_host_fs_fck_ops);
1197
1198static const char *utmi_p1_gfclk_parents[] = {
1199 "init_60m_fclk", "xclk60mhsp1_ck",
1200};
1201
1202DEFINE_CLK_MUX(utmi_p1_gfclk, utmi_p1_gfclk_parents, NULL, 0x0,
1203 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1204 OMAP4430_CLKSEL_UTMI_P1_SHIFT, OMAP4430_CLKSEL_UTMI_P1_WIDTH,
1205 0x0, NULL);
1206
1207DEFINE_CLK_GATE(usb_host_hs_utmi_p1_clk, "utmi_p1_gfclk", &utmi_p1_gfclk, 0x0,
1208 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1209 OMAP4430_OPTFCLKEN_UTMI_P1_CLK_SHIFT, 0x0, NULL);
1210
1211static const char *utmi_p2_gfclk_parents[] = {
1212 "init_60m_fclk", "xclk60mhsp2_ck",
1213};
1214
1215DEFINE_CLK_MUX(utmi_p2_gfclk, utmi_p2_gfclk_parents, NULL, 0x0,
1216 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1217 OMAP4430_CLKSEL_UTMI_P2_SHIFT, OMAP4430_CLKSEL_UTMI_P2_WIDTH,
1218 0x0, NULL);
1219
1220DEFINE_CLK_GATE(usb_host_hs_utmi_p2_clk, "utmi_p2_gfclk", &utmi_p2_gfclk, 0x0,
1221 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1222 OMAP4430_OPTFCLKEN_UTMI_P2_CLK_SHIFT, 0x0, NULL);
1223
1224DEFINE_CLK_GATE(usb_host_hs_utmi_p3_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
1225 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1226 OMAP4430_OPTFCLKEN_UTMI_P3_CLK_SHIFT, 0x0, NULL);
1227
1228DEFINE_CLK_GATE(usb_host_hs_hsic480m_p1_clk, "dpll_usb_m2_ck",
1229 &dpll_usb_m2_ck, 0x0,
1230 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1231 OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT, 0x0, NULL);
1232
1233DEFINE_CLK_GATE(usb_host_hs_hsic60m_p1_clk, "init_60m_fclk",
1234 &init_60m_fclk, 0x0,
1235 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1236 OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT, 0x0, NULL);
1237
1238DEFINE_CLK_GATE(usb_host_hs_hsic60m_p2_clk, "init_60m_fclk",
1239 &init_60m_fclk, 0x0,
1240 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1241 OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT, 0x0, NULL);
1242
1243DEFINE_CLK_GATE(usb_host_hs_hsic480m_p2_clk, "dpll_usb_m2_ck",
1244 &dpll_usb_m2_ck, 0x0,
1245 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1246 OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT, 0x0, NULL);
1247
1248DEFINE_CLK_GATE(usb_host_hs_func48mclk, "func_48mc_fclk", &func_48mc_fclk, 0x0,
1249 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1250 OMAP4430_OPTFCLKEN_FUNC48MCLK_SHIFT, 0x0, NULL);
1251
1252DEFINE_CLK_GATE(usb_host_hs_fck, "init_60m_fclk", &init_60m_fclk, 0x0,
1253 OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
1254 OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
1255
1256static const char *otg_60m_gfclk_parents[] = {
1257 "utmi_phy_clkout_ck", "xclk60motg_ck",
1258};
1259
1260DEFINE_CLK_MUX(otg_60m_gfclk, otg_60m_gfclk_parents, NULL, 0x0,
1261 OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL, OMAP4430_CLKSEL_60M_SHIFT,
1262 OMAP4430_CLKSEL_60M_WIDTH, 0x0, NULL);
1263
1264DEFINE_CLK_GATE(usb_otg_hs_xclk, "otg_60m_gfclk", &otg_60m_gfclk, 0x0,
1265 OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
1266 OMAP4430_OPTFCLKEN_XCLK_SHIFT, 0x0, NULL);
1267
1268DEFINE_CLK_GATE(usb_otg_hs_ick, "l3_div_ck", &l3_div_ck, 0x0,
1269 OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
1270 OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL);
1271
1272DEFINE_CLK_GATE(usb_phy_cm_clk32k, "sys_32k_ck", &sys_32k_ck, 0x0,
1273 OMAP4430_CM_ALWON_USBPHY_CLKCTRL,
1274 OMAP4430_OPTFCLKEN_CLK32K_SHIFT, 0x0, NULL);
1275
1276DEFINE_CLK_GATE(usb_tll_hs_usb_ch2_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
1277 OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
1278 OMAP4430_OPTFCLKEN_USB_CH2_CLK_SHIFT, 0x0, NULL);
1279
1280DEFINE_CLK_GATE(usb_tll_hs_usb_ch0_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
1281 OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
1282 OMAP4430_OPTFCLKEN_USB_CH0_CLK_SHIFT, 0x0, NULL);
1283
1284DEFINE_CLK_GATE(usb_tll_hs_usb_ch1_clk, "init_60m_fclk", &init_60m_fclk, 0x0,
1285 OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
1286 OMAP4430_OPTFCLKEN_USB_CH1_CLK_SHIFT, 0x0, NULL);
1287
1288DEFINE_CLK_GATE(usb_tll_hs_ick, "l4_div_ck", &l4_div_ck, 0x0,
1289 OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
1290 OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL);
1291
1292static const struct clk_div_table usim_ck_rates[] = {
1293 { .div = 14, .val = 0 },
1294 { .div = 18, .val = 1 },
1295 { .div = 0 },
1296};
1297DEFINE_CLK_DIVIDER_TABLE(usim_ck, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, 0x0,
1298 OMAP4430_CM_WKUP_USIM_CLKCTRL,
1299 OMAP4430_CLKSEL_DIV_SHIFT, OMAP4430_CLKSEL_DIV_WIDTH,
1300 0x0, usim_ck_rates, NULL);
1301
1302DEFINE_CLK_GATE(usim_fclk, "usim_ck", &usim_ck, 0x0,
1303 OMAP4430_CM_WKUP_USIM_CLKCTRL, OMAP4430_OPTFCLKEN_FCLK_SHIFT,
1304 0x0, NULL);
1305
Rajendra Nayakcb268672012-11-06 15:41:08 -07001306/* Remaining optional clocks */
1307static const char *pmd_stm_clock_mux_ck_parents[] = {
1308 "sys_clkin_ck", "dpll_core_m6x2_ck", "tie_low_clock_ck",
1309};
1310
1311DEFINE_CLK_MUX(pmd_stm_clock_mux_ck, pmd_stm_clock_mux_ck_parents, NULL, 0x0,
1312 OMAP4430_CM_EMU_DEBUGSS_CLKCTRL, OMAP4430_PMD_STM_MUX_CTRL_SHIFT,
1313 OMAP4430_PMD_STM_MUX_CTRL_WIDTH, 0x0, NULL);
1314
1315DEFINE_CLK_MUX(pmd_trace_clk_mux_ck, pmd_stm_clock_mux_ck_parents, NULL, 0x0,
1316 OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
1317 OMAP4430_PMD_TRACE_MUX_CTRL_SHIFT,
1318 OMAP4430_PMD_TRACE_MUX_CTRL_WIDTH, 0x0, NULL);
1319
1320DEFINE_CLK_DIVIDER(stm_clk_div_ck, "pmd_stm_clock_mux_ck",
1321 &pmd_stm_clock_mux_ck, 0x0, OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
1322 OMAP4430_CLKSEL_PMD_STM_CLK_SHIFT,
1323 OMAP4430_CLKSEL_PMD_STM_CLK_WIDTH, CLK_DIVIDER_POWER_OF_TWO,
1324 NULL);
1325
1326static const char *trace_clk_div_ck_parents[] = {
1327 "pmd_trace_clk_mux_ck",
1328};
1329
1330static const struct clksel trace_clk_div_div[] = {
1331 { .parent = &pmd_trace_clk_mux_ck, .rates = div3_1to4_rates },
1332 { .parent = NULL },
1333};
1334
1335static struct clk trace_clk_div_ck;
1336
1337static const struct clk_ops trace_clk_div_ck_ops = {
1338 .recalc_rate = &omap2_clksel_recalc,
1339 .set_rate = &omap2_clksel_set_rate,
1340 .round_rate = &omap2_clksel_round_rate,
1341 .init = &omap2_init_clk_clkdm,
1342 .enable = &omap2_clkops_enable_clkdm,
1343 .disable = &omap2_clkops_disable_clkdm,
1344};
1345
1346static struct clk_hw_omap trace_clk_div_ck_hw = {
1347 .hw = {
1348 .clk = &trace_clk_div_ck,
1349 },
1350 .clkdm_name = "emu_sys_clkdm",
1351 .clksel = trace_clk_div_div,
1352 .clksel_reg = OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
1353 .clksel_mask = OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK,
1354};
1355
1356DEFINE_STRUCT_CLK(trace_clk_div_ck, trace_clk_div_ck_parents,
1357 trace_clk_div_ck_ops);
1358
1359/* SCRM aux clk nodes */
1360
1361static const struct clksel auxclk_src_sel[] = {
1362 { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
1363 { .parent = &dpll_core_m3x2_ck, .rates = div_1_1_rates },
1364 { .parent = &dpll_per_m3x2_ck, .rates = div_1_2_rates },
1365 { .parent = NULL },
1366};
1367
1368static const char *auxclk_src_ck_parents[] = {
1369 "sys_clkin_ck", "dpll_core_m3x2_ck", "dpll_per_m3x2_ck",
1370};
1371
1372static const struct clk_ops auxclk_src_ck_ops = {
1373 .enable = &omap2_dflt_clk_enable,
1374 .disable = &omap2_dflt_clk_disable,
1375 .is_enabled = &omap2_dflt_clk_is_enabled,
1376 .recalc_rate = &omap2_clksel_recalc,
1377 .get_parent = &omap2_clksel_find_parent_index,
1378};
1379
1380DEFINE_CLK_OMAP_MUX_GATE(auxclk0_src_ck, NULL, auxclk_src_sel,
1381 OMAP4_SCRM_AUXCLK0, OMAP4_SRCSELECT_MASK,
1382 OMAP4_SCRM_AUXCLK0, OMAP4_ENABLE_SHIFT, NULL,
1383 auxclk_src_ck_parents, auxclk_src_ck_ops);
1384
1385DEFINE_CLK_DIVIDER(auxclk0_ck, "auxclk0_src_ck", &auxclk0_src_ck, 0x0,
1386 OMAP4_SCRM_AUXCLK0, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
1387 0x0, NULL);
1388
1389DEFINE_CLK_OMAP_MUX_GATE(auxclk1_src_ck, NULL, auxclk_src_sel,
1390 OMAP4_SCRM_AUXCLK1, OMAP4_SRCSELECT_MASK,
1391 OMAP4_SCRM_AUXCLK1, OMAP4_ENABLE_SHIFT, NULL,
1392 auxclk_src_ck_parents, auxclk_src_ck_ops);
1393
1394DEFINE_CLK_DIVIDER(auxclk1_ck, "auxclk1_src_ck", &auxclk1_src_ck, 0x0,
1395 OMAP4_SCRM_AUXCLK1, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
1396 0x0, NULL);
1397
1398DEFINE_CLK_OMAP_MUX_GATE(auxclk2_src_ck, NULL, auxclk_src_sel,
1399 OMAP4_SCRM_AUXCLK2, OMAP4_SRCSELECT_MASK,
1400 OMAP4_SCRM_AUXCLK2, OMAP4_ENABLE_SHIFT, NULL,
1401 auxclk_src_ck_parents, auxclk_src_ck_ops);
1402
1403DEFINE_CLK_DIVIDER(auxclk2_ck, "auxclk2_src_ck", &auxclk2_src_ck, 0x0,
1404 OMAP4_SCRM_AUXCLK2, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
1405 0x0, NULL);
1406
1407DEFINE_CLK_OMAP_MUX_GATE(auxclk3_src_ck, NULL, auxclk_src_sel,
1408 OMAP4_SCRM_AUXCLK3, OMAP4_SRCSELECT_MASK,
1409 OMAP4_SCRM_AUXCLK3, OMAP4_ENABLE_SHIFT, NULL,
1410 auxclk_src_ck_parents, auxclk_src_ck_ops);
1411
1412DEFINE_CLK_DIVIDER(auxclk3_ck, "auxclk3_src_ck", &auxclk3_src_ck, 0x0,
1413 OMAP4_SCRM_AUXCLK3, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
1414 0x0, NULL);
1415
1416DEFINE_CLK_OMAP_MUX_GATE(auxclk4_src_ck, NULL, auxclk_src_sel,
1417 OMAP4_SCRM_AUXCLK4, OMAP4_SRCSELECT_MASK,
1418 OMAP4_SCRM_AUXCLK4, OMAP4_ENABLE_SHIFT, NULL,
1419 auxclk_src_ck_parents, auxclk_src_ck_ops);
1420
1421DEFINE_CLK_DIVIDER(auxclk4_ck, "auxclk4_src_ck", &auxclk4_src_ck, 0x0,
1422 OMAP4_SCRM_AUXCLK4, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
1423 0x0, NULL);
1424
1425DEFINE_CLK_OMAP_MUX_GATE(auxclk5_src_ck, NULL, auxclk_src_sel,
1426 OMAP4_SCRM_AUXCLK5, OMAP4_SRCSELECT_MASK,
1427 OMAP4_SCRM_AUXCLK5, OMAP4_ENABLE_SHIFT, NULL,
1428 auxclk_src_ck_parents, auxclk_src_ck_ops);
1429
1430DEFINE_CLK_DIVIDER(auxclk5_ck, "auxclk5_src_ck", &auxclk5_src_ck, 0x0,
1431 OMAP4_SCRM_AUXCLK5, OMAP4_CLKDIV_SHIFT, OMAP4_CLKDIV_WIDTH,
1432 0x0, NULL);
1433
1434static const char *auxclkreq_ck_parents[] = {
1435 "auxclk0_ck", "auxclk1_ck", "auxclk2_ck", "auxclk3_ck", "auxclk4_ck",
1436 "auxclk5_ck",
1437};
1438
1439DEFINE_CLK_MUX(auxclkreq0_ck, auxclkreq_ck_parents, NULL, 0x0,
1440 OMAP4_SCRM_AUXCLKREQ0, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
1441 0x0, NULL);
1442
1443DEFINE_CLK_MUX(auxclkreq1_ck, auxclkreq_ck_parents, NULL, 0x0,
1444 OMAP4_SCRM_AUXCLKREQ1, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
1445 0x0, NULL);
1446
1447DEFINE_CLK_MUX(auxclkreq2_ck, auxclkreq_ck_parents, NULL, 0x0,
1448 OMAP4_SCRM_AUXCLKREQ2, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
1449 0x0, NULL);
1450
1451DEFINE_CLK_MUX(auxclkreq3_ck, auxclkreq_ck_parents, NULL, 0x0,
1452 OMAP4_SCRM_AUXCLKREQ3, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
1453 0x0, NULL);
1454
1455DEFINE_CLK_MUX(auxclkreq4_ck, auxclkreq_ck_parents, NULL, 0x0,
1456 OMAP4_SCRM_AUXCLKREQ4, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
1457 0x0, NULL);
1458
1459DEFINE_CLK_MUX(auxclkreq5_ck, auxclkreq_ck_parents, NULL, 0x0,
1460 OMAP4_SCRM_AUXCLKREQ5, OMAP4_MAPPING_SHIFT, OMAP4_MAPPING_WIDTH,
1461 0x0, NULL);
1462
1463/*
1464 * clkdev
1465 */
1466
1467static struct omap_clk omap44xx_clks[] = {
1468 CLK(NULL, "extalt_clkin_ck", &extalt_clkin_ck, CK_443X),
1469 CLK(NULL, "pad_clks_src_ck", &pad_clks_src_ck, CK_443X),
1470 CLK(NULL, "pad_clks_ck", &pad_clks_ck, CK_443X),
1471 CLK(NULL, "pad_slimbus_core_clks_ck", &pad_slimbus_core_clks_ck, CK_443X),
1472 CLK(NULL, "secure_32k_clk_src_ck", &secure_32k_clk_src_ck, CK_443X),
1473 CLK(NULL, "slimbus_src_clk", &slimbus_src_clk, CK_443X),
1474 CLK(NULL, "slimbus_clk", &slimbus_clk, CK_443X),
1475 CLK(NULL, "sys_32k_ck", &sys_32k_ck, CK_443X),
1476 CLK(NULL, "virt_12000000_ck", &virt_12000000_ck, CK_443X),
1477 CLK(NULL, "virt_13000000_ck", &virt_13000000_ck, CK_443X),
1478 CLK(NULL, "virt_16800000_ck", &virt_16800000_ck, CK_443X),
1479 CLK(NULL, "virt_19200000_ck", &virt_19200000_ck, CK_443X),
1480 CLK(NULL, "virt_26000000_ck", &virt_26000000_ck, CK_443X),
1481 CLK(NULL, "virt_27000000_ck", &virt_27000000_ck, CK_443X),
1482 CLK(NULL, "virt_38400000_ck", &virt_38400000_ck, CK_443X),
1483 CLK(NULL, "sys_clkin_ck", &sys_clkin_ck, CK_443X),
1484 CLK(NULL, "tie_low_clock_ck", &tie_low_clock_ck, CK_443X),
1485 CLK(NULL, "utmi_phy_clkout_ck", &utmi_phy_clkout_ck, CK_443X),
1486 CLK(NULL, "xclk60mhsp1_ck", &xclk60mhsp1_ck, CK_443X),
1487 CLK(NULL, "xclk60mhsp2_ck", &xclk60mhsp2_ck, CK_443X),
1488 CLK(NULL, "xclk60motg_ck", &xclk60motg_ck, CK_443X),
1489 CLK(NULL, "abe_dpll_bypass_clk_mux_ck", &abe_dpll_bypass_clk_mux_ck, CK_443X),
1490 CLK(NULL, "abe_dpll_refclk_mux_ck", &abe_dpll_refclk_mux_ck, CK_443X),
1491 CLK(NULL, "dpll_abe_ck", &dpll_abe_ck, CK_443X),
1492 CLK(NULL, "dpll_abe_x2_ck", &dpll_abe_x2_ck, CK_443X),
1493 CLK(NULL, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, CK_443X),
1494 CLK(NULL, "abe_24m_fclk", &abe_24m_fclk, CK_443X),
1495 CLK(NULL, "abe_clk", &abe_clk, CK_443X),
1496 CLK(NULL, "aess_fclk", &aess_fclk, CK_443X),
1497 CLK(NULL, "dpll_abe_m3x2_ck", &dpll_abe_m3x2_ck, CK_443X),
1498 CLK(NULL, "core_hsd_byp_clk_mux_ck", &core_hsd_byp_clk_mux_ck, CK_443X),
1499 CLK(NULL, "dpll_core_ck", &dpll_core_ck, CK_443X),
1500 CLK(NULL, "dpll_core_x2_ck", &dpll_core_x2_ck, CK_443X),
1501 CLK(NULL, "dpll_core_m6x2_ck", &dpll_core_m6x2_ck, CK_443X),
1502 CLK(NULL, "dbgclk_mux_ck", &dbgclk_mux_ck, CK_443X),
1503 CLK(NULL, "dpll_core_m2_ck", &dpll_core_m2_ck, CK_443X),
1504 CLK(NULL, "ddrphy_ck", &ddrphy_ck, CK_443X),
1505 CLK(NULL, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck, CK_443X),
1506 CLK(NULL, "div_core_ck", &div_core_ck, CK_443X),
1507 CLK(NULL, "div_iva_hs_clk", &div_iva_hs_clk, CK_443X),
1508 CLK(NULL, "div_mpu_hs_clk", &div_mpu_hs_clk, CK_443X),
1509 CLK(NULL, "dpll_core_m4x2_ck", &dpll_core_m4x2_ck, CK_443X),
1510 CLK(NULL, "dll_clk_div_ck", &dll_clk_div_ck, CK_443X),
1511 CLK(NULL, "dpll_abe_m2_ck", &dpll_abe_m2_ck, CK_443X),
1512 CLK(NULL, "dpll_core_m3x2_ck", &dpll_core_m3x2_ck, CK_443X),
1513 CLK(NULL, "dpll_core_m7x2_ck", &dpll_core_m7x2_ck, CK_443X),
1514 CLK(NULL, "iva_hsd_byp_clk_mux_ck", &iva_hsd_byp_clk_mux_ck, CK_443X),
1515 CLK(NULL, "dpll_iva_ck", &dpll_iva_ck, CK_443X),
1516 CLK(NULL, "dpll_iva_x2_ck", &dpll_iva_x2_ck, CK_443X),
1517 CLK(NULL, "dpll_iva_m4x2_ck", &dpll_iva_m4x2_ck, CK_443X),
1518 CLK(NULL, "dpll_iva_m5x2_ck", &dpll_iva_m5x2_ck, CK_443X),
1519 CLK(NULL, "dpll_mpu_ck", &dpll_mpu_ck, CK_443X),
1520 CLK(NULL, "dpll_mpu_m2_ck", &dpll_mpu_m2_ck, CK_443X),
1521 CLK(NULL, "per_hs_clk_div_ck", &per_hs_clk_div_ck, CK_443X),
1522 CLK(NULL, "per_hsd_byp_clk_mux_ck", &per_hsd_byp_clk_mux_ck, CK_443X),
1523 CLK(NULL, "dpll_per_ck", &dpll_per_ck, CK_443X),
1524 CLK(NULL, "dpll_per_m2_ck", &dpll_per_m2_ck, CK_443X),
1525 CLK(NULL, "dpll_per_x2_ck", &dpll_per_x2_ck, CK_443X),
1526 CLK(NULL, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, CK_443X),
1527 CLK(NULL, "dpll_per_m3x2_ck", &dpll_per_m3x2_ck, CK_443X),
1528 CLK(NULL, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, CK_443X),
1529 CLK(NULL, "dpll_per_m5x2_ck", &dpll_per_m5x2_ck, CK_443X),
1530 CLK(NULL, "dpll_per_m6x2_ck", &dpll_per_m6x2_ck, CK_443X),
1531 CLK(NULL, "dpll_per_m7x2_ck", &dpll_per_m7x2_ck, CK_443X),
1532 CLK(NULL, "usb_hs_clk_div_ck", &usb_hs_clk_div_ck, CK_443X),
1533 CLK(NULL, "dpll_usb_ck", &dpll_usb_ck, CK_443X),
1534 CLK(NULL, "dpll_usb_clkdcoldo_ck", &dpll_usb_clkdcoldo_ck, CK_443X),
1535 CLK(NULL, "dpll_usb_m2_ck", &dpll_usb_m2_ck, CK_443X),
1536 CLK(NULL, "ducati_clk_mux_ck", &ducati_clk_mux_ck, CK_443X),
1537 CLK(NULL, "func_12m_fclk", &func_12m_fclk, CK_443X),
1538 CLK(NULL, "func_24m_clk", &func_24m_clk, CK_443X),
1539 CLK(NULL, "func_24mc_fclk", &func_24mc_fclk, CK_443X),
1540 CLK(NULL, "func_48m_fclk", &func_48m_fclk, CK_443X),
1541 CLK(NULL, "func_48mc_fclk", &func_48mc_fclk, CK_443X),
1542 CLK(NULL, "func_64m_fclk", &func_64m_fclk, CK_443X),
1543 CLK(NULL, "func_96m_fclk", &func_96m_fclk, CK_443X),
1544 CLK(NULL, "init_60m_fclk", &init_60m_fclk, CK_443X),
1545 CLK(NULL, "l3_div_ck", &l3_div_ck, CK_443X),
1546 CLK(NULL, "l4_div_ck", &l4_div_ck, CK_443X),
1547 CLK(NULL, "lp_clk_div_ck", &lp_clk_div_ck, CK_443X),
1548 CLK(NULL, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, CK_443X),
1549 CLK("smp_twd", NULL, &mpu_periphclk, CK_443X),
1550 CLK(NULL, "ocp_abe_iclk", &ocp_abe_iclk, CK_443X),
1551 CLK(NULL, "per_abe_24m_fclk", &per_abe_24m_fclk, CK_443X),
1552 CLK(NULL, "per_abe_nc_fclk", &per_abe_nc_fclk, CK_443X),
1553 CLK(NULL, "syc_clk_div_ck", &syc_clk_div_ck, CK_443X),
1554 CLK(NULL, "aes1_fck", &aes1_fck, CK_443X),
1555 CLK(NULL, "aes2_fck", &aes2_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001556 CLK(NULL, "bandgap_fclk", &bandgap_fclk, CK_443X),
1557 CLK(NULL, "div_ts_ck", &div_ts_ck, CK_446X),
1558 CLK(NULL, "bandgap_ts_fclk", &bandgap_ts_fclk, CK_446X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001559 CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X),
1560 CLK(NULL, "dmic_fck", &dmic_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001561 CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X),
1562 CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X),
1563 CLK(NULL, "dss_dss_clk", &dss_dss_clk, CK_443X),
1564 CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X),
1565 CLK(NULL, "dss_fck", &dss_fck, CK_443X),
1566 CLK("omapdss_dss", "ick", &dss_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001567 CLK(NULL, "fdif_fck", &fdif_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001568 CLK(NULL, "gpio1_dbclk", &gpio1_dbclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001569 CLK(NULL, "gpio2_dbclk", &gpio2_dbclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001570 CLK(NULL, "gpio3_dbclk", &gpio3_dbclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001571 CLK(NULL, "gpio4_dbclk", &gpio4_dbclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001572 CLK(NULL, "gpio5_dbclk", &gpio5_dbclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001573 CLK(NULL, "gpio6_dbclk", &gpio6_dbclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001574 CLK(NULL, "gpu_fck", &gpu_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001575 CLK(NULL, "hsi_fck", &hsi_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001576 CLK(NULL, "iss_ctrlclk", &iss_ctrlclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001577 CLK(NULL, "mcasp_sync_mux_ck", &mcasp_sync_mux_ck, CK_443X),
1578 CLK(NULL, "mcasp_fck", &mcasp_fck, CK_443X),
1579 CLK(NULL, "mcbsp1_sync_mux_ck", &mcbsp1_sync_mux_ck, CK_443X),
1580 CLK(NULL, "mcbsp1_fck", &mcbsp1_fck, CK_443X),
1581 CLK(NULL, "mcbsp2_sync_mux_ck", &mcbsp2_sync_mux_ck, CK_443X),
1582 CLK(NULL, "mcbsp2_fck", &mcbsp2_fck, CK_443X),
1583 CLK(NULL, "mcbsp3_sync_mux_ck", &mcbsp3_sync_mux_ck, CK_443X),
1584 CLK(NULL, "mcbsp3_fck", &mcbsp3_fck, CK_443X),
1585 CLK(NULL, "mcbsp4_sync_mux_ck", &mcbsp4_sync_mux_ck, CK_443X),
1586 CLK(NULL, "mcbsp4_fck", &mcbsp4_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001587 CLK(NULL, "mmc1_fck", &mmc1_fck, CK_443X),
1588 CLK(NULL, "mmc2_fck", &mmc2_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001589 CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001590 CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X),
1591 CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X),
1592 CLK(NULL, "slimbus1_fclk_2", &slimbus1_fclk_2, CK_443X),
1593 CLK(NULL, "slimbus1_slimbus_clk", &slimbus1_slimbus_clk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001594 CLK(NULL, "slimbus2_fclk_1", &slimbus2_fclk_1, CK_443X),
1595 CLK(NULL, "slimbus2_fclk_0", &slimbus2_fclk_0, CK_443X),
1596 CLK(NULL, "slimbus2_slimbus_clk", &slimbus2_slimbus_clk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001597 CLK(NULL, "smartreflex_core_fck", &smartreflex_core_fck, CK_443X),
1598 CLK(NULL, "smartreflex_iva_fck", &smartreflex_iva_fck, CK_443X),
1599 CLK(NULL, "smartreflex_mpu_fck", &smartreflex_mpu_fck, CK_443X),
1600 CLK(NULL, "timer1_fck", &timer1_fck, CK_443X),
1601 CLK(NULL, "timer10_fck", &timer10_fck, CK_443X),
1602 CLK(NULL, "timer11_fck", &timer11_fck, CK_443X),
1603 CLK(NULL, "timer2_fck", &timer2_fck, CK_443X),
1604 CLK(NULL, "timer3_fck", &timer3_fck, CK_443X),
1605 CLK(NULL, "timer4_fck", &timer4_fck, CK_443X),
1606 CLK(NULL, "timer5_fck", &timer5_fck, CK_443X),
1607 CLK(NULL, "timer6_fck", &timer6_fck, CK_443X),
1608 CLK(NULL, "timer7_fck", &timer7_fck, CK_443X),
1609 CLK(NULL, "timer8_fck", &timer8_fck, CK_443X),
1610 CLK(NULL, "timer9_fck", &timer9_fck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001611 CLK(NULL, "usb_host_fs_fck", &usb_host_fs_fck, CK_443X),
1612 CLK("usbhs_omap", "fs_fck", &usb_host_fs_fck, CK_443X),
1613 CLK(NULL, "utmi_p1_gfclk", &utmi_p1_gfclk, CK_443X),
1614 CLK(NULL, "usb_host_hs_utmi_p1_clk", &usb_host_hs_utmi_p1_clk, CK_443X),
1615 CLK(NULL, "utmi_p2_gfclk", &utmi_p2_gfclk, CK_443X),
1616 CLK(NULL, "usb_host_hs_utmi_p2_clk", &usb_host_hs_utmi_p2_clk, CK_443X),
1617 CLK(NULL, "usb_host_hs_utmi_p3_clk", &usb_host_hs_utmi_p3_clk, CK_443X),
1618 CLK(NULL, "usb_host_hs_hsic480m_p1_clk", &usb_host_hs_hsic480m_p1_clk, CK_443X),
1619 CLK(NULL, "usb_host_hs_hsic60m_p1_clk", &usb_host_hs_hsic60m_p1_clk, CK_443X),
1620 CLK(NULL, "usb_host_hs_hsic60m_p2_clk", &usb_host_hs_hsic60m_p2_clk, CK_443X),
1621 CLK(NULL, "usb_host_hs_hsic480m_p2_clk", &usb_host_hs_hsic480m_p2_clk, CK_443X),
1622 CLK(NULL, "usb_host_hs_func48mclk", &usb_host_hs_func48mclk, CK_443X),
1623 CLK(NULL, "usb_host_hs_fck", &usb_host_hs_fck, CK_443X),
1624 CLK("usbhs_omap", "hs_fck", &usb_host_hs_fck, CK_443X),
1625 CLK(NULL, "otg_60m_gfclk", &otg_60m_gfclk, CK_443X),
1626 CLK(NULL, "usb_otg_hs_xclk", &usb_otg_hs_xclk, CK_443X),
1627 CLK(NULL, "usb_otg_hs_ick", &usb_otg_hs_ick, CK_443X),
1628 CLK("musb-omap2430", "ick", &usb_otg_hs_ick, CK_443X),
1629 CLK(NULL, "usb_phy_cm_clk32k", &usb_phy_cm_clk32k, CK_443X),
1630 CLK(NULL, "usb_tll_hs_usb_ch2_clk", &usb_tll_hs_usb_ch2_clk, CK_443X),
1631 CLK(NULL, "usb_tll_hs_usb_ch0_clk", &usb_tll_hs_usb_ch0_clk, CK_443X),
1632 CLK(NULL, "usb_tll_hs_usb_ch1_clk", &usb_tll_hs_usb_ch1_clk, CK_443X),
1633 CLK(NULL, "usb_tll_hs_ick", &usb_tll_hs_ick, CK_443X),
1634 CLK("usbhs_omap", "usbtll_ick", &usb_tll_hs_ick, CK_443X),
1635 CLK("usbhs_tll", "usbtll_ick", &usb_tll_hs_ick, CK_443X),
1636 CLK(NULL, "usim_ck", &usim_ck, CK_443X),
1637 CLK(NULL, "usim_fclk", &usim_fclk, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001638 CLK(NULL, "pmd_stm_clock_mux_ck", &pmd_stm_clock_mux_ck, CK_443X),
1639 CLK(NULL, "pmd_trace_clk_mux_ck", &pmd_trace_clk_mux_ck, CK_443X),
1640 CLK(NULL, "stm_clk_div_ck", &stm_clk_div_ck, CK_443X),
1641 CLK(NULL, "trace_clk_div_ck", &trace_clk_div_ck, CK_443X),
1642 CLK(NULL, "auxclk0_src_ck", &auxclk0_src_ck, CK_443X),
1643 CLK(NULL, "auxclk0_ck", &auxclk0_ck, CK_443X),
1644 CLK(NULL, "auxclkreq0_ck", &auxclkreq0_ck, CK_443X),
1645 CLK(NULL, "auxclk1_src_ck", &auxclk1_src_ck, CK_443X),
1646 CLK(NULL, "auxclk1_ck", &auxclk1_ck, CK_443X),
1647 CLK(NULL, "auxclkreq1_ck", &auxclkreq1_ck, CK_443X),
1648 CLK(NULL, "auxclk2_src_ck", &auxclk2_src_ck, CK_443X),
1649 CLK(NULL, "auxclk2_ck", &auxclk2_ck, CK_443X),
1650 CLK(NULL, "auxclkreq2_ck", &auxclkreq2_ck, CK_443X),
1651 CLK(NULL, "auxclk3_src_ck", &auxclk3_src_ck, CK_443X),
1652 CLK(NULL, "auxclk3_ck", &auxclk3_ck, CK_443X),
1653 CLK(NULL, "auxclkreq3_ck", &auxclkreq3_ck, CK_443X),
1654 CLK(NULL, "auxclk4_src_ck", &auxclk4_src_ck, CK_443X),
1655 CLK(NULL, "auxclk4_ck", &auxclk4_ck, CK_443X),
1656 CLK(NULL, "auxclkreq4_ck", &auxclkreq4_ck, CK_443X),
1657 CLK(NULL, "auxclk5_src_ck", &auxclk5_src_ck, CK_443X),
1658 CLK(NULL, "auxclk5_ck", &auxclk5_ck, CK_443X),
1659 CLK(NULL, "auxclkreq5_ck", &auxclkreq5_ck, CK_443X),
1660 CLK("omap-gpmc", "fck", &dummy_ck, CK_443X),
1661 CLK("omap_i2c.1", "ick", &dummy_ck, CK_443X),
1662 CLK("omap_i2c.2", "ick", &dummy_ck, CK_443X),
1663 CLK("omap_i2c.3", "ick", &dummy_ck, CK_443X),
1664 CLK("omap_i2c.4", "ick", &dummy_ck, CK_443X),
1665 CLK(NULL, "mailboxes_ick", &dummy_ck, CK_443X),
1666 CLK("omap_hsmmc.0", "ick", &dummy_ck, CK_443X),
1667 CLK("omap_hsmmc.1", "ick", &dummy_ck, CK_443X),
1668 CLK("omap_hsmmc.2", "ick", &dummy_ck, CK_443X),
1669 CLK("omap_hsmmc.3", "ick", &dummy_ck, CK_443X),
1670 CLK("omap_hsmmc.4", "ick", &dummy_ck, CK_443X),
1671 CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_443X),
1672 CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_443X),
1673 CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_443X),
1674 CLK("omap-mcbsp.4", "ick", &dummy_ck, CK_443X),
1675 CLK("omap2_mcspi.1", "ick", &dummy_ck, CK_443X),
1676 CLK("omap2_mcspi.2", "ick", &dummy_ck, CK_443X),
1677 CLK("omap2_mcspi.3", "ick", &dummy_ck, CK_443X),
1678 CLK("omap2_mcspi.4", "ick", &dummy_ck, CK_443X),
1679 CLK(NULL, "uart1_ick", &dummy_ck, CK_443X),
1680 CLK(NULL, "uart2_ick", &dummy_ck, CK_443X),
1681 CLK(NULL, "uart3_ick", &dummy_ck, CK_443X),
1682 CLK(NULL, "uart4_ick", &dummy_ck, CK_443X),
1683 CLK("usbhs_omap", "usbhost_ick", &dummy_ck, CK_443X),
1684 CLK("usbhs_omap", "usbtll_fck", &dummy_ck, CK_443X),
1685 CLK("usbhs_tll", "usbtll_fck", &dummy_ck, CK_443X),
1686 CLK("omap_wdt", "ick", &dummy_ck, CK_443X),
1687 CLK(NULL, "timer_32k_ck", &sys_32k_ck, CK_443X),
1688 /* TODO: Remove "omap_timer.X" aliases once DT migration is complete */
1689 CLK("omap_timer.1", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1690 CLK("omap_timer.2", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1691 CLK("omap_timer.3", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1692 CLK("omap_timer.4", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1693 CLK("omap_timer.9", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1694 CLK("omap_timer.10", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1695 CLK("omap_timer.11", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1696 CLK("omap_timer.5", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1697 CLK("omap_timer.6", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1698 CLK("omap_timer.7", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1699 CLK("omap_timer.8", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1700 CLK("4a318000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1701 CLK("48032000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1702 CLK("48034000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1703 CLK("48036000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1704 CLK("4803e000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1705 CLK("48086000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
1706 CLK("48088000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
Jon Hunterba68c7e2012-12-15 01:35:39 -07001707 CLK("40138000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1708 CLK("4013a000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1709 CLK("4013c000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
1710 CLK("4013e000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
Rajendra Nayakcb268672012-11-06 15:41:08 -07001711 CLK(NULL, "cpufreq_ck", &dpll_mpu_ck, CK_443X),
1712};
1713
Rajendra Nayakcb268672012-11-06 15:41:08 -07001714int __init omap4xxx_clk_init(void)
1715{
1716 u32 cpu_clkflg;
1717 struct omap_clk *c;
Jon Hunter8c197cc2012-12-15 01:35:50 -07001718 int rc;
Rajendra Nayakcb268672012-11-06 15:41:08 -07001719
1720 if (cpu_is_omap443x()) {
1721 cpu_mask = RATE_IN_4430;
1722 cpu_clkflg = CK_443X;
1723 } else if (cpu_is_omap446x() || cpu_is_omap447x()) {
1724 cpu_mask = RATE_IN_4460 | RATE_IN_4430;
1725 cpu_clkflg = CK_446X | CK_443X;
1726
1727 if (cpu_is_omap447x())
1728 pr_warn("WARNING: OMAP4470 clock data incomplete!\n");
1729 } else {
1730 return 0;
1731 }
1732
1733 for (c = omap44xx_clks; c < omap44xx_clks + ARRAY_SIZE(omap44xx_clks);
1734 c++) {
1735 if (c->cpu & cpu_clkflg) {
1736 clkdev_add(&c->lk);
1737 if (!__clk_init(NULL, c->lk.clk))
1738 omap2_init_clk_hw_omap_clocks(c->lk.clk);
1739 }
1740 }
1741
1742 omap2_clk_disable_autoidle_all();
1743
Jon Hunter8c197cc2012-12-15 01:35:50 -07001744 /*
1745 * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power
1746 * state when turning the ABE clock domain. Workaround this by
1747 * locking the ABE DPLL on boot.
Peter Ujfalusi981827a2013-01-18 16:48:15 -07001748 * Lock the ABE DPLL in any case to avoid issues with audio.
Jon Hunter8c197cc2012-12-15 01:35:50 -07001749 */
Peter Ujfalusi981827a2013-01-18 16:48:15 -07001750 rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck);
1751 if (!rc)
1752 rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ);
1753 if (rc)
1754 pr_err("%s: failed to configure ABE DPLL!\n", __func__);
Jon Hunter8c197cc2012-12-15 01:35:50 -07001755
Rajendra Nayakcb268672012-11-06 15:41:08 -07001756 return 0;
1757}