1/*
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
16static int omap1_clk_enable_generic(struct clk * clk);
17static void omap1_clk_disable_generic(struct clk * clk);
18static 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);
33static int omap1_clk_enable(struct clk *clk);
34static void omap1_clk_disable(struct clk *clk);
35
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 SDW_MCLK_INV_BIT	2	/* In ULPD_CLKC_CTRL */
93#define USB_MCLK_EN_BIT		4	/* In ULPD_CLKC_CTRL */
94#define USB_HOST_HHC_UHOST_EN	9	/* In MOD_CONF_CTRL_0 */
95#define SWD_ULPD_PLL_CLK_REQ	1	/* In SWD_CLK_DIV_CTRL_SEL */
96#define COM_ULPD_PLL_CLK_REQ	1	/* In COM_CLK_DIV_CTRL_SEL */
97#define SWD_CLK_DIV_CTRL_SEL	0xfffe0874
98#define COM_CLK_DIV_CTRL_SEL	0xfffe0878
99#define SOFT_REQ_REG		0xfffe0834
100#define SOFT_REQ_REG2		0xfffe0880
101
102/*-------------------------------------------------------------------------
103 * Omap1 MPU rate table
104 *-------------------------------------------------------------------------*/
105static struct mpu_rate rate_table[] = {
106	/* MPU MHz, xtal MHz, dpll1 MHz, CKCTL, DPLL_CTL
107	 * NOTE: Comment order here is different from bits in CKCTL value:
108	 * armdiv, dspdiv, dspmmu, tcdiv, perdiv, lcddiv
109	 */
110#if defined(CONFIG_OMAP_ARM_216MHZ)
111	{ 216000000, 12000000, 216000000, 0x050d, 0x2910 }, /* 1/1/2/2/2/8 */
112#endif
113#if defined(CONFIG_OMAP_ARM_195MHZ)
114	{ 195000000, 13000000, 195000000, 0x050e, 0x2790 }, /* 1/1/2/2/4/8 */
115#endif
116#if defined(CONFIG_OMAP_ARM_192MHZ)
117	{ 192000000, 19200000, 192000000, 0x050f, 0x2510 }, /* 1/1/2/2/8/8 */
118	{ 192000000, 12000000, 192000000, 0x050f, 0x2810 }, /* 1/1/2/2/8/8 */
119	{  96000000, 12000000, 192000000, 0x055f, 0x2810 }, /* 2/2/2/2/8/8 */
120	{  48000000, 12000000, 192000000, 0x0baf, 0x2810 }, /* 4/4/4/8/8/8 */
121	{  24000000, 12000000, 192000000, 0x0fff, 0x2810 }, /* 8/8/8/8/8/8 */
122#endif
123#if defined(CONFIG_OMAP_ARM_182MHZ)
124	{ 182000000, 13000000, 182000000, 0x050e, 0x2710 }, /* 1/1/2/2/4/8 */
125#endif
126#if defined(CONFIG_OMAP_ARM_168MHZ)
127	{ 168000000, 12000000, 168000000, 0x010f, 0x2710 }, /* 1/1/1/2/8/8 */
128#endif
129#if defined(CONFIG_OMAP_ARM_150MHZ)
130	{ 150000000, 12000000, 150000000, 0x010a, 0x2cb0 }, /* 1/1/1/2/4/4 */
131#endif
132#if defined(CONFIG_OMAP_ARM_120MHZ)
133	{ 120000000, 12000000, 120000000, 0x010a, 0x2510 }, /* 1/1/1/2/4/4 */
134#endif
135#if defined(CONFIG_OMAP_ARM_96MHZ)
136	{  96000000, 12000000,  96000000, 0x0005, 0x2410 }, /* 1/1/1/1/2/2 */
137#endif
138#if defined(CONFIG_OMAP_ARM_60MHZ)
139	{  60000000, 12000000,  60000000, 0x0005, 0x2290 }, /* 1/1/1/1/2/2 */
140#endif
141#if defined(CONFIG_OMAP_ARM_30MHZ)
142	{  30000000, 12000000,  60000000, 0x0555, 0x2290 }, /* 2/2/2/2/2/2 */
143#endif
144	{ 0, 0, 0, 0, 0 },
145};
146
147/*-------------------------------------------------------------------------
148 * Omap1 clocks
149 *-------------------------------------------------------------------------*/
150
151static struct clk ck_ref = {
152	.name		= "ck_ref",
153	.rate		= 12000000,
154	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
155			  CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
156	.enable		= &omap1_clk_enable_generic,
157	.disable	= &omap1_clk_disable_generic,
158};
159
160static struct clk ck_dpll1 = {
161	.name		= "ck_dpll1",
162	.parent		= &ck_ref,
163	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
164			  CLOCK_IN_OMAP310 | RATE_PROPAGATES | ALWAYS_ENABLED,
165	.enable		= &omap1_clk_enable_generic,
166	.disable	= &omap1_clk_disable_generic,
167};
168
169static struct arm_idlect1_clk ck_dpll1out = {
170	.clk = {
171	       	.name		= "ck_dpll1out",
172		.parent		= &ck_dpll1,
173		.flags		= CLOCK_IN_OMAP16XX | CLOCK_IDLE_CONTROL,
174		.enable_reg	= (void __iomem *)ARM_IDLECT2,
175		.enable_bit	= EN_CKOUT_ARM,
176		.recalc		= &followparent_recalc,
177		.enable		= &omap1_clk_enable_generic,
178		.disable	= &omap1_clk_disable_generic,
179	},
180	.idlect_shift	= 12,
181};
182
183static struct clk arm_ck = {
184	.name		= "arm_ck",
185	.parent		= &ck_dpll1,
186	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
187			  CLOCK_IN_OMAP310 | RATE_CKCTL | RATE_PROPAGATES |
188			  ALWAYS_ENABLED,
189	.rate_offset	= CKCTL_ARMDIV_OFFSET,
190	.recalc		= &omap1_ckctl_recalc,
191	.enable		= &omap1_clk_enable_generic,
192	.disable	= &omap1_clk_disable_generic,
193};
194
195static struct arm_idlect1_clk armper_ck = {
196	.clk = {
197		.name		= "armper_ck",
198		.parent		= &ck_dpll1,
199		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
200				  CLOCK_IN_OMAP310 | RATE_CKCTL |
201				  CLOCK_IDLE_CONTROL,
202		.enable_reg	= (void __iomem *)ARM_IDLECT2,
203		.enable_bit	= EN_PERCK,
204		.rate_offset	= CKCTL_PERDIV_OFFSET,
205		.recalc		= &omap1_ckctl_recalc,
206		.enable		= &omap1_clk_enable_generic,
207		.disable	= &omap1_clk_disable_generic,
208	},
209	.idlect_shift	= 2,
210};
211
212static struct clk arm_gpio_ck = {
213	.name		= "arm_gpio_ck",
214	.parent		= &ck_dpll1,
215	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310,
216	.enable_reg	= (void __iomem *)ARM_IDLECT2,
217	.enable_bit	= EN_GPIOCK,
218	.recalc		= &followparent_recalc,
219	.enable		= &omap1_clk_enable_generic,
220	.disable	= &omap1_clk_disable_generic,
221};
222
223static struct arm_idlect1_clk armxor_ck = {
224	.clk = {
225		.name		= "armxor_ck",
226		.parent		= &ck_ref,
227		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
228				  CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
229		.enable_reg	= (void __iomem *)ARM_IDLECT2,
230		.enable_bit	= EN_XORPCK,
231		.recalc		= &followparent_recalc,
232		.enable		= &omap1_clk_enable_generic,
233		.disable	= &omap1_clk_disable_generic,
234	},
235	.idlect_shift	= 1,
236};
237
238static struct arm_idlect1_clk armtim_ck = {
239	.clk = {
240		.name		= "armtim_ck",
241		.parent		= &ck_ref,
242		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
243				  CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
244		.enable_reg	= (void __iomem *)ARM_IDLECT2,
245		.enable_bit	= EN_TIMCK,
246		.recalc		= &followparent_recalc,
247		.enable		= &omap1_clk_enable_generic,
248		.disable	= &omap1_clk_disable_generic,
249	},
250	.idlect_shift	= 9,
251};
252
253static struct arm_idlect1_clk armwdt_ck = {
254	.clk = {
255		.name		= "armwdt_ck",
256		.parent		= &ck_ref,
257		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
258				  CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
259		.enable_reg	= (void __iomem *)ARM_IDLECT2,
260		.enable_bit	= EN_WDTCK,
261		.recalc		= &omap1_watchdog_recalc,
262		.enable		= &omap1_clk_enable_generic,
263		.disable	= &omap1_clk_disable_generic,
264	},
265	.idlect_shift	= 0,
266};
267
268static struct clk arminth_ck16xx = {
269	.name		= "arminth_ck",
270	.parent		= &arm_ck,
271	.flags		= CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
272	.recalc		= &followparent_recalc,
273	/* Note: On 16xx the frequency can be divided by 2 by programming
274	 * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
275	 *
276	 * 1510 version is in TC clocks.
277	 */
278	.enable		= &omap1_clk_enable_generic,
279	.disable	= &omap1_clk_disable_generic,
280};
281
282static struct clk dsp_ck = {
283	.name		= "dsp_ck",
284	.parent		= &ck_dpll1,
285	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
286			  RATE_CKCTL,
287	.enable_reg	= (void __iomem *)ARM_CKCTL,
288	.enable_bit	= EN_DSPCK,
289	.rate_offset	= CKCTL_DSPDIV_OFFSET,
290	.recalc		= &omap1_ckctl_recalc,
291	.enable		= &omap1_clk_enable_generic,
292	.disable	= &omap1_clk_disable_generic,
293};
294
295static struct clk dspmmu_ck = {
296	.name		= "dspmmu_ck",
297	.parent		= &ck_dpll1,
298	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
299			  RATE_CKCTL | ALWAYS_ENABLED,
300	.rate_offset	= CKCTL_DSPMMUDIV_OFFSET,
301	.recalc		= &omap1_ckctl_recalc,
302	.enable		= &omap1_clk_enable_generic,
303	.disable	= &omap1_clk_disable_generic,
304};
305
306static struct clk dspper_ck = {
307	.name		= "dspper_ck",
308	.parent		= &ck_dpll1,
309	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
310			  RATE_CKCTL | VIRTUAL_IO_ADDRESS,
311	.enable_reg	= (void __iomem *)DSP_IDLECT2,
312	.enable_bit	= EN_PERCK,
313	.rate_offset	= CKCTL_PERDIV_OFFSET,
314	.recalc		= &omap1_ckctl_recalc_dsp_domain,
315	.set_rate	= &omap1_clk_set_rate_dsp_domain,
316	.enable		= &omap1_clk_enable_dsp_domain,
317	.disable	= &omap1_clk_disable_dsp_domain,
318};
319
320static struct clk dspxor_ck = {
321	.name		= "dspxor_ck",
322	.parent		= &ck_ref,
323	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
324			  VIRTUAL_IO_ADDRESS,
325	.enable_reg	= (void __iomem *)DSP_IDLECT2,
326	.enable_bit	= EN_XORPCK,
327	.recalc		= &followparent_recalc,
328	.enable		= &omap1_clk_enable_dsp_domain,
329	.disable	= &omap1_clk_disable_dsp_domain,
330};
331
332static struct clk dsptim_ck = {
333	.name		= "dsptim_ck",
334	.parent		= &ck_ref,
335	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
336			  VIRTUAL_IO_ADDRESS,
337	.enable_reg	= (void __iomem *)DSP_IDLECT2,
338	.enable_bit	= EN_DSPTIMCK,
339	.recalc		= &followparent_recalc,
340	.enable		= &omap1_clk_enable_dsp_domain,
341	.disable	= &omap1_clk_disable_dsp_domain,
342};
343
344/* Tie ARM_IDLECT1:IDLIF_ARM to this logical clock structure */
345static struct arm_idlect1_clk tc_ck = {
346	.clk = {
347		.name		= "tc_ck",
348		.parent		= &ck_dpll1,
349		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
350				  CLOCK_IN_OMAP730 | CLOCK_IN_OMAP310 |
351				  RATE_CKCTL | RATE_PROPAGATES |
352				  ALWAYS_ENABLED | CLOCK_IDLE_CONTROL,
353		.rate_offset	= CKCTL_TCDIV_OFFSET,
354		.recalc		= &omap1_ckctl_recalc,
355		.enable		= &omap1_clk_enable_generic,
356		.disable	= &omap1_clk_disable_generic,
357	},
358	.idlect_shift	= 6,
359};
360
361static struct clk arminth_ck1510 = {
362	.name		= "arminth_ck",
363	.parent		= &tc_ck.clk,
364	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
365			  ALWAYS_ENABLED,
366	.recalc		= &followparent_recalc,
367	/* Note: On 1510 the frequency follows TC_CK
368	 *
369	 * 16xx version is in MPU clocks.
370	 */
371	.enable		= &omap1_clk_enable_generic,
372	.disable	= &omap1_clk_disable_generic,
373};
374
375static struct clk tipb_ck = {
376	/* No-idle controlled by "tc_ck" */
377	.name		= "tibp_ck",
378	.parent		= &tc_ck.clk,
379	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
380			  ALWAYS_ENABLED,
381	.recalc		= &followparent_recalc,
382	.enable		= &omap1_clk_enable_generic,
383	.disable	= &omap1_clk_disable_generic,
384};
385
386static struct clk l3_ocpi_ck = {
387	/* No-idle controlled by "tc_ck" */
388	.name		= "l3_ocpi_ck",
389	.parent		= &tc_ck.clk,
390	.flags		= CLOCK_IN_OMAP16XX,
391	.enable_reg	= (void __iomem *)ARM_IDLECT3,
392	.enable_bit	= EN_OCPI_CK,
393	.recalc		= &followparent_recalc,
394	.enable		= &omap1_clk_enable_generic,
395	.disable	= &omap1_clk_disable_generic,
396};
397
398static struct clk tc1_ck = {
399	.name		= "tc1_ck",
400	.parent		= &tc_ck.clk,
401	.flags		= CLOCK_IN_OMAP16XX,
402	.enable_reg	= (void __iomem *)ARM_IDLECT3,
403	.enable_bit	= EN_TC1_CK,
404	.recalc		= &followparent_recalc,
405	.enable		= &omap1_clk_enable_generic,
406	.disable	= &omap1_clk_disable_generic,
407};
408
409static struct clk tc2_ck = {
410	.name		= "tc2_ck",
411	.parent		= &tc_ck.clk,
412	.flags		= CLOCK_IN_OMAP16XX,
413	.enable_reg	= (void __iomem *)ARM_IDLECT3,
414	.enable_bit	= EN_TC2_CK,
415	.recalc		= &followparent_recalc,
416	.enable		= &omap1_clk_enable_generic,
417	.disable	= &omap1_clk_disable_generic,
418};
419
420static struct clk dma_ck = {
421	/* No-idle controlled by "tc_ck" */
422	.name		= "dma_ck",
423	.parent		= &tc_ck.clk,
424	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
425			  CLOCK_IN_OMAP310 | ALWAYS_ENABLED,
426	.recalc		= &followparent_recalc,
427	.enable		= &omap1_clk_enable_generic,
428	.disable	= &omap1_clk_disable_generic,
429};
430
431static struct clk dma_lcdfree_ck = {
432	.name		= "dma_lcdfree_ck",
433	.parent		= &tc_ck.clk,
434	.flags		= CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
435	.recalc		= &followparent_recalc,
436	.enable		= &omap1_clk_enable_generic,
437	.disable	= &omap1_clk_disable_generic,
438};
439
440static struct arm_idlect1_clk api_ck = {
441	.clk = {
442		.name		= "api_ck",
443		.parent		= &tc_ck.clk,
444		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
445				  CLOCK_IN_OMAP310 | CLOCK_IDLE_CONTROL,
446		.enable_reg	= (void __iomem *)ARM_IDLECT2,
447		.enable_bit	= EN_APICK,
448		.recalc		= &followparent_recalc,
449		.enable		= &omap1_clk_enable_generic,
450		.disable	= &omap1_clk_disable_generic,
451	},
452	.idlect_shift	= 8,
453};
454
455static struct arm_idlect1_clk lb_ck = {
456	.clk = {
457		.name		= "lb_ck",
458		.parent		= &tc_ck.clk,
459		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
460				  CLOCK_IDLE_CONTROL,
461		.enable_reg	= (void __iomem *)ARM_IDLECT2,
462		.enable_bit	= EN_LBCK,
463		.recalc		= &followparent_recalc,
464		.enable		= &omap1_clk_enable_generic,
465		.disable	= &omap1_clk_disable_generic,
466	},
467	.idlect_shift	= 4,
468};
469
470static struct clk rhea1_ck = {
471	.name		= "rhea1_ck",
472	.parent		= &tc_ck.clk,
473	.flags		= CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
474	.recalc		= &followparent_recalc,
475	.enable		= &omap1_clk_enable_generic,
476	.disable	= &omap1_clk_disable_generic,
477};
478
479static struct clk rhea2_ck = {
480	.name		= "rhea2_ck",
481	.parent		= &tc_ck.clk,
482	.flags		= CLOCK_IN_OMAP16XX | ALWAYS_ENABLED,
483	.recalc		= &followparent_recalc,
484	.enable		= &omap1_clk_enable_generic,
485	.disable	= &omap1_clk_disable_generic,
486};
487
488static struct clk lcd_ck_16xx = {
489	.name		= "lcd_ck",
490	.parent		= &ck_dpll1,
491	.flags		= CLOCK_IN_OMAP16XX | CLOCK_IN_OMAP730 | RATE_CKCTL,
492	.enable_reg	= (void __iomem *)ARM_IDLECT2,
493	.enable_bit	= EN_LCDCK,
494	.rate_offset	= CKCTL_LCDDIV_OFFSET,
495	.recalc		= &omap1_ckctl_recalc,
496	.enable		= &omap1_clk_enable_generic,
497	.disable	= &omap1_clk_disable_generic,
498};
499
500static struct arm_idlect1_clk lcd_ck_1510 = {
501	.clk = {
502		.name		= "lcd_ck",
503		.parent		= &ck_dpll1,
504		.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
505				  RATE_CKCTL | CLOCK_IDLE_CONTROL,
506		.enable_reg	= (void __iomem *)ARM_IDLECT2,
507		.enable_bit	= EN_LCDCK,
508		.rate_offset	= CKCTL_LCDDIV_OFFSET,
509		.recalc		= &omap1_ckctl_recalc,
510		.enable		= &omap1_clk_enable_generic,
511		.disable	= &omap1_clk_disable_generic,
512	},
513	.idlect_shift	= 3,
514};
515
516static struct clk uart1_1510 = {
517	.name		= "uart1_ck",
518	/* Direct from ULPD, no real parent */
519	.parent		= &armper_ck.clk,
520	.rate		= 12000000,
521	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
522			  ENABLE_REG_32BIT | ALWAYS_ENABLED |
523			  CLOCK_NO_IDLE_PARENT,
524	.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
525	.enable_bit	= 29,	/* Chooses between 12MHz and 48MHz */
526	.set_rate	= &omap1_set_uart_rate,
527	.recalc		= &omap1_uart_recalc,
528	.enable		= &omap1_clk_enable_generic,
529	.disable	= &omap1_clk_disable_generic,
530};
531
532static struct uart_clk uart1_16xx = {
533	.clk	= {
534		.name		= "uart1_ck",
535		/* Direct from ULPD, no real parent */
536		.parent		= &armper_ck.clk,
537		.rate		= 48000000,
538		.flags		= CLOCK_IN_OMAP16XX | RATE_FIXED |
539				  ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
540		.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
541		.enable_bit	= 29,
542		.enable		= &omap1_clk_enable_uart_functional,
543		.disable	= &omap1_clk_disable_uart_functional,
544	},
545	.sysc_addr	= 0xfffb0054,
546};
547
548static struct clk uart2_ck = {
549	.name		= "uart2_ck",
550	/* Direct from ULPD, no real parent */
551	.parent		= &armper_ck.clk,
552	.rate		= 12000000,
553	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
554			  CLOCK_IN_OMAP310 | ENABLE_REG_32BIT |
555			  ALWAYS_ENABLED | CLOCK_NO_IDLE_PARENT,
556	.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
557	.enable_bit	= 30,	/* Chooses between 12MHz and 48MHz */
558	.set_rate	= &omap1_set_uart_rate,
559	.recalc		= &omap1_uart_recalc,
560	.enable		= &omap1_clk_enable_generic,
561	.disable	= &omap1_clk_disable_generic,
562};
563
564static struct clk uart3_1510 = {
565	.name		= "uart3_ck",
566	/* Direct from ULPD, no real parent */
567	.parent		= &armper_ck.clk,
568	.rate		= 12000000,
569	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
570			  ENABLE_REG_32BIT | ALWAYS_ENABLED |
571			  CLOCK_NO_IDLE_PARENT,
572	.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
573	.enable_bit	= 31,	/* Chooses between 12MHz and 48MHz */
574	.set_rate	= &omap1_set_uart_rate,
575	.recalc		= &omap1_uart_recalc,
576	.enable		= &omap1_clk_enable_generic,
577	.disable	= &omap1_clk_disable_generic,
578};
579
580static struct uart_clk uart3_16xx = {
581	.clk	= {
582		.name		= "uart3_ck",
583		/* Direct from ULPD, no real parent */
584		.parent		= &armper_ck.clk,
585		.rate		= 48000000,
586		.flags		= CLOCK_IN_OMAP16XX | RATE_FIXED |
587				  ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
588		.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
589		.enable_bit	= 31,
590		.enable		= &omap1_clk_enable_uart_functional,
591		.disable	= &omap1_clk_disable_uart_functional,
592	},
593	.sysc_addr	= 0xfffb9854,
594};
595
596static struct clk usb_clko = {	/* 6 MHz output on W4_USB_CLKO */
597	.name		= "usb_clko",
598	/* Direct from ULPD, no parent */
599	.rate		= 6000000,
600	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
601			  CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT,
602	.enable_reg	= (void __iomem *)ULPD_CLOCK_CTRL,
603	.enable_bit	= USB_MCLK_EN_BIT,
604	.enable		= &omap1_clk_enable_generic,
605	.disable	= &omap1_clk_disable_generic,
606};
607
608static struct clk usb_hhc_ck1510 = {
609	.name		= "usb_hhc_ck",
610	/* Direct from ULPD, no parent */
611	.rate		= 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
612	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 |
613			  RATE_FIXED | ENABLE_REG_32BIT,
614	.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
615	.enable_bit	= USB_HOST_HHC_UHOST_EN,
616	.enable		= &omap1_clk_enable_generic,
617	.disable	= &omap1_clk_disable_generic,
618};
619
620static struct clk usb_hhc_ck16xx = {
621	.name		= "usb_hhc_ck",
622	/* Direct from ULPD, no parent */
623	.rate		= 48000000,
624	/* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
625	.flags		= CLOCK_IN_OMAP16XX |
626			  RATE_FIXED | ENABLE_REG_32BIT,
627	.enable_reg	= (void __iomem *)OTG_BASE + 0x08 /* OTG_SYSCON_2 */,
628	.enable_bit	= 8 /* UHOST_EN */,
629	.enable		= &omap1_clk_enable_generic,
630	.disable	= &omap1_clk_disable_generic,
631};
632
633static struct clk usb_dc_ck = {
634	.name		= "usb_dc_ck",
635	/* Direct from ULPD, no parent */
636	.rate		= 48000000,
637	.flags		= CLOCK_IN_OMAP16XX | RATE_FIXED,
638	.enable_reg	= (void __iomem *)SOFT_REQ_REG,
639	.enable_bit	= 4,
640	.enable		= &omap1_clk_enable_generic,
641	.disable	= &omap1_clk_disable_generic,
642};
643
644static struct clk mclk_1510 = {
645	.name		= "mclk",
646	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
647	.rate		= 12000000,
648 	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED,
649 	.enable_reg	= (void __iomem *)SOFT_REQ_REG,
650 	.enable_bit	= 6,
651	.enable		= &omap1_clk_enable_generic,
652	.disable	= &omap1_clk_disable_generic,
653};
654
655static struct clk mclk_16xx = {
656	.name		= "mclk",
657	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
658	.flags		= CLOCK_IN_OMAP16XX,
659	.enable_reg	= (void __iomem *)COM_CLK_DIV_CTRL_SEL,
660	.enable_bit	= COM_ULPD_PLL_CLK_REQ,
661	.set_rate	= &omap1_set_ext_clk_rate,
662	.round_rate	= &omap1_round_ext_clk_rate,
663	.init		= &omap1_init_ext_clk,
664	.enable		= &omap1_clk_enable_generic,
665	.disable	= &omap1_clk_disable_generic,
666};
667
668static struct clk bclk_1510 = {
669	.name		= "bclk",
670	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
671	.rate		= 12000000,
672	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP310 | RATE_FIXED,
673	.enable		= &omap1_clk_enable_generic,
674	.disable	= &omap1_clk_disable_generic,
675};
676
677static struct clk bclk_16xx = {
678	.name		= "bclk",
679	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
680	.flags		= CLOCK_IN_OMAP16XX,
681	.enable_reg	= (void __iomem *)SWD_CLK_DIV_CTRL_SEL,
682	.enable_bit	= SWD_ULPD_PLL_CLK_REQ,
683	.set_rate	= &omap1_set_ext_clk_rate,
684	.round_rate	= &omap1_round_ext_clk_rate,
685	.init		= &omap1_init_ext_clk,
686	.enable		= &omap1_clk_enable_generic,
687	.disable	= &omap1_clk_disable_generic,
688};
689
690static struct clk mmc1_ck = {
691	.name		= "mmc_ck",
692	.id		= 1,
693	/* Functional clock is direct from ULPD, interface clock is ARMPER */
694	.parent		= &armper_ck.clk,
695	.rate		= 48000000,
696	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
697			  CLOCK_IN_OMAP310 | RATE_FIXED | ENABLE_REG_32BIT |
698			  CLOCK_NO_IDLE_PARENT,
699	.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
700	.enable_bit	= 23,
701	.enable		= &omap1_clk_enable_generic,
702	.disable	= &omap1_clk_disable_generic,
703};
704
705static struct clk mmc2_ck = {
706	.name		= "mmc_ck",
707	.id		= 2,
708	/* Functional clock is direct from ULPD, interface clock is ARMPER */
709	.parent		= &armper_ck.clk,
710	.rate		= 48000000,
711	.flags		= CLOCK_IN_OMAP16XX |
712			  RATE_FIXED | ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
713	.enable_reg	= (void __iomem *)MOD_CONF_CTRL_0,
714	.enable_bit	= 20,
715	.enable		= &omap1_clk_enable_generic,
716	.disable	= &omap1_clk_disable_generic,
717};
718
719static struct clk virtual_ck_mpu = {
720	.name		= "mpu",
721	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
722			  CLOCK_IN_OMAP310 | VIRTUAL_CLOCK | ALWAYS_ENABLED,
723	.parent		= &arm_ck, /* Is smarter alias for */
724	.recalc		= &followparent_recalc,
725	.set_rate	= &omap1_select_table_rate,
726	.round_rate	= &omap1_round_to_table_rate,
727	.enable		= &omap1_clk_enable_generic,
728	.disable	= &omap1_clk_disable_generic,
729};
730
731/* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
732remains active during MPU idle whenever this is enabled */
733static struct clk i2c_fck = {
734	.name		= "i2c_fck",
735	.id		= 1,
736	.flags		= CLOCK_IN_OMAP1510 | CLOCK_IN_OMAP16XX |
737			  VIRTUAL_CLOCK | CLOCK_NO_IDLE_PARENT |
738			  ALWAYS_ENABLED,
739	.parent		= &armxor_ck.clk,
740	.recalc		= &followparent_recalc,
741	.enable		= &omap1_clk_enable_generic,
742	.disable	= &omap1_clk_disable_generic,
743};
744
745static struct clk i2c_ick = {
746	.name		= "i2c_ick",
747	.id		= 1,
748	.flags		= CLOCK_IN_OMAP16XX |
749			  VIRTUAL_CLOCK | CLOCK_NO_IDLE_PARENT |
750			  ALWAYS_ENABLED,
751	.parent		= &armper_ck.clk,
752	.recalc		= &followparent_recalc,
753	.enable		= &omap1_clk_enable_generic,
754	.disable	= &omap1_clk_disable_generic,
755};
756
757static struct clk * onchip_clks[] = {
758	/* non-ULPD clocks */
759	&ck_ref,
760	&ck_dpll1,
761	/* CK_GEN1 clocks */
762	&ck_dpll1out.clk,
763	&arm_ck,
764	&armper_ck.clk,
765	&arm_gpio_ck,
766	&armxor_ck.clk,
767	&armtim_ck.clk,
768	&armwdt_ck.clk,
769	&arminth_ck1510,  &arminth_ck16xx,
770	/* CK_GEN2 clocks */
771	&dsp_ck,
772	&dspmmu_ck,
773	&dspper_ck,
774	&dspxor_ck,
775	&dsptim_ck,
776	/* CK_GEN3 clocks */
777	&tc_ck.clk,
778	&tipb_ck,
779	&l3_ocpi_ck,
780	&tc1_ck,
781	&tc2_ck,
782	&dma_ck,
783	&dma_lcdfree_ck,
784	&api_ck.clk,
785	&lb_ck.clk,
786	&rhea1_ck,
787	&rhea2_ck,
788	&lcd_ck_16xx,
789	&lcd_ck_1510.clk,
790	/* ULPD clocks */
791	&uart1_1510,
792	&uart1_16xx.clk,
793	&uart2_ck,
794	&uart3_1510,
795	&uart3_16xx.clk,
796	&usb_clko,
797	&usb_hhc_ck1510, &usb_hhc_ck16xx,
798	&usb_dc_ck,
799	&mclk_1510,  &mclk_16xx,
800	&bclk_1510,  &bclk_16xx,
801	&mmc1_ck,
802	&mmc2_ck,
803	/* Virtual clocks */
804	&virtual_ck_mpu,
805	&i2c_fck,
806	&i2c_ick,
807};
808
809#endif
810