blob: b7c68819c4e7e2391cf474491bd441f0d8b38bc6 [file] [log] [blame]
Tony Lindgren3179a012005-11-10 14:26:48 +00001/*
2 * linux/arch/arm/mach-omap1/clock.h
3 *
4 * Copyright (C) 2004 - 2005 Nokia corporation
5 * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
6 * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef __ARCH_ARM_MACH_OMAP1_CLOCK_H
14#define __ARCH_ARM_MACH_OMAP1_CLOCK_H
15
Tony Lindgren10b55792006-01-17 15:30:42 -080016static int omap1_clk_enable_generic(struct clk * clk);
17static void omap1_clk_disable_generic(struct clk * clk);
Tony Lindgren3179a012005-11-10 14:26:48 +000018static void omap1_ckctl_recalc(struct clk * clk);
19static void omap1_watchdog_recalc(struct clk * clk);
20static void omap1_ckctl_recalc_dsp_domain(struct clk * clk);
21static int omap1_clk_enable_dsp_domain(struct clk * clk);
22static int omap1_clk_set_rate_dsp_domain(struct clk * clk, unsigned long rate);
23static void omap1_clk_disable_dsp_domain(struct clk * clk);
24static int omap1_set_uart_rate(struct clk * clk, unsigned long rate);
25static void omap1_uart_recalc(struct clk * clk);
26static int omap1_clk_enable_uart_functional(struct clk * clk);
27static void omap1_clk_disable_uart_functional(struct clk * clk);
28static int omap1_set_ext_clk_rate(struct clk * clk, unsigned long rate);
29static long omap1_round_ext_clk_rate(struct clk * clk, unsigned long rate);
30static void omap1_init_ext_clk(struct clk * clk);
31static int omap1_select_table_rate(struct clk * clk, unsigned long rate);
32static long omap1_round_to_table_rate(struct clk * clk, unsigned long rate);
Tony Lindgren10b55792006-01-17 15:30:42 -080033static int omap1_clk_enable(struct clk *clk);
34static void omap1_clk_disable(struct clk *clk);
Tony Lindgren3179a012005-11-10 14:26:48 +000035
36struct mpu_rate {
37 unsigned long rate;
38 unsigned long xtal;
39 unsigned long pll_rate;
40 __u16 ckctl_val;
41 __u16 dpllctl_val;
42};
43
44struct uart_clk {
45 struct clk clk;
46 unsigned long sysc_addr;
47};
48
49/* Provide a method for preventing idling some ARM IDLECT clocks */
50struct arm_idlect1_clk {
51 struct clk clk;
52 unsigned long no_idle_count;
53 __u8 idlect_shift;
54};
55
56/* ARM_CKCTL bit shifts */
57#define CKCTL_PERDIV_OFFSET 0
58#define CKCTL_LCDDIV_OFFSET 2
59#define CKCTL_ARMDIV_OFFSET 4
60#define CKCTL_DSPDIV_OFFSET 6
61#define CKCTL_TCDIV_OFFSET 8
62#define CKCTL_DSPMMUDIV_OFFSET 10
63/*#define ARM_TIMXO 12*/
64#define EN_DSPCK 13
65/*#define ARM_INTHCK_SEL 14*/ /* Divide-by-2 for mpu inth_ck */
66/* DSP_CKCTL bit shifts */
67#define CKCTL_DSPPERDIV_OFFSET 0
68
69/* ARM_IDLECT2 bit shifts */
70#define EN_WDTCK 0
71#define EN_XORPCK 1
72#define EN_PERCK 2
73#define EN_LCDCK 3
74#define EN_LBCK 4 /* Not on 1610/1710 */
75/*#define EN_HSABCK 5*/
76#define EN_APICK 6
77#define EN_TIMCK 7
78#define DMACK_REQ 8
79#define EN_GPIOCK 9 /* Not on 1610/1710 */
80/*#define EN_LBFREECK 10*/
81#define EN_CKOUT_ARM 11
82
83/* ARM_IDLECT3 bit shifts */
84#define EN_OCPI_CK 0
85#define EN_TC1_CK 2
86#define EN_TC2_CK 4
87
88/* DSP_IDLECT2 bit shifts (0,1,2 are same as for ARM_IDLECT2) */
89#define EN_DSPTIMCK 5
90
91/* Various register defines for clock controls scattered around OMAP chip */
92#define USB_MCLK_EN_BIT 4 /* In ULPD_CLKC_CTRL */
93#define USB_HOST_HHC_UHOST_EN 9 /* In MOD_CONF_CTRL_0 */
94#define SWD_ULPD_PLL_CLK_REQ 1 /* In SWD_CLK_DIV_CTRL_SEL */
95#define COM_ULPD_PLL_CLK_REQ 1 /* In COM_CLK_DIV_CTRL_SEL */
96#define SWD_CLK_DIV_CTRL_SEL 0xfffe0874
97#define COM_CLK_DIV_CTRL_SEL 0xfffe0878
98#define SOFT_REQ_REG 0xfffe0834
99#define SOFT_REQ_REG2 0xfffe0880
100
101/*-------------------------------------------------------------------------
102 * Omap1 MPU rate table
103 *-------------------------------------------------------------------------*/
104static struct mpu_rate rate_table[] = {
105 /* MPU MHz, xtal MHz, dpll1 MHz, CKCTL, DPLL_CTL
106 * NOTE: Comment order here is different from bits in CKCTL value:
107 * armdiv, dspdiv, dspmmu, tcdiv, perdiv, lcddiv
108 */
109#if defined(CONFIG_OMAP_ARM_216MHZ)
110 { 216000000, 12000000, 216000000, 0x050d, 0x2910 }, /* 1/1/2/2/2/8 */
111#endif
112#if defined(CONFIG_OMAP_ARM_195MHZ)
113 { 195000000, 13000000, 195000000, 0x050e, 0x2790 }, /* 1/1/2/2/4/8 */
114#endif
115#if defined(CONFIG_OMAP_ARM_192MHZ)
116 { 192000000, 19200000, 192000000, 0x050f, 0x2510 }, /* 1/1/2/2/8/8 */
117 { 192000000, 12000000, 192000000, 0x050f, 0x2810 }, /* 1/1/2/2/8/8 */
118 { 96000000, 12000000, 192000000, 0x055f, 0x2810 }, /* 2/2/2/2/8/8 */
119 { 48000000, 12000000, 192000000, 0x0baf, 0x2810 }, /* 4/4/4/8/8/8 */
120 { 24000000, 12000000, 192000000, 0x0fff, 0x2810 }, /* 8/8/8/8/8/8 */
121#endif
122#if defined(CONFIG_OMAP_ARM_182MHZ)
123 { 182000000, 13000000, 182000000, 0x050e, 0x2710 }, /* 1/1/2/2/4/8 */
124#endif
125#if defined(CONFIG_OMAP_ARM_168MHZ)
126 { 168000000, 12000000, 168000000, 0x010f, 0x2710 }, /* 1/1/1/2/8/8 */
127#endif
128#if defined(CONFIG_OMAP_ARM_150MHZ)
129 { 150000000, 12000000, 150000000, 0x010a, 0x2cb0 }, /* 1/1/1/2/4/4 */
130#endif
131#if defined(CONFIG_OMAP_ARM_120MHZ)
132 { 120000000, 12000000, 120000000, 0x010a, 0x2510 }, /* 1/1/1/2/4/4 */
133#endif
134#if defined(CONFIG_OMAP_ARM_96MHZ)
135 { 96000000, 12000000, 96000000, 0x0005, 0x2410 }, /* 1/1/1/1/2/2 */
136#endif
137#if defined(CONFIG_OMAP_ARM_60MHZ)
138 { 60000000, 12000000, 60000000, 0x0005, 0x2290 }, /* 1/1/1/1/2/2 */
139#endif
140#if defined(CONFIG_OMAP_ARM_30MHZ)
141 { 30000000, 12000000, 60000000, 0x0555, 0x2290 }, /* 2/2/2/2/2/2 */
142#endif
143 { 0, 0, 0, 0, 0 },
144};
145
146/*-------------------------------------------------------------------------
147 * Omap1 clocks
148 *-------------------------------------------------------------------------*/
149
150static struct clk ck_ref = {
151 .name = "ck_ref",
152 .rate = 12000000,
153 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100154 CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
Tony Lindgren10b55792006-01-17 15:30:42 -0800155 .enable = &omap1_clk_enable_generic,
156 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000157};
158
159static struct clk ck_dpll1 = {
160 .name = "ck_dpll1",
161 .parent = &ck_ref,
162 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100163 CLOCK_IN_OMAP310 | RATE_PROPAGATES | ALWAYS_ENABLED,
Tony Lindgren10b55792006-01-17 15:30:42 -0800164 .enable = &omap1_clk_enable_generic,
165 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000166};
167
168static struct arm_idlect1_clk ck_dpll1out = {
169 .clk = {
170 .name = "ck_dpll1out",
171 .parent = &ck_dpll1,
172 .flags = CLOCK_IN_OMAP16XX | CLOCK_IDLE_CONTROL,
173 .enable_reg = (void __iomem *)ARM_IDLECT2,
174 .enable_bit = EN_CKOUT_ARM,
175 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800176 .enable = &omap1_clk_enable_generic,
177 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000178 },
179 .idlect_shift = 12,
180};
181
182static struct clk arm_ck = {
183 .name = "arm_ck",
184 .parent = &ck_dpll1,
185 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100186 CLOCK_IN_OMAP310 | RATE_CKCTL | RATE_PROPAGATES |
187 ALWAYS_ENABLED,
Tony Lindgren3179a012005-11-10 14:26:48 +0000188 .rate_offset = CKCTL_ARMDIV_OFFSET,
189 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800190 .enable = &omap1_clk_enable_generic,
191 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000192};
193
194static struct arm_idlect1_clk armper_ck = {
195 .clk = {
196 .name = "armper_ck",
197 .parent = &ck_dpll1,
198 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100199 CLOCK_IN_OMAP310 | RATE_CKCTL |
200 CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000201 .enable_reg = (void __iomem *)ARM_IDLECT2,
202 .enable_bit = EN_PERCK,
203 .rate_offset = CKCTL_PERDIV_OFFSET,
204 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800205 .enable = &omap1_clk_enable_generic,
206 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000207 },
208 .idlect_shift = 2,
209};
210
211static struct clk arm_gpio_ck = {
212 .name = "arm_gpio_ck",
213 .parent = &ck_dpll1,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100214 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
Tony Lindgren3179a012005-11-10 14:26:48 +0000215 .enable_reg = (void __iomem *)ARM_IDLECT2,
216 .enable_bit = EN_GPIOCK,
217 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800218 .enable = &omap1_clk_enable_generic,
219 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000220};
221
222static struct arm_idlect1_clk armxor_ck = {
223 .clk = {
224 .name = "armxor_ck",
225 .parent = &ck_ref,
226 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100227 CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000228 .enable_reg = (void __iomem *)ARM_IDLECT2,
229 .enable_bit = EN_XORPCK,
230 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800231 .enable = &omap1_clk_enable_generic,
232 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000233 },
234 .idlect_shift = 1,
235};
236
237static struct arm_idlect1_clk armtim_ck = {
238 .clk = {
239 .name = "armtim_ck",
240 .parent = &ck_ref,
241 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100242 CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000243 .enable_reg = (void __iomem *)ARM_IDLECT2,
244 .enable_bit = EN_TIMCK,
245 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800246 .enable = &omap1_clk_enable_generic,
247 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000248 },
249 .idlect_shift = 9,
250};
251
252static struct arm_idlect1_clk armwdt_ck = {
253 .clk = {
254 .name = "armwdt_ck",
255 .parent = &ck_ref,
256 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100257 CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000258 .enable_reg = (void __iomem *)ARM_IDLECT2,
259 .enable_bit = EN_WDTCK,
260 .recalc = &omap1_watchdog_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800261 .enable = &omap1_clk_enable_generic,
262 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000263 },
264 .idlect_shift = 0,
265};
266
267static struct clk arminth_ck16xx = {
268 .name = "arminth_ck",
269 .parent = &arm_ck,
270 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
271 .recalc = &followparent_recalc,
272 /* Note: On 16xx the frequency can be divided by 2 by programming
273 * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
274 *
275 * 1510 version is in TC clocks.
276 */
Tony Lindgren10b55792006-01-17 15:30:42 -0800277 .enable = &omap1_clk_enable_generic,
278 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000279};
280
281static struct clk dsp_ck = {
282 .name = "dsp_ck",
283 .parent = &ck_dpll1,
284 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
285 RATE_CKCTL,
286 .enable_reg = (void __iomem *)ARM_CKCTL,
287 .enable_bit = EN_DSPCK,
288 .rate_offset = CKCTL_DSPDIV_OFFSET,
289 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800290 .enable = &omap1_clk_enable_generic,
291 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000292};
293
294static struct clk dspmmu_ck = {
295 .name = "dspmmu_ck",
296 .parent = &ck_dpll1,
297 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
298 RATE_CKCTL | ALWAYS_ENABLED,
299 .rate_offset = CKCTL_DSPMMUDIV_OFFSET,
300 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800301 .enable = &omap1_clk_enable_generic,
302 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000303};
304
305static struct clk dspper_ck = {
306 .name = "dspper_ck",
307 .parent = &ck_dpll1,
308 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
309 RATE_CKCTL | VIRTUAL_IO_ADDRESS,
310 .enable_reg = (void __iomem *)DSP_IDLECT2,
311 .enable_bit = EN_PERCK,
312 .rate_offset = CKCTL_PERDIV_OFFSET,
313 .recalc = &omap1_ckctl_recalc_dsp_domain,
314 .set_rate = &omap1_clk_set_rate_dsp_domain,
315 .enable = &omap1_clk_enable_dsp_domain,
316 .disable = &omap1_clk_disable_dsp_domain,
317};
318
319static struct clk dspxor_ck = {
320 .name = "dspxor_ck",
321 .parent = &ck_ref,
322 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
323 VIRTUAL_IO_ADDRESS,
324 .enable_reg = (void __iomem *)DSP_IDLECT2,
325 .enable_bit = EN_XORPCK,
326 .recalc = &followparent_recalc,
327 .enable = &omap1_clk_enable_dsp_domain,
328 .disable = &omap1_clk_disable_dsp_domain,
329};
330
331static struct clk dsptim_ck = {
332 .name = "dsptim_ck",
333 .parent = &ck_ref,
334 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
335 VIRTUAL_IO_ADDRESS,
336 .enable_reg = (void __iomem *)DSP_IDLECT2,
337 .enable_bit = EN_DSPTIMCK,
338 .recalc = &followparent_recalc,
339 .enable = &omap1_clk_enable_dsp_domain,
340 .disable = &omap1_clk_disable_dsp_domain,
341};
342
343/* Tie ARM_IDLECT1:IDLIF_ARM to this logical clock structure */
344static struct arm_idlect1_clk tc_ck = {
345 .clk = {
346 .name = "tc_ck",
347 .parent = &ck_dpll1,
348 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100349 CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 |
350 RATE_CKCTL | RATE_PROPAGATES |
351 ALWAYS_ENABLED | CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000352 .rate_offset = CKCTL_TCDIV_OFFSET,
353 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800354 .enable = &omap1_clk_enable_generic,
355 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000356 },
357 .idlect_shift = 6,
358};
359
360static struct clk arminth_ck1510 = {
361 .name = "arminth_ck",
362 .parent = &tc_ck.clk,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100363 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
364 ALWAYS_ENABLED,
Tony Lindgren3179a012005-11-10 14:26:48 +0000365 .recalc = &followparent_recalc,
366 /* Note: On 1510 the frequency follows TC_CK
367 *
368 * 16xx version is in MPU clocks.
369 */
Tony Lindgren10b55792006-01-17 15:30:42 -0800370 .enable = &omap1_clk_enable_generic,
371 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000372};
373
374static struct clk tipb_ck = {
375 /* No-idle controlled by "tc_ck" */
376 .name = "tibp_ck",
377 .parent = &tc_ck.clk,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100378 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
379 ALWAYS_ENABLED,
Tony Lindgren3179a012005-11-10 14:26:48 +0000380 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800381 .enable = &omap1_clk_enable_generic,
382 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000383};
384
385static struct clk l3_ocpi_ck = {
386 /* No-idle controlled by "tc_ck" */
387 .name = "l3_ocpi_ck",
388 .parent = &tc_ck.clk,
389 .flags = CLOCK_IN_OMAP16XX,
390 .enable_reg = (void __iomem *)ARM_IDLECT3,
391 .enable_bit = EN_OCPI_CK,
392 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800393 .enable = &omap1_clk_enable_generic,
394 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000395};
396
397static struct clk tc1_ck = {
398 .name = "tc1_ck",
399 .parent = &tc_ck.clk,
400 .flags = CLOCK_IN_OMAP16XX,
401 .enable_reg = (void __iomem *)ARM_IDLECT3,
402 .enable_bit = EN_TC1_CK,
403 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800404 .enable = &omap1_clk_enable_generic,
405 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000406};
407
408static struct clk tc2_ck = {
409 .name = "tc2_ck",
410 .parent = &tc_ck.clk,
411 .flags = CLOCK_IN_OMAP16XX,
412 .enable_reg = (void __iomem *)ARM_IDLECT3,
413 .enable_bit = EN_TC2_CK,
414 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800415 .enable = &omap1_clk_enable_generic,
416 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000417};
418
419static struct clk dma_ck = {
420 /* No-idle controlled by "tc_ck" */
421 .name = "dma_ck",
422 .parent = &tc_ck.clk,
423 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100424 CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
Tony Lindgren3179a012005-11-10 14:26:48 +0000425 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800426 .enable = &omap1_clk_enable_generic,
427 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000428};
429
430static struct clk dma_lcdfree_ck = {
431 .name = "dma_lcdfree_ck",
432 .parent = &tc_ck.clk,
433 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
434 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800435 .enable = &omap1_clk_enable_generic,
436 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000437};
438
439static struct arm_idlect1_clk api_ck = {
440 .clk = {
441 .name = "api_ck",
442 .parent = &tc_ck.clk,
443 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100444 CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000445 .enable_reg = (void __iomem *)ARM_IDLECT2,
446 .enable_bit = EN_APICK,
447 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800448 .enable = &omap1_clk_enable_generic,
449 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000450 },
451 .idlect_shift = 8,
452};
453
454static struct arm_idlect1_clk lb_ck = {
455 .clk = {
456 .name = "lb_ck",
457 .parent = &tc_ck.clk,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100458 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
459 CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000460 .enable_reg = (void __iomem *)ARM_IDLECT2,
461 .enable_bit = EN_LBCK,
462 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800463 .enable = &omap1_clk_enable_generic,
464 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000465 },
466 .idlect_shift = 4,
467};
468
469static struct clk rhea1_ck = {
470 .name = "rhea1_ck",
471 .parent = &tc_ck.clk,
472 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
473 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800474 .enable = &omap1_clk_enable_generic,
475 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000476};
477
478static struct clk rhea2_ck = {
479 .name = "rhea2_ck",
480 .parent = &tc_ck.clk,
481 .flags = CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
482 .recalc = &followparent_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800483 .enable = &omap1_clk_enable_generic,
484 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000485};
486
487static struct clk lcd_ck_16xx = {
488 .name = "lcd_ck",
489 .parent = &ck_dpll1,
490 .flags = CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730 | RATE_CKCTL,
491 .enable_reg = (void __iomem *)ARM_IDLECT2,
492 .enable_bit = EN_LCDCK,
493 .rate_offset = CKCTL_LCDDIV_OFFSET,
494 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800495 .enable = &omap1_clk_enable_generic,
496 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000497};
498
499static struct arm_idlect1_clk lcd_ck_1510 = {
500 .clk = {
501 .name = "lcd_ck",
502 .parent = &ck_dpll1,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100503 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
504 RATE_CKCTL | CLOCK_IDLE_CONTROL,
Tony Lindgren3179a012005-11-10 14:26:48 +0000505 .enable_reg = (void __iomem *)ARM_IDLECT2,
506 .enable_bit = EN_LCDCK,
507 .rate_offset = CKCTL_LCDDIV_OFFSET,
508 .recalc = &omap1_ckctl_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800509 .enable = &omap1_clk_enable_generic,
510 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000511 },
512 .idlect_shift = 3,
513};
514
515static struct clk uart1_1510 = {
516 .name = "uart1_ck",
517 /* Direct from ULPD, no real parent */
518 .parent = &armper_ck.clk,
519 .rate = 12000000,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100520 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
521 ENABLE_REG_32BIT | ALWAYS_ENABLED |
522 CLOCK_NO_IDLE_PARENT,
Tony Lindgren3179a012005-11-10 14:26:48 +0000523 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
524 .enable_bit = 29, /* Chooses between 12MHz and 48MHz */
525 .set_rate = &omap1_set_uart_rate,
526 .recalc = &omap1_uart_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800527 .enable = &omap1_clk_enable_generic,
528 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000529};
530
531static struct uart_clk uart1_16xx = {
532 .clk = {
533 .name = "uart1_ck",
534 /* Direct from ULPD, no real parent */
535 .parent = &armper_ck.clk,
536 .rate = 48000000,
537 .flags = CLOCK_IN_OMAP16XX | RATE_FIXED |
538 ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
539 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
540 .enable_bit = 29,
541 .enable = &omap1_clk_enable_uart_functional,
542 .disable = &omap1_clk_disable_uart_functional,
543 },
544 .sysc_addr = 0xfffb0054,
545};
546
547static struct clk uart2_ck = {
548 .name = "uart2_ck",
549 /* Direct from ULPD, no real parent */
550 .parent = &armper_ck.clk,
551 .rate = 12000000,
552 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100553 CLOCK_IN_OMAP310 | ENABLE_REG_32BIT |
554 ALWAYS_ENABLED | CLOCK_NO_IDLE_PARENT,
Tony Lindgren3179a012005-11-10 14:26:48 +0000555 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
556 .enable_bit = 30, /* Chooses between 12MHz and 48MHz */
557 .set_rate = &omap1_set_uart_rate,
558 .recalc = &omap1_uart_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800559 .enable = &omap1_clk_enable_generic,
560 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000561};
562
563static struct clk uart3_1510 = {
564 .name = "uart3_ck",
565 /* Direct from ULPD, no real parent */
566 .parent = &armper_ck.clk,
567 .rate = 12000000,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100568 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
569 ENABLE_REG_32BIT | ALWAYS_ENABLED |
570 CLOCK_NO_IDLE_PARENT,
Tony Lindgren3179a012005-11-10 14:26:48 +0000571 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
572 .enable_bit = 31, /* Chooses between 12MHz and 48MHz */
573 .set_rate = &omap1_set_uart_rate,
574 .recalc = &omap1_uart_recalc,
Tony Lindgren10b55792006-01-17 15:30:42 -0800575 .enable = &omap1_clk_enable_generic,
576 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000577};
578
579static struct uart_clk uart3_16xx = {
580 .clk = {
581 .name = "uart3_ck",
582 /* Direct from ULPD, no real parent */
583 .parent = &armper_ck.clk,
584 .rate = 48000000,
585 .flags = CLOCK_IN_OMAP16XX | RATE_FIXED |
586 ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
587 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
588 .enable_bit = 31,
589 .enable = &omap1_clk_enable_uart_functional,
590 .disable = &omap1_clk_disable_uart_functional,
591 },
592 .sysc_addr = 0xfffb9854,
593};
594
595static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */
596 .name = "usb_clko",
597 /* Direct from ULPD, no parent */
598 .rate = 6000000,
599 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100600 CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT,
Tony Lindgren3179a012005-11-10 14:26:48 +0000601 .enable_reg = (void __iomem *)ULPD_CLOCK_CTRL,
602 .enable_bit = USB_MCLK_EN_BIT,
Tony Lindgren10b55792006-01-17 15:30:42 -0800603 .enable = &omap1_clk_enable_generic,
604 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000605};
606
607static struct clk usb_hhc_ck1510 = {
608 .name = "usb_hhc_ck",
609 /* Direct from ULPD, no parent */
610 .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100611 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
Tony Lindgren3179a012005-11-10 14:26:48 +0000612 RATE_FIXED | ENABLE_REG_32BIT,
613 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
614 .enable_bit = USB_HOST_HHC_UHOST_EN,
Tony Lindgren10b55792006-01-17 15:30:42 -0800615 .enable = &omap1_clk_enable_generic,
616 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000617};
618
619static struct clk usb_hhc_ck16xx = {
620 .name = "usb_hhc_ck",
621 /* Direct from ULPD, no parent */
622 .rate = 48000000,
623 /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
624 .flags = CLOCK_IN_OMAP16XX |
625 RATE_FIXED | ENABLE_REG_32BIT,
626 .enable_reg = (void __iomem *)OTG_BASE + 0x08 /* OTG_SYSCON_2 */,
627 .enable_bit = 8 /* UHOST_EN */,
Tony Lindgren10b55792006-01-17 15:30:42 -0800628 .enable = &omap1_clk_enable_generic,
629 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000630};
631
632static struct clk usb_dc_ck = {
633 .name = "usb_dc_ck",
634 /* Direct from ULPD, no parent */
635 .rate = 48000000,
636 .flags = CLOCK_IN_OMAP16XX | RATE_FIXED,
637 .enable_reg = (void __iomem *)SOFT_REQ_REG,
638 .enable_bit = 4,
Tony Lindgren10b55792006-01-17 15:30:42 -0800639 .enable = &omap1_clk_enable_generic,
640 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000641};
642
643static struct clk mclk_1510 = {
644 .name = "mclk",
645 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
646 .rate = 12000000,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100647 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED,
648 .enable_reg = (void __iomem *)SOFT_REQ_REG,
649 .enable_bit = 6,
Tony Lindgren10b55792006-01-17 15:30:42 -0800650 .enable = &omap1_clk_enable_generic,
651 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000652};
653
654static struct clk mclk_16xx = {
655 .name = "mclk",
656 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
657 .flags = CLOCK_IN_OMAP16XX,
658 .enable_reg = (void __iomem *)COM_CLK_DIV_CTRL_SEL,
659 .enable_bit = COM_ULPD_PLL_CLK_REQ,
660 .set_rate = &omap1_set_ext_clk_rate,
661 .round_rate = &omap1_round_ext_clk_rate,
662 .init = &omap1_init_ext_clk,
Tony Lindgren10b55792006-01-17 15:30:42 -0800663 .enable = &omap1_clk_enable_generic,
664 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000665};
666
667static struct clk bclk_1510 = {
668 .name = "bclk",
669 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
670 .rate = 12000000,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100671 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED,
Tony Lindgren10b55792006-01-17 15:30:42 -0800672 .enable = &omap1_clk_enable_generic,
673 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000674};
675
676static struct clk bclk_16xx = {
677 .name = "bclk",
678 /* Direct from ULPD, no parent. May be enabled by ext hardware. */
679 .flags = CLOCK_IN_OMAP16XX,
680 .enable_reg = (void __iomem *)SWD_CLK_DIV_CTRL_SEL,
681 .enable_bit = SWD_ULPD_PLL_CLK_REQ,
682 .set_rate = &omap1_set_ext_clk_rate,
683 .round_rate = &omap1_round_ext_clk_rate,
684 .init = &omap1_init_ext_clk,
Tony Lindgren10b55792006-01-17 15:30:42 -0800685 .enable = &omap1_clk_enable_generic,
686 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000687};
688
689static struct clk mmc1_ck = {
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100690 .name = "mmc_ck",
691 .id = 1,
Tony Lindgren3179a012005-11-10 14:26:48 +0000692 /* Functional clock is direct from ULPD, interface clock is ARMPER */
693 .parent = &armper_ck.clk,
694 .rate = 48000000,
695 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100696 CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT |
697 CLOCK_NO_IDLE_PARENT,
Tony Lindgren3179a012005-11-10 14:26:48 +0000698 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
699 .enable_bit = 23,
Tony Lindgren10b55792006-01-17 15:30:42 -0800700 .enable = &omap1_clk_enable_generic,
701 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000702};
703
704static struct clk mmc2_ck = {
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100705 .name = "mmc_ck",
706 .id = 2,
Tony Lindgren3179a012005-11-10 14:26:48 +0000707 /* Functional clock is direct from ULPD, interface clock is ARMPER */
708 .parent = &armper_ck.clk,
709 .rate = 48000000,
710 .flags = CLOCK_IN_OMAP16XX |
711 RATE_FIXED | ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
712 .enable_reg = (void __iomem *)MOD_CONF_CTRL_0,
713 .enable_bit = 20,
Tony Lindgren10b55792006-01-17 15:30:42 -0800714 .enable = &omap1_clk_enable_generic,
715 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000716};
717
718static struct clk virtual_ck_mpu = {
719 .name = "mpu",
720 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100721 CLOCK_IN_OMAP310 | VIRTUAL_CLOCK | ALWAYS_ENABLED,
Tony Lindgren3179a012005-11-10 14:26:48 +0000722 .parent = &arm_ck, /* Is smarter alias for */
723 .recalc = &followparent_recalc,
724 .set_rate = &omap1_select_table_rate,
725 .round_rate = &omap1_round_to_table_rate,
Tony Lindgren10b55792006-01-17 15:30:42 -0800726 .enable = &omap1_clk_enable_generic,
727 .disable = &omap1_clk_disable_generic,
Tony Lindgren3179a012005-11-10 14:26:48 +0000728};
729
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100730/* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
731remains active during MPU idle whenever this is enabled */
732static struct clk i2c_fck = {
733 .name = "i2c_fck",
734 .id = 1,
735 .flags = CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
736 VIRTUAL_CLOCK | CLOCK_NO_IDLE_PARENT |
737 ALWAYS_ENABLED,
738 .parent = &armxor_ck.clk,
739 .recalc = &followparent_recalc,
740 .enable = &omap1_clk_enable_generic,
741 .disable = &omap1_clk_disable_generic,
742};
743
Tony Lindgren3179a012005-11-10 14:26:48 +0000744static struct clk * onchip_clks[] = {
745 /* non-ULPD clocks */
746 &ck_ref,
747 &ck_dpll1,
748 /* CK_GEN1 clocks */
749 &ck_dpll1out.clk,
750 &arm_ck,
751 &armper_ck.clk,
752 &arm_gpio_ck,
753 &armxor_ck.clk,
754 &armtim_ck.clk,
755 &armwdt_ck.clk,
756 &arminth_ck1510, &arminth_ck16xx,
757 /* CK_GEN2 clocks */
758 &dsp_ck,
759 &dspmmu_ck,
760 &dspper_ck,
761 &dspxor_ck,
762 &dsptim_ck,
763 /* CK_GEN3 clocks */
764 &tc_ck.clk,
765 &tipb_ck,
766 &l3_ocpi_ck,
767 &tc1_ck,
768 &tc2_ck,
769 &dma_ck,
770 &dma_lcdfree_ck,
771 &api_ck.clk,
772 &lb_ck.clk,
773 &rhea1_ck,
774 &rhea2_ck,
775 &lcd_ck_16xx,
776 &lcd_ck_1510.clk,
777 /* ULPD clocks */
778 &uart1_1510,
779 &uart1_16xx.clk,
780 &uart2_ck,
781 &uart3_1510,
782 &uart3_16xx.clk,
783 &usb_clko,
784 &usb_hhc_ck1510, &usb_hhc_ck16xx,
785 &usb_dc_ck,
786 &mclk_1510, &mclk_16xx,
787 &bclk_1510, &bclk_16xx,
788 &mmc1_ck,
789 &mmc2_ck,
790 /* Virtual clocks */
791 &virtual_ck_mpu,
Tony Lindgrenb824efa2006-04-02 17:46:20 +0100792 &i2c_fck,
Tony Lindgren3179a012005-11-10 14:26:48 +0000793};
794
795#endif