xref: /linux/arch/arm/mach-omap1/clock_data.c (revision e4c060db2c13f10de09101afc564763f9fd0019a)
152650505SPaul Walmsley /*
252650505SPaul Walmsley  *  linux/arch/arm/mach-omap1/clock_data.c
352650505SPaul Walmsley  *
451c19541SPaul Walmsley  *  Copyright (C) 2004 - 2005, 2009-2010 Nokia Corporation
552650505SPaul Walmsley  *  Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
652650505SPaul Walmsley  *  Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
752650505SPaul Walmsley  *
852650505SPaul Walmsley  * This program is free software; you can redistribute it and/or modify
952650505SPaul Walmsley  * it under the terms of the GNU General Public License version 2 as
1052650505SPaul Walmsley  * published by the Free Software Foundation.
11fb2fc920SPaul Walmsley  *
12fb2fc920SPaul Walmsley  * To do:
13fb2fc920SPaul Walmsley  * - Clocks that are only available on some chips should be marked with the
14fb2fc920SPaul Walmsley  *   chips that they are present on.
1552650505SPaul Walmsley  */
1652650505SPaul Walmsley 
1752650505SPaul Walmsley #include <linux/kernel.h>
182c799cefSTony Lindgren #include <linux/io.h>
1952650505SPaul Walmsley #include <linux/clk.h>
206560ee07SJanusz Krzysztofik #include <linux/cpufreq.h>
216560ee07SJanusz Krzysztofik #include <linux/delay.h>
2252650505SPaul Walmsley 
2352650505SPaul Walmsley #include <asm/mach-types.h>  /* for machine_is_* */
2452650505SPaul Walmsley 
25*e4c060dbSTony Lindgren #include "soc.h"
2652650505SPaul Walmsley 
272c799cefSTony Lindgren #include <mach/hardware.h>
28b924b204STony Lindgren #include <mach/usb.h>   /* for OTG_BASE */
292c799cefSTony Lindgren 
30622297fdSTony Lindgren #include "../plat-omap/sram.h"
31622297fdSTony Lindgren 
322e3ee9f4STony Lindgren #include "iomap.h"
3352650505SPaul Walmsley #include "clock.h"
3452650505SPaul Walmsley 
35fb2fc920SPaul Walmsley /* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */
36fb2fc920SPaul Walmsley #define IDL_CLKOUT_ARM_SHIFT			12
37fb2fc920SPaul Walmsley #define IDLTIM_ARM_SHIFT			9
38fb2fc920SPaul Walmsley #define IDLAPI_ARM_SHIFT			8
39fb2fc920SPaul Walmsley #define IDLIF_ARM_SHIFT				6
40fb2fc920SPaul Walmsley #define IDLLB_ARM_SHIFT				4	/* undocumented? */
41fb2fc920SPaul Walmsley #define OMAP1510_IDLLCD_ARM_SHIFT		3	/* undocumented? */
42fb2fc920SPaul Walmsley #define IDLPER_ARM_SHIFT			2
43fb2fc920SPaul Walmsley #define IDLXORP_ARM_SHIFT			1
44fb2fc920SPaul Walmsley #define IDLWDT_ARM_SHIFT			0
45fb2fc920SPaul Walmsley 
46fb2fc920SPaul Walmsley /* Some MOD_CONF_CTRL_0 bit shifts - used in struct clk.enable_bit */
47fb2fc920SPaul Walmsley #define CONF_MOD_UART3_CLK_MODE_R		31
48fb2fc920SPaul Walmsley #define CONF_MOD_UART2_CLK_MODE_R		30
49fb2fc920SPaul Walmsley #define CONF_MOD_UART1_CLK_MODE_R		29
50fb2fc920SPaul Walmsley #define CONF_MOD_MMC_SD_CLK_REQ_R		23
51fb2fc920SPaul Walmsley #define CONF_MOD_MCBSP3_AUXON			20
52fb2fc920SPaul Walmsley 
53fb2fc920SPaul Walmsley /* Some MOD_CONF_CTRL_1 bit shifts - used in struct clk.enable_bit */
54fb2fc920SPaul Walmsley #define CONF_MOD_SOSSI_CLK_EN_R			16
55fb2fc920SPaul Walmsley 
56fb2fc920SPaul Walmsley /* Some OTG_SYSCON_2-specific bit fields */
57fb2fc920SPaul Walmsley #define OTG_SYSCON_2_UHOST_EN_SHIFT		8
58fb2fc920SPaul Walmsley 
59fb2fc920SPaul Walmsley /* Some SOFT_REQ_REG bit fields - used in struct clk.enable_bit */
60fb2fc920SPaul Walmsley #define SOFT_MMC2_DPLL_REQ_SHIFT	13
61fb2fc920SPaul Walmsley #define SOFT_MMC_DPLL_REQ_SHIFT		12
62fb2fc920SPaul Walmsley #define SOFT_UART3_DPLL_REQ_SHIFT	11
63fb2fc920SPaul Walmsley #define SOFT_UART2_DPLL_REQ_SHIFT	10
64fb2fc920SPaul Walmsley #define SOFT_UART1_DPLL_REQ_SHIFT	9
65fb2fc920SPaul Walmsley #define SOFT_USB_OTG_DPLL_REQ_SHIFT	8
66fb2fc920SPaul Walmsley #define SOFT_CAM_DPLL_REQ_SHIFT		7
67fb2fc920SPaul Walmsley #define SOFT_COM_MCKO_REQ_SHIFT		6
68fb2fc920SPaul Walmsley #define SOFT_PERIPH_REQ_SHIFT		5	/* sys_ck gate for UART2 ? */
69fb2fc920SPaul Walmsley #define USB_REQ_EN_SHIFT		4
70fb2fc920SPaul Walmsley #define SOFT_USB_REQ_SHIFT		3	/* sys_ck gate for USB host? */
71fb2fc920SPaul Walmsley #define SOFT_SDW_REQ_SHIFT		2	/* sys_ck gate for Bluetooth? */
72fb2fc920SPaul Walmsley #define SOFT_COM_REQ_SHIFT		1	/* sys_ck gate for com proc? */
73fb2fc920SPaul Walmsley #define SOFT_DPLL_REQ_SHIFT		0
74fb2fc920SPaul Walmsley 
75fb2fc920SPaul Walmsley /*
7652650505SPaul Walmsley  * Omap1 clocks
77fb2fc920SPaul Walmsley  */
7852650505SPaul Walmsley 
7952650505SPaul Walmsley static struct clk ck_ref = {
8052650505SPaul Walmsley 	.name		= "ck_ref",
8152650505SPaul Walmsley 	.ops		= &clkops_null,
8252650505SPaul Walmsley 	.rate		= 12000000,
8352650505SPaul Walmsley };
8452650505SPaul Walmsley 
8552650505SPaul Walmsley static struct clk ck_dpll1 = {
8652650505SPaul Walmsley 	.name		= "ck_dpll1",
8752650505SPaul Walmsley 	.ops		= &clkops_null,
8852650505SPaul Walmsley 	.parent		= &ck_ref,
8952650505SPaul Walmsley };
9052650505SPaul Walmsley 
9152650505SPaul Walmsley /*
9252650505SPaul Walmsley  * FIXME: This clock seems to be necessary but no-one has asked for its
9352650505SPaul Walmsley  * activation.  [ FIX: SoSSI, SSR ]
9452650505SPaul Walmsley  */
9552650505SPaul Walmsley static struct arm_idlect1_clk ck_dpll1out = {
9652650505SPaul Walmsley 	.clk = {
9752650505SPaul Walmsley 		.name		= "ck_dpll1out",
9852650505SPaul Walmsley 		.ops		= &clkops_generic,
9952650505SPaul Walmsley 		.parent		= &ck_dpll1,
10052650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL | ENABLE_REG_32BIT |
10152650505SPaul Walmsley 				  ENABLE_ON_INIT,
10252650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
10352650505SPaul Walmsley 		.enable_bit	= EN_CKOUT_ARM,
10452650505SPaul Walmsley 		.recalc		= &followparent_recalc,
10552650505SPaul Walmsley 	},
106fb2fc920SPaul Walmsley 	.idlect_shift	= IDL_CLKOUT_ARM_SHIFT,
10752650505SPaul Walmsley };
10852650505SPaul Walmsley 
10952650505SPaul Walmsley static struct clk sossi_ck = {
11052650505SPaul Walmsley 	.name		= "ck_sossi",
11152650505SPaul Walmsley 	.ops		= &clkops_generic,
11252650505SPaul Walmsley 	.parent		= &ck_dpll1out.clk,
11352650505SPaul Walmsley 	.flags		= CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT,
11452650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1),
115fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_SOSSI_CLK_EN_R,
11652650505SPaul Walmsley 	.recalc		= &omap1_sossi_recalc,
11752650505SPaul Walmsley 	.set_rate	= &omap1_set_sossi_rate,
11852650505SPaul Walmsley };
11952650505SPaul Walmsley 
12052650505SPaul Walmsley static struct clk arm_ck = {
12152650505SPaul Walmsley 	.name		= "arm_ck",
12252650505SPaul Walmsley 	.ops		= &clkops_null,
12352650505SPaul Walmsley 	.parent		= &ck_dpll1,
12452650505SPaul Walmsley 	.rate_offset	= CKCTL_ARMDIV_OFFSET,
12552650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
12652650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
12752650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
12852650505SPaul Walmsley };
12952650505SPaul Walmsley 
13052650505SPaul Walmsley static struct arm_idlect1_clk armper_ck = {
13152650505SPaul Walmsley 	.clk = {
13252650505SPaul Walmsley 		.name		= "armper_ck",
13352650505SPaul Walmsley 		.ops		= &clkops_generic,
13452650505SPaul Walmsley 		.parent		= &ck_dpll1,
13552650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
13652650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
13752650505SPaul Walmsley 		.enable_bit	= EN_PERCK,
13852650505SPaul Walmsley 		.rate_offset	= CKCTL_PERDIV_OFFSET,
13952650505SPaul Walmsley 		.recalc		= &omap1_ckctl_recalc,
14052650505SPaul Walmsley 		.round_rate	= omap1_clk_round_rate_ckctl_arm,
14152650505SPaul Walmsley 		.set_rate	= omap1_clk_set_rate_ckctl_arm,
14252650505SPaul Walmsley 	},
143fb2fc920SPaul Walmsley 	.idlect_shift	= IDLPER_ARM_SHIFT,
14452650505SPaul Walmsley };
14552650505SPaul Walmsley 
14652650505SPaul Walmsley /*
14752650505SPaul Walmsley  * FIXME: This clock seems to be necessary but no-one has asked for its
14852650505SPaul Walmsley  * activation.  [ GPIO code for 1510 ]
14952650505SPaul Walmsley  */
15052650505SPaul Walmsley static struct clk arm_gpio_ck = {
15177640aabSVaradarajan, Charulatha 	.name		= "ick",
15252650505SPaul Walmsley 	.ops		= &clkops_generic,
15352650505SPaul Walmsley 	.parent		= &ck_dpll1,
15452650505SPaul Walmsley 	.flags		= ENABLE_ON_INIT,
15552650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
15652650505SPaul Walmsley 	.enable_bit	= EN_GPIOCK,
15752650505SPaul Walmsley 	.recalc		= &followparent_recalc,
15852650505SPaul Walmsley };
15952650505SPaul Walmsley 
16052650505SPaul Walmsley static struct arm_idlect1_clk armxor_ck = {
16152650505SPaul Walmsley 	.clk = {
16252650505SPaul Walmsley 		.name		= "armxor_ck",
16352650505SPaul Walmsley 		.ops		= &clkops_generic,
16452650505SPaul Walmsley 		.parent		= &ck_ref,
16552650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
16652650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
16752650505SPaul Walmsley 		.enable_bit	= EN_XORPCK,
16852650505SPaul Walmsley 		.recalc		= &followparent_recalc,
16952650505SPaul Walmsley 	},
170fb2fc920SPaul Walmsley 	.idlect_shift	= IDLXORP_ARM_SHIFT,
17152650505SPaul Walmsley };
17252650505SPaul Walmsley 
17352650505SPaul Walmsley static struct arm_idlect1_clk armtim_ck = {
17452650505SPaul Walmsley 	.clk = {
17552650505SPaul Walmsley 		.name		= "armtim_ck",
17652650505SPaul Walmsley 		.ops		= &clkops_generic,
17752650505SPaul Walmsley 		.parent		= &ck_ref,
17852650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
17952650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
18052650505SPaul Walmsley 		.enable_bit	= EN_TIMCK,
18152650505SPaul Walmsley 		.recalc		= &followparent_recalc,
18252650505SPaul Walmsley 	},
183fb2fc920SPaul Walmsley 	.idlect_shift	= IDLTIM_ARM_SHIFT,
18452650505SPaul Walmsley };
18552650505SPaul Walmsley 
18652650505SPaul Walmsley static struct arm_idlect1_clk armwdt_ck = {
18752650505SPaul Walmsley 	.clk = {
18852650505SPaul Walmsley 		.name		= "armwdt_ck",
18952650505SPaul Walmsley 		.ops		= &clkops_generic,
19052650505SPaul Walmsley 		.parent		= &ck_ref,
19152650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
19252650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
19352650505SPaul Walmsley 		.enable_bit	= EN_WDTCK,
1940dfc242fSPaul Walmsley 		.fixed_div	= 14,
1950dfc242fSPaul Walmsley 		.recalc		= &omap_fixed_divisor_recalc,
19652650505SPaul Walmsley 	},
197fb2fc920SPaul Walmsley 	.idlect_shift	= IDLWDT_ARM_SHIFT,
19852650505SPaul Walmsley };
19952650505SPaul Walmsley 
20052650505SPaul Walmsley static struct clk arminth_ck16xx = {
20152650505SPaul Walmsley 	.name		= "arminth_ck",
20252650505SPaul Walmsley 	.ops		= &clkops_null,
20352650505SPaul Walmsley 	.parent		= &arm_ck,
20452650505SPaul Walmsley 	.recalc		= &followparent_recalc,
20552650505SPaul Walmsley 	/* Note: On 16xx the frequency can be divided by 2 by programming
20652650505SPaul Walmsley 	 * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
20752650505SPaul Walmsley 	 *
20852650505SPaul Walmsley 	 * 1510 version is in TC clocks.
20952650505SPaul Walmsley 	 */
21052650505SPaul Walmsley };
21152650505SPaul Walmsley 
21252650505SPaul Walmsley static struct clk dsp_ck = {
21352650505SPaul Walmsley 	.name		= "dsp_ck",
21452650505SPaul Walmsley 	.ops		= &clkops_generic,
21552650505SPaul Walmsley 	.parent		= &ck_dpll1,
21652650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_CKCTL),
21752650505SPaul Walmsley 	.enable_bit	= EN_DSPCK,
21852650505SPaul Walmsley 	.rate_offset	= CKCTL_DSPDIV_OFFSET,
21952650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
22052650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
22152650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
22252650505SPaul Walmsley };
22352650505SPaul Walmsley 
22452650505SPaul Walmsley static struct clk dspmmu_ck = {
22552650505SPaul Walmsley 	.name		= "dspmmu_ck",
22652650505SPaul Walmsley 	.ops		= &clkops_null,
22752650505SPaul Walmsley 	.parent		= &ck_dpll1,
22852650505SPaul Walmsley 	.rate_offset	= CKCTL_DSPMMUDIV_OFFSET,
22952650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
23052650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
23152650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
23252650505SPaul Walmsley };
23352650505SPaul Walmsley 
23452650505SPaul Walmsley static struct clk dspper_ck = {
23552650505SPaul Walmsley 	.name		= "dspper_ck",
23652650505SPaul Walmsley 	.ops		= &clkops_dspck,
23752650505SPaul Walmsley 	.parent		= &ck_dpll1,
23852650505SPaul Walmsley 	.enable_reg	= DSP_IDLECT2,
23952650505SPaul Walmsley 	.enable_bit	= EN_PERCK,
24052650505SPaul Walmsley 	.rate_offset	= CKCTL_PERDIV_OFFSET,
24152650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc_dsp_domain,
24252650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
24352650505SPaul Walmsley 	.set_rate	= &omap1_clk_set_rate_dsp_domain,
24452650505SPaul Walmsley };
24552650505SPaul Walmsley 
24652650505SPaul Walmsley static struct clk dspxor_ck = {
24752650505SPaul Walmsley 	.name		= "dspxor_ck",
24852650505SPaul Walmsley 	.ops		= &clkops_dspck,
24952650505SPaul Walmsley 	.parent		= &ck_ref,
25052650505SPaul Walmsley 	.enable_reg	= DSP_IDLECT2,
25152650505SPaul Walmsley 	.enable_bit	= EN_XORPCK,
25252650505SPaul Walmsley 	.recalc		= &followparent_recalc,
25352650505SPaul Walmsley };
25452650505SPaul Walmsley 
25552650505SPaul Walmsley static struct clk dsptim_ck = {
25652650505SPaul Walmsley 	.name		= "dsptim_ck",
25752650505SPaul Walmsley 	.ops		= &clkops_dspck,
25852650505SPaul Walmsley 	.parent		= &ck_ref,
25952650505SPaul Walmsley 	.enable_reg	= DSP_IDLECT2,
26052650505SPaul Walmsley 	.enable_bit	= EN_DSPTIMCK,
26152650505SPaul Walmsley 	.recalc		= &followparent_recalc,
26252650505SPaul Walmsley };
26352650505SPaul Walmsley 
26452650505SPaul Walmsley static struct arm_idlect1_clk tc_ck = {
26552650505SPaul Walmsley 	.clk = {
26652650505SPaul Walmsley 		.name		= "tc_ck",
26752650505SPaul Walmsley 		.ops		= &clkops_null,
26852650505SPaul Walmsley 		.parent		= &ck_dpll1,
26952650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
27052650505SPaul Walmsley 		.rate_offset	= CKCTL_TCDIV_OFFSET,
27152650505SPaul Walmsley 		.recalc		= &omap1_ckctl_recalc,
27252650505SPaul Walmsley 		.round_rate	= omap1_clk_round_rate_ckctl_arm,
27352650505SPaul Walmsley 		.set_rate	= omap1_clk_set_rate_ckctl_arm,
27452650505SPaul Walmsley 	},
275fb2fc920SPaul Walmsley 	.idlect_shift	= IDLIF_ARM_SHIFT,
27652650505SPaul Walmsley };
27752650505SPaul Walmsley 
27852650505SPaul Walmsley static struct clk arminth_ck1510 = {
27952650505SPaul Walmsley 	.name		= "arminth_ck",
28052650505SPaul Walmsley 	.ops		= &clkops_null,
28152650505SPaul Walmsley 	.parent		= &tc_ck.clk,
28252650505SPaul Walmsley 	.recalc		= &followparent_recalc,
28352650505SPaul Walmsley 	/* Note: On 1510 the frequency follows TC_CK
28452650505SPaul Walmsley 	 *
28552650505SPaul Walmsley 	 * 16xx version is in MPU clocks.
28652650505SPaul Walmsley 	 */
28752650505SPaul Walmsley };
28852650505SPaul Walmsley 
28952650505SPaul Walmsley static struct clk tipb_ck = {
29052650505SPaul Walmsley 	/* No-idle controlled by "tc_ck" */
29152650505SPaul Walmsley 	.name		= "tipb_ck",
29252650505SPaul Walmsley 	.ops		= &clkops_null,
29352650505SPaul Walmsley 	.parent		= &tc_ck.clk,
29452650505SPaul Walmsley 	.recalc		= &followparent_recalc,
29552650505SPaul Walmsley };
29652650505SPaul Walmsley 
29752650505SPaul Walmsley static struct clk l3_ocpi_ck = {
29852650505SPaul Walmsley 	/* No-idle controlled by "tc_ck" */
29952650505SPaul Walmsley 	.name		= "l3_ocpi_ck",
30052650505SPaul Walmsley 	.ops		= &clkops_generic,
30152650505SPaul Walmsley 	.parent		= &tc_ck.clk,
30252650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT3),
30352650505SPaul Walmsley 	.enable_bit	= EN_OCPI_CK,
30452650505SPaul Walmsley 	.recalc		= &followparent_recalc,
30552650505SPaul Walmsley };
30652650505SPaul Walmsley 
30752650505SPaul Walmsley static struct clk tc1_ck = {
30852650505SPaul Walmsley 	.name		= "tc1_ck",
30952650505SPaul Walmsley 	.ops		= &clkops_generic,
31052650505SPaul Walmsley 	.parent		= &tc_ck.clk,
31152650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT3),
31252650505SPaul Walmsley 	.enable_bit	= EN_TC1_CK,
31352650505SPaul Walmsley 	.recalc		= &followparent_recalc,
31452650505SPaul Walmsley };
31552650505SPaul Walmsley 
31652650505SPaul Walmsley /*
31752650505SPaul Walmsley  * FIXME: This clock seems to be necessary but no-one has asked for its
31852650505SPaul Walmsley  * activation.  [ pm.c (SRAM), CCP, Camera ]
31952650505SPaul Walmsley  */
32052650505SPaul Walmsley static struct clk tc2_ck = {
32152650505SPaul Walmsley 	.name		= "tc2_ck",
32252650505SPaul Walmsley 	.ops		= &clkops_generic,
32352650505SPaul Walmsley 	.parent		= &tc_ck.clk,
32452650505SPaul Walmsley 	.flags		= ENABLE_ON_INIT,
32552650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT3),
32652650505SPaul Walmsley 	.enable_bit	= EN_TC2_CK,
32752650505SPaul Walmsley 	.recalc		= &followparent_recalc,
32852650505SPaul Walmsley };
32952650505SPaul Walmsley 
33052650505SPaul Walmsley static struct clk dma_ck = {
33152650505SPaul Walmsley 	/* No-idle controlled by "tc_ck" */
33252650505SPaul Walmsley 	.name		= "dma_ck",
33352650505SPaul Walmsley 	.ops		= &clkops_null,
33452650505SPaul Walmsley 	.parent		= &tc_ck.clk,
33552650505SPaul Walmsley 	.recalc		= &followparent_recalc,
33652650505SPaul Walmsley };
33752650505SPaul Walmsley 
33852650505SPaul Walmsley static struct clk dma_lcdfree_ck = {
33952650505SPaul Walmsley 	.name		= "dma_lcdfree_ck",
34052650505SPaul Walmsley 	.ops		= &clkops_null,
34152650505SPaul Walmsley 	.parent		= &tc_ck.clk,
34252650505SPaul Walmsley 	.recalc		= &followparent_recalc,
34352650505SPaul Walmsley };
34452650505SPaul Walmsley 
34552650505SPaul Walmsley static struct arm_idlect1_clk api_ck = {
34652650505SPaul Walmsley 	.clk = {
34752650505SPaul Walmsley 		.name		= "api_ck",
34852650505SPaul Walmsley 		.ops		= &clkops_generic,
34952650505SPaul Walmsley 		.parent		= &tc_ck.clk,
35052650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
35152650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
35252650505SPaul Walmsley 		.enable_bit	= EN_APICK,
35352650505SPaul Walmsley 		.recalc		= &followparent_recalc,
35452650505SPaul Walmsley 	},
355fb2fc920SPaul Walmsley 	.idlect_shift	= IDLAPI_ARM_SHIFT,
35652650505SPaul Walmsley };
35752650505SPaul Walmsley 
35852650505SPaul Walmsley static struct arm_idlect1_clk lb_ck = {
35952650505SPaul Walmsley 	.clk = {
36052650505SPaul Walmsley 		.name		= "lb_ck",
36152650505SPaul Walmsley 		.ops		= &clkops_generic,
36252650505SPaul Walmsley 		.parent		= &tc_ck.clk,
36352650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
36452650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
36552650505SPaul Walmsley 		.enable_bit	= EN_LBCK,
36652650505SPaul Walmsley 		.recalc		= &followparent_recalc,
36752650505SPaul Walmsley 	},
368fb2fc920SPaul Walmsley 	.idlect_shift	= IDLLB_ARM_SHIFT,
36952650505SPaul Walmsley };
37052650505SPaul Walmsley 
37152650505SPaul Walmsley static struct clk rhea1_ck = {
37252650505SPaul Walmsley 	.name		= "rhea1_ck",
37352650505SPaul Walmsley 	.ops		= &clkops_null,
37452650505SPaul Walmsley 	.parent		= &tc_ck.clk,
37552650505SPaul Walmsley 	.recalc		= &followparent_recalc,
37652650505SPaul Walmsley };
37752650505SPaul Walmsley 
37852650505SPaul Walmsley static struct clk rhea2_ck = {
37952650505SPaul Walmsley 	.name		= "rhea2_ck",
38052650505SPaul Walmsley 	.ops		= &clkops_null,
38152650505SPaul Walmsley 	.parent		= &tc_ck.clk,
38252650505SPaul Walmsley 	.recalc		= &followparent_recalc,
38352650505SPaul Walmsley };
38452650505SPaul Walmsley 
38552650505SPaul Walmsley static struct clk lcd_ck_16xx = {
38652650505SPaul Walmsley 	.name		= "lcd_ck",
38752650505SPaul Walmsley 	.ops		= &clkops_generic,
38852650505SPaul Walmsley 	.parent		= &ck_dpll1,
38952650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
39052650505SPaul Walmsley 	.enable_bit	= EN_LCDCK,
39152650505SPaul Walmsley 	.rate_offset	= CKCTL_LCDDIV_OFFSET,
39252650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
39352650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
39452650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
39552650505SPaul Walmsley };
39652650505SPaul Walmsley 
39752650505SPaul Walmsley static struct arm_idlect1_clk lcd_ck_1510 = {
39852650505SPaul Walmsley 	.clk = {
39952650505SPaul Walmsley 		.name		= "lcd_ck",
40052650505SPaul Walmsley 		.ops		= &clkops_generic,
40152650505SPaul Walmsley 		.parent		= &ck_dpll1,
40252650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
40352650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
40452650505SPaul Walmsley 		.enable_bit	= EN_LCDCK,
40552650505SPaul Walmsley 		.rate_offset	= CKCTL_LCDDIV_OFFSET,
40652650505SPaul Walmsley 		.recalc		= &omap1_ckctl_recalc,
40752650505SPaul Walmsley 		.round_rate	= omap1_clk_round_rate_ckctl_arm,
40852650505SPaul Walmsley 		.set_rate	= omap1_clk_set_rate_ckctl_arm,
40952650505SPaul Walmsley 	},
410fb2fc920SPaul Walmsley 	.idlect_shift	= OMAP1510_IDLLCD_ARM_SHIFT,
41152650505SPaul Walmsley };
41252650505SPaul Walmsley 
413fb2fc920SPaul Walmsley /*
414fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
415fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
416fb2fc920SPaul Walmsley  *
417fb2fc920SPaul Walmsley  * XXX does this need SYSC register handling?
418fb2fc920SPaul Walmsley  */
41952650505SPaul Walmsley static struct clk uart1_1510 = {
42052650505SPaul Walmsley 	.name		= "uart1_ck",
42152650505SPaul Walmsley 	.ops		= &clkops_null,
42252650505SPaul Walmsley 	/* Direct from ULPD, no real parent */
42352650505SPaul Walmsley 	.parent		= &armper_ck.clk,
42452650505SPaul Walmsley 	.rate		= 12000000,
42552650505SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
42652650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
427fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_UART1_CLK_MODE_R,
42852650505SPaul Walmsley 	.set_rate	= &omap1_set_uart_rate,
42952650505SPaul Walmsley 	.recalc		= &omap1_uart_recalc,
43052650505SPaul Walmsley };
43152650505SPaul Walmsley 
432fb2fc920SPaul Walmsley /*
433fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
434fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
435fb2fc920SPaul Walmsley  *
436fb2fc920SPaul Walmsley  * XXX SYSC register handling does not belong in the clock framework
437fb2fc920SPaul Walmsley  */
43852650505SPaul Walmsley static struct uart_clk uart1_16xx = {
43952650505SPaul Walmsley 	.clk	= {
44052650505SPaul Walmsley 		.name		= "uart1_ck",
441fb2fc920SPaul Walmsley 		.ops		= &clkops_uart_16xx,
44252650505SPaul Walmsley 		/* Direct from ULPD, no real parent */
44352650505SPaul Walmsley 		.parent		= &armper_ck.clk,
44452650505SPaul Walmsley 		.rate		= 48000000,
44551c19541SPaul Walmsley 		.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
44652650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
447fb2fc920SPaul Walmsley 		.enable_bit	= CONF_MOD_UART1_CLK_MODE_R,
44852650505SPaul Walmsley 	},
44952650505SPaul Walmsley 	.sysc_addr	= 0xfffb0054,
45052650505SPaul Walmsley };
45152650505SPaul Walmsley 
452fb2fc920SPaul Walmsley /*
453fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
454fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
455fb2fc920SPaul Walmsley  *
456fb2fc920SPaul Walmsley  * XXX does this need SYSC register handling?
457fb2fc920SPaul Walmsley  */
45852650505SPaul Walmsley static struct clk uart2_ck = {
45952650505SPaul Walmsley 	.name		= "uart2_ck",
46052650505SPaul Walmsley 	.ops		= &clkops_null,
46152650505SPaul Walmsley 	/* Direct from ULPD, no real parent */
46252650505SPaul Walmsley 	.parent		= &armper_ck.clk,
46352650505SPaul Walmsley 	.rate		= 12000000,
46452650505SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
46552650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
466fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_UART2_CLK_MODE_R,
46752650505SPaul Walmsley 	.set_rate	= &omap1_set_uart_rate,
46852650505SPaul Walmsley 	.recalc		= &omap1_uart_recalc,
46952650505SPaul Walmsley };
47052650505SPaul Walmsley 
471fb2fc920SPaul Walmsley /*
472fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
473fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
474fb2fc920SPaul Walmsley  *
475fb2fc920SPaul Walmsley  * XXX does this need SYSC register handling?
476fb2fc920SPaul Walmsley  */
47752650505SPaul Walmsley static struct clk uart3_1510 = {
47852650505SPaul Walmsley 	.name		= "uart3_ck",
47952650505SPaul Walmsley 	.ops		= &clkops_null,
48052650505SPaul Walmsley 	/* Direct from ULPD, no real parent */
48152650505SPaul Walmsley 	.parent		= &armper_ck.clk,
48252650505SPaul Walmsley 	.rate		= 12000000,
48352650505SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
48452650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
485fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_UART3_CLK_MODE_R,
48652650505SPaul Walmsley 	.set_rate	= &omap1_set_uart_rate,
48752650505SPaul Walmsley 	.recalc		= &omap1_uart_recalc,
48852650505SPaul Walmsley };
48952650505SPaul Walmsley 
490fb2fc920SPaul Walmsley /*
491fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
492fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
493fb2fc920SPaul Walmsley  *
494fb2fc920SPaul Walmsley  * XXX SYSC register handling does not belong in the clock framework
495fb2fc920SPaul Walmsley  */
49652650505SPaul Walmsley static struct uart_clk uart3_16xx = {
49752650505SPaul Walmsley 	.clk	= {
49852650505SPaul Walmsley 		.name		= "uart3_ck",
499fb2fc920SPaul Walmsley 		.ops		= &clkops_uart_16xx,
50052650505SPaul Walmsley 		/* Direct from ULPD, no real parent */
50152650505SPaul Walmsley 		.parent		= &armper_ck.clk,
50252650505SPaul Walmsley 		.rate		= 48000000,
50351c19541SPaul Walmsley 		.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
50452650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
505fb2fc920SPaul Walmsley 		.enable_bit	= CONF_MOD_UART3_CLK_MODE_R,
50652650505SPaul Walmsley 	},
50752650505SPaul Walmsley 	.sysc_addr	= 0xfffb9854,
50852650505SPaul Walmsley };
50952650505SPaul Walmsley 
51052650505SPaul Walmsley static struct clk usb_clko = {	/* 6 MHz output on W4_USB_CLKO */
51152650505SPaul Walmsley 	.name		= "usb_clko",
51252650505SPaul Walmsley 	.ops		= &clkops_generic,
51352650505SPaul Walmsley 	/* Direct from ULPD, no parent */
51452650505SPaul Walmsley 	.rate		= 6000000,
51551c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT,
51652650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ULPD_CLOCK_CTRL),
51752650505SPaul Walmsley 	.enable_bit	= USB_MCLK_EN_BIT,
51852650505SPaul Walmsley };
51952650505SPaul Walmsley 
52052650505SPaul Walmsley static struct clk usb_hhc_ck1510 = {
52152650505SPaul Walmsley 	.name		= "usb_hhc_ck",
52252650505SPaul Walmsley 	.ops		= &clkops_generic,
52352650505SPaul Walmsley 	/* Direct from ULPD, no parent */
52452650505SPaul Walmsley 	.rate		= 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
52551c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT,
52652650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
52752650505SPaul Walmsley 	.enable_bit	= USB_HOST_HHC_UHOST_EN,
52852650505SPaul Walmsley };
52952650505SPaul Walmsley 
53052650505SPaul Walmsley static struct clk usb_hhc_ck16xx = {
53152650505SPaul Walmsley 	.name		= "usb_hhc_ck",
53252650505SPaul Walmsley 	.ops		= &clkops_generic,
53352650505SPaul Walmsley 	/* Direct from ULPD, no parent */
53452650505SPaul Walmsley 	.rate		= 48000000,
53552650505SPaul Walmsley 	/* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
53651c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT,
53752650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */
538fb2fc920SPaul Walmsley 	.enable_bit	= OTG_SYSCON_2_UHOST_EN_SHIFT
53952650505SPaul Walmsley };
54052650505SPaul Walmsley 
54152650505SPaul Walmsley static struct clk usb_dc_ck = {
54252650505SPaul Walmsley 	.name		= "usb_dc_ck",
54352650505SPaul Walmsley 	.ops		= &clkops_generic,
54452650505SPaul Walmsley 	/* Direct from ULPD, no parent */
54552650505SPaul Walmsley 	.rate		= 48000000,
54652650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
547fb2fc920SPaul Walmsley 	.enable_bit	= USB_REQ_EN_SHIFT,
54852650505SPaul Walmsley };
54952650505SPaul Walmsley 
55052650505SPaul Walmsley static struct clk usb_dc_ck7xx = {
55152650505SPaul Walmsley 	.name		= "usb_dc_ck",
55252650505SPaul Walmsley 	.ops		= &clkops_generic,
55352650505SPaul Walmsley 	/* Direct from ULPD, no parent */
55452650505SPaul Walmsley 	.rate		= 48000000,
55552650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
556fb2fc920SPaul Walmsley 	.enable_bit	= SOFT_USB_OTG_DPLL_REQ_SHIFT,
55752650505SPaul Walmsley };
55852650505SPaul Walmsley 
5598b8fbd39SCory Maccarrone static struct clk uart1_7xx = {
5608b8fbd39SCory Maccarrone 	.name		= "uart1_ck",
5618b8fbd39SCory Maccarrone 	.ops		= &clkops_generic,
5628b8fbd39SCory Maccarrone 	/* Direct from ULPD, no parent */
5638b8fbd39SCory Maccarrone 	.rate		= 12000000,
5648b8fbd39SCory Maccarrone 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
5658b8fbd39SCory Maccarrone 	.enable_bit	= 9,
5668b8fbd39SCory Maccarrone };
5678b8fbd39SCory Maccarrone 
5688b8fbd39SCory Maccarrone static struct clk uart2_7xx = {
5698b8fbd39SCory Maccarrone 	.name		= "uart2_ck",
5708b8fbd39SCory Maccarrone 	.ops		= &clkops_generic,
5718b8fbd39SCory Maccarrone 	/* Direct from ULPD, no parent */
5728b8fbd39SCory Maccarrone 	.rate		= 12000000,
5738b8fbd39SCory Maccarrone 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
5748b8fbd39SCory Maccarrone 	.enable_bit	= 11,
5758b8fbd39SCory Maccarrone };
5768b8fbd39SCory Maccarrone 
57752650505SPaul Walmsley static struct clk mclk_1510 = {
57852650505SPaul Walmsley 	.name		= "mclk",
57952650505SPaul Walmsley 	.ops		= &clkops_generic,
58052650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
58152650505SPaul Walmsley 	.rate		= 12000000,
58252650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
583fb2fc920SPaul Walmsley 	.enable_bit	= SOFT_COM_MCKO_REQ_SHIFT,
58452650505SPaul Walmsley };
58552650505SPaul Walmsley 
58652650505SPaul Walmsley static struct clk mclk_16xx = {
58752650505SPaul Walmsley 	.name		= "mclk",
58852650505SPaul Walmsley 	.ops		= &clkops_generic,
58952650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
59052650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(COM_CLK_DIV_CTRL_SEL),
59152650505SPaul Walmsley 	.enable_bit	= COM_ULPD_PLL_CLK_REQ,
59252650505SPaul Walmsley 	.set_rate	= &omap1_set_ext_clk_rate,
59352650505SPaul Walmsley 	.round_rate	= &omap1_round_ext_clk_rate,
59452650505SPaul Walmsley 	.init		= &omap1_init_ext_clk,
59552650505SPaul Walmsley };
59652650505SPaul Walmsley 
59752650505SPaul Walmsley static struct clk bclk_1510 = {
59852650505SPaul Walmsley 	.name		= "bclk",
59952650505SPaul Walmsley 	.ops		= &clkops_generic,
60052650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
60152650505SPaul Walmsley 	.rate		= 12000000,
60252650505SPaul Walmsley };
60352650505SPaul Walmsley 
60452650505SPaul Walmsley static struct clk bclk_16xx = {
60552650505SPaul Walmsley 	.name		= "bclk",
60652650505SPaul Walmsley 	.ops		= &clkops_generic,
60752650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
60852650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SWD_CLK_DIV_CTRL_SEL),
60952650505SPaul Walmsley 	.enable_bit	= SWD_ULPD_PLL_CLK_REQ,
61052650505SPaul Walmsley 	.set_rate	= &omap1_set_ext_clk_rate,
61152650505SPaul Walmsley 	.round_rate	= &omap1_round_ext_clk_rate,
61252650505SPaul Walmsley 	.init		= &omap1_init_ext_clk,
61352650505SPaul Walmsley };
61452650505SPaul Walmsley 
61552650505SPaul Walmsley static struct clk mmc1_ck = {
616b92c170dSPaul Walmsley 	.name		= "mmc1_ck",
61752650505SPaul Walmsley 	.ops		= &clkops_generic,
61852650505SPaul Walmsley 	/* Functional clock is direct from ULPD, interface clock is ARMPER */
61952650505SPaul Walmsley 	.parent		= &armper_ck.clk,
62052650505SPaul Walmsley 	.rate		= 48000000,
62151c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
62252650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
623fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_MMC_SD_CLK_REQ_R,
62452650505SPaul Walmsley };
62552650505SPaul Walmsley 
626fb2fc920SPaul Walmsley /*
627fb2fc920SPaul Walmsley  * XXX MOD_CONF_CTRL_0 bit 20 is defined in the 1510 TRM as
628fb2fc920SPaul Walmsley  * CONF_MOD_MCBSP3_AUXON ??
629fb2fc920SPaul Walmsley  */
63052650505SPaul Walmsley static struct clk mmc2_ck = {
631b92c170dSPaul Walmsley 	.name		= "mmc2_ck",
63252650505SPaul Walmsley 	.ops		= &clkops_generic,
63352650505SPaul Walmsley 	/* Functional clock is direct from ULPD, interface clock is ARMPER */
63452650505SPaul Walmsley 	.parent		= &armper_ck.clk,
63552650505SPaul Walmsley 	.rate		= 48000000,
63651c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
63752650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
63852650505SPaul Walmsley 	.enable_bit	= 20,
63952650505SPaul Walmsley };
64052650505SPaul Walmsley 
64152650505SPaul Walmsley static struct clk mmc3_ck = {
642b92c170dSPaul Walmsley 	.name		= "mmc3_ck",
64352650505SPaul Walmsley 	.ops		= &clkops_generic,
64452650505SPaul Walmsley 	/* Functional clock is direct from ULPD, interface clock is ARMPER */
64552650505SPaul Walmsley 	.parent		= &armper_ck.clk,
64652650505SPaul Walmsley 	.rate		= 48000000,
64751c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
64852650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
649fb2fc920SPaul Walmsley 	.enable_bit	= SOFT_MMC_DPLL_REQ_SHIFT,
65052650505SPaul Walmsley };
65152650505SPaul Walmsley 
65252650505SPaul Walmsley static struct clk virtual_ck_mpu = {
65352650505SPaul Walmsley 	.name		= "mpu",
65452650505SPaul Walmsley 	.ops		= &clkops_null,
65552650505SPaul Walmsley 	.parent		= &arm_ck, /* Is smarter alias for */
65652650505SPaul Walmsley 	.recalc		= &followparent_recalc,
65752650505SPaul Walmsley 	.set_rate	= &omap1_select_table_rate,
65852650505SPaul Walmsley 	.round_rate	= &omap1_round_to_table_rate,
65952650505SPaul Walmsley };
66052650505SPaul Walmsley 
66152650505SPaul Walmsley /* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
66252650505SPaul Walmsley remains active during MPU idle whenever this is enabled */
66352650505SPaul Walmsley static struct clk i2c_fck = {
66452650505SPaul Walmsley 	.name		= "i2c_fck",
66552650505SPaul Walmsley 	.ops		= &clkops_null,
66652650505SPaul Walmsley 	.flags		= CLOCK_NO_IDLE_PARENT,
66752650505SPaul Walmsley 	.parent		= &armxor_ck.clk,
66852650505SPaul Walmsley 	.recalc		= &followparent_recalc,
66952650505SPaul Walmsley };
67052650505SPaul Walmsley 
67152650505SPaul Walmsley static struct clk i2c_ick = {
67252650505SPaul Walmsley 	.name		= "i2c_ick",
67352650505SPaul Walmsley 	.ops		= &clkops_null,
67452650505SPaul Walmsley 	.flags		= CLOCK_NO_IDLE_PARENT,
67552650505SPaul Walmsley 	.parent		= &armper_ck.clk,
67652650505SPaul Walmsley 	.recalc		= &followparent_recalc,
67752650505SPaul Walmsley };
67852650505SPaul Walmsley 
67952650505SPaul Walmsley /*
68052650505SPaul Walmsley  * clkdev integration
68152650505SPaul Walmsley  */
68252650505SPaul Walmsley 
68352650505SPaul Walmsley static struct omap_clk omap_clks[] = {
68452650505SPaul Walmsley 	/* non-ULPD clocks */
68552650505SPaul Walmsley 	CLK(NULL,	"ck_ref",	&ck_ref,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
686e8ae6b6eSCory Maccarrone 	CLK(NULL,	"ck_dpll1",	&ck_dpll1,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
68752650505SPaul Walmsley 	/* CK_GEN1 clocks */
68852650505SPaul Walmsley 	CLK(NULL,	"ck_dpll1out",	&ck_dpll1out.clk, CK_16XX),
68952650505SPaul Walmsley 	CLK(NULL,	"ck_sossi",	&sossi_ck,	CK_16XX),
69052650505SPaul Walmsley 	CLK(NULL,	"arm_ck",	&arm_ck,	CK_16XX | CK_1510 | CK_310),
69152650505SPaul Walmsley 	CLK(NULL,	"armper_ck",	&armper_ck.clk,	CK_16XX | CK_1510 | CK_310),
69277640aabSVaradarajan, Charulatha 	CLK("omap_gpio.0", "ick",	&arm_gpio_ck,	CK_1510 | CK_310),
69352650505SPaul Walmsley 	CLK(NULL,	"armxor_ck",	&armxor_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
69452650505SPaul Walmsley 	CLK(NULL,	"armtim_ck",	&armtim_ck.clk,	CK_16XX | CK_1510 | CK_310),
69552650505SPaul Walmsley 	CLK("omap_wdt",	"fck",		&armwdt_ck.clk,	CK_16XX | CK_1510 | CK_310),
69652650505SPaul Walmsley 	CLK("omap_wdt",	"ick",		&armper_ck.clk,	CK_16XX),
69752650505SPaul Walmsley 	CLK("omap_wdt", "ick",		&dummy_ck,	CK_1510 | CK_310),
69852650505SPaul Walmsley 	CLK(NULL,	"arminth_ck",	&arminth_ck1510, CK_1510 | CK_310),
69952650505SPaul Walmsley 	CLK(NULL,	"arminth_ck",	&arminth_ck16xx, CK_16XX),
70052650505SPaul Walmsley 	/* CK_GEN2 clocks */
70152650505SPaul Walmsley 	CLK(NULL,	"dsp_ck",	&dsp_ck,	CK_16XX | CK_1510 | CK_310),
70252650505SPaul Walmsley 	CLK(NULL,	"dspmmu_ck",	&dspmmu_ck,	CK_16XX | CK_1510 | CK_310),
70352650505SPaul Walmsley 	CLK(NULL,	"dspper_ck",	&dspper_ck,	CK_16XX | CK_1510 | CK_310),
70452650505SPaul Walmsley 	CLK(NULL,	"dspxor_ck",	&dspxor_ck,	CK_16XX | CK_1510 | CK_310),
70552650505SPaul Walmsley 	CLK(NULL,	"dsptim_ck",	&dsptim_ck,	CK_16XX | CK_1510 | CK_310),
70652650505SPaul Walmsley 	/* CK_GEN3 clocks */
70752650505SPaul Walmsley 	CLK(NULL,	"tc_ck",	&tc_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
70852650505SPaul Walmsley 	CLK(NULL,	"tipb_ck",	&tipb_ck,	CK_1510 | CK_310),
70952650505SPaul Walmsley 	CLK(NULL,	"l3_ocpi_ck",	&l3_ocpi_ck,	CK_16XX | CK_7XX),
71052650505SPaul Walmsley 	CLK(NULL,	"tc1_ck",	&tc1_ck,	CK_16XX),
71152650505SPaul Walmsley 	CLK(NULL,	"tc2_ck",	&tc2_ck,	CK_16XX),
71252650505SPaul Walmsley 	CLK(NULL,	"dma_ck",	&dma_ck,	CK_16XX | CK_1510 | CK_310),
71352650505SPaul Walmsley 	CLK(NULL,	"dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
714e8ae6b6eSCory Maccarrone 	CLK(NULL,	"api_ck",	&api_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
71552650505SPaul Walmsley 	CLK(NULL,	"lb_ck",	&lb_ck.clk,	CK_1510 | CK_310),
71652650505SPaul Walmsley 	CLK(NULL,	"rhea1_ck",	&rhea1_ck,	CK_16XX),
71752650505SPaul Walmsley 	CLK(NULL,	"rhea2_ck",	&rhea2_ck,	CK_16XX),
71852650505SPaul Walmsley 	CLK(NULL,	"lcd_ck",	&lcd_ck_16xx,	CK_16XX | CK_7XX),
71952650505SPaul Walmsley 	CLK(NULL,	"lcd_ck",	&lcd_ck_1510.clk, CK_1510 | CK_310),
72052650505SPaul Walmsley 	/* ULPD clocks */
72152650505SPaul Walmsley 	CLK(NULL,	"uart1_ck",	&uart1_1510,	CK_1510 | CK_310),
72252650505SPaul Walmsley 	CLK(NULL,	"uart1_ck",	&uart1_16xx.clk, CK_16XX),
7238b8fbd39SCory Maccarrone 	CLK(NULL,	"uart1_ck",	&uart1_7xx,	CK_7XX),
72452650505SPaul Walmsley 	CLK(NULL,	"uart2_ck",	&uart2_ck,	CK_16XX | CK_1510 | CK_310),
7258b8fbd39SCory Maccarrone 	CLK(NULL,	"uart2_ck",	&uart2_7xx,	CK_7XX),
72652650505SPaul Walmsley 	CLK(NULL,	"uart3_ck",	&uart3_1510,	CK_1510 | CK_310),
72752650505SPaul Walmsley 	CLK(NULL,	"uart3_ck",	&uart3_16xx.clk, CK_16XX),
72852650505SPaul Walmsley 	CLK(NULL,	"usb_clko",	&usb_clko,	CK_16XX | CK_1510 | CK_310),
72952650505SPaul Walmsley 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck1510, CK_1510 | CK_310),
73052650505SPaul Walmsley 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck16xx, CK_16XX),
73152650505SPaul Walmsley 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX),
73252650505SPaul Walmsley 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck7xx,	CK_7XX),
73352650505SPaul Walmsley 	CLK(NULL,	"mclk",		&mclk_1510,	CK_1510 | CK_310),
73452650505SPaul Walmsley 	CLK(NULL,	"mclk",		&mclk_16xx,	CK_16XX),
73552650505SPaul Walmsley 	CLK(NULL,	"bclk",		&bclk_1510,	CK_1510 | CK_310),
73652650505SPaul Walmsley 	CLK(NULL,	"bclk",		&bclk_16xx,	CK_16XX),
73752650505SPaul Walmsley 	CLK("mmci-omap.0", "fck",	&mmc1_ck,	CK_16XX | CK_1510 | CK_310),
73852650505SPaul Walmsley 	CLK("mmci-omap.0", "fck",	&mmc3_ck,	CK_7XX),
73952650505SPaul Walmsley 	CLK("mmci-omap.0", "ick",	&armper_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
74052650505SPaul Walmsley 	CLK("mmci-omap.1", "fck",	&mmc2_ck,	CK_16XX),
74152650505SPaul Walmsley 	CLK("mmci-omap.1", "ick",	&armper_ck.clk,	CK_16XX),
74252650505SPaul Walmsley 	/* Virtual clocks */
74352650505SPaul Walmsley 	CLK(NULL,	"mpu",		&virtual_ck_mpu, CK_16XX | CK_1510 | CK_310),
744f7bb0d9aSBenoit Cousson 	CLK("omap_i2c.1", "fck",	&i2c_fck,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
745f7bb0d9aSBenoit Cousson 	CLK("omap_i2c.1", "ick",	&i2c_ick,	CK_16XX),
746f7bb0d9aSBenoit Cousson 	CLK("omap_i2c.1", "ick",	&dummy_ck,	CK_1510 | CK_310 | CK_7XX),
747c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.1", "fck",	&dummy_ck,	CK_7XX),
748c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.1", "ick",	&dummy_ck,	CK_7XX),
749c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.2", "fck",	&dummy_ck,	CK_7XX),
750c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.2", "ick",	&dummy_ck,	CK_7XX),
75152650505SPaul Walmsley 	CLK("omap_uwire", "fck",	&armxor_ck.clk,	CK_16XX | CK_1510 | CK_310),
75252650505SPaul Walmsley 	CLK("omap-mcbsp.1", "ick",	&dspper_ck,	CK_16XX),
75352650505SPaul Walmsley 	CLK("omap-mcbsp.1", "ick",	&dummy_ck,	CK_1510 | CK_310),
75452650505SPaul Walmsley 	CLK("omap-mcbsp.2", "ick",	&armper_ck.clk,	CK_16XX),
75552650505SPaul Walmsley 	CLK("omap-mcbsp.2", "ick",	&dummy_ck,	CK_1510 | CK_310),
75652650505SPaul Walmsley 	CLK("omap-mcbsp.3", "ick",	&dspper_ck,	CK_16XX),
75752650505SPaul Walmsley 	CLK("omap-mcbsp.3", "ick",	&dummy_ck,	CK_1510 | CK_310),
75852650505SPaul Walmsley 	CLK("omap-mcbsp.1", "fck",	&dspxor_ck,	CK_16XX | CK_1510 | CK_310),
75952650505SPaul Walmsley 	CLK("omap-mcbsp.2", "fck",	&armper_ck.clk,	CK_16XX | CK_1510 | CK_310),
76052650505SPaul Walmsley 	CLK("omap-mcbsp.3", "fck",	&dspxor_ck,	CK_16XX | CK_1510 | CK_310),
76152650505SPaul Walmsley };
76252650505SPaul Walmsley 
76352650505SPaul Walmsley /*
76452650505SPaul Walmsley  * init
76552650505SPaul Walmsley  */
76652650505SPaul Walmsley 
767e9b7086bSTony Lindgren static void __init omap1_show_rates(void)
768e9b7086bSTony Lindgren {
7697852ec05SPaul Walmsley 	pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
770e9b7086bSTony Lindgren 		  ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
771e9b7086bSTony Lindgren 		  ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
772e9b7086bSTony Lindgren 		  arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
773e9b7086bSTony Lindgren }
774e9b7086bSTony Lindgren 
77524ce2705SJanusz Krzysztofik u32 cpu_mask;
77624ce2705SJanusz Krzysztofik 
77752650505SPaul Walmsley int __init omap1_clk_init(void)
77852650505SPaul Walmsley {
77952650505SPaul Walmsley 	struct omap_clk *c;
78052650505SPaul Walmsley 	int crystal_type = 0; /* Default 12 MHz */
78124ce2705SJanusz Krzysztofik 	u32 reg;
78252650505SPaul Walmsley 
78352650505SPaul Walmsley #ifdef CONFIG_DEBUG_LL
78452650505SPaul Walmsley 	/*
78552650505SPaul Walmsley 	 * Resets some clocks that may be left on from bootloader,
78652650505SPaul Walmsley 	 * but leaves serial clocks on.
78752650505SPaul Walmsley 	 */
78852650505SPaul Walmsley 	omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
78952650505SPaul Walmsley #endif
79052650505SPaul Walmsley 
79152650505SPaul Walmsley 	/* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */
79252650505SPaul Walmsley 	reg = omap_readw(SOFT_REQ_REG) & (1 << 4);
79352650505SPaul Walmsley 	omap_writew(reg, SOFT_REQ_REG);
79452650505SPaul Walmsley 	if (!cpu_is_omap15xx())
79552650505SPaul Walmsley 		omap_writew(0, SOFT_REQ_REG2);
79652650505SPaul Walmsley 
79752650505SPaul Walmsley 	/* By default all idlect1 clocks are allowed to idle */
79852650505SPaul Walmsley 	arm_idlect1_mask = ~0;
79952650505SPaul Walmsley 
80052650505SPaul Walmsley 	for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
80152650505SPaul Walmsley 		clk_preinit(c->lk.clk);
80252650505SPaul Walmsley 
80352650505SPaul Walmsley 	cpu_mask = 0;
80424ce2705SJanusz Krzysztofik 	if (cpu_is_omap1710())
80524ce2705SJanusz Krzysztofik 		cpu_mask |= CK_1710;
80652650505SPaul Walmsley 	if (cpu_is_omap16xx())
80752650505SPaul Walmsley 		cpu_mask |= CK_16XX;
80852650505SPaul Walmsley 	if (cpu_is_omap1510())
80952650505SPaul Walmsley 		cpu_mask |= CK_1510;
81052650505SPaul Walmsley 	if (cpu_is_omap7xx())
81152650505SPaul Walmsley 		cpu_mask |= CK_7XX;
81252650505SPaul Walmsley 	if (cpu_is_omap310())
81352650505SPaul Walmsley 		cpu_mask |= CK_310;
81452650505SPaul Walmsley 
81552650505SPaul Walmsley 	for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
81652650505SPaul Walmsley 		if (c->cpu & cpu_mask) {
81752650505SPaul Walmsley 			clkdev_add(&c->lk);
81852650505SPaul Walmsley 			clk_register(c->lk.clk);
81952650505SPaul Walmsley 		}
82052650505SPaul Walmsley 
82152650505SPaul Walmsley 	/* Pointers to these clocks are needed by code in clock.c */
82252650505SPaul Walmsley 	api_ck_p = clk_get(NULL, "api_ck");
82352650505SPaul Walmsley 	ck_dpll1_p = clk_get(NULL, "ck_dpll1");
82452650505SPaul Walmsley 	ck_ref_p = clk_get(NULL, "ck_ref");
82552650505SPaul Walmsley 
82665ae65c9SJanusz Krzysztofik 	if (cpu_is_omap7xx())
82752650505SPaul Walmsley 		ck_ref.rate = 13000000;
82865ae65c9SJanusz Krzysztofik 	if (cpu_is_omap16xx() && crystal_type == 2)
82952650505SPaul Walmsley 		ck_ref.rate = 19200000;
83052650505SPaul Walmsley 
8317852ec05SPaul Walmsley 	pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
8327852ec05SPaul Walmsley 		omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
83352650505SPaul Walmsley 		omap_readw(ARM_CKCTL));
83452650505SPaul Walmsley 
83552650505SPaul Walmsley 	/* We want to be in syncronous scalable mode */
83652650505SPaul Walmsley 	omap_writew(0x1000, ARM_SYSST);
83752650505SPaul Walmsley 
838e9b7086bSTony Lindgren 
839e9b7086bSTony Lindgren 	/*
840e9b7086bSTony Lindgren 	 * Initially use the values set by bootloader. Determine PLL rate and
841e9b7086bSTony Lindgren 	 * recalculate dependent clocks as if kernel had changed PLL or
842e9b7086bSTony Lindgren 	 * divisors. See also omap1_clk_late_init() that can reprogram dpll1
843e9b7086bSTony Lindgren 	 * after the SRAM is initialized.
84452650505SPaul Walmsley 	 */
84552650505SPaul Walmsley 	{
84652650505SPaul Walmsley 		unsigned pll_ctl_val = omap_readw(DPLL_CTL);
84752650505SPaul Walmsley 
84852650505SPaul Walmsley 		ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */
84952650505SPaul Walmsley 		if (pll_ctl_val & 0x10) {
85052650505SPaul Walmsley 			/* PLL enabled, apply multiplier and divisor */
85152650505SPaul Walmsley 			if (pll_ctl_val & 0xf80)
85252650505SPaul Walmsley 				ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;
85352650505SPaul Walmsley 			ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;
85452650505SPaul Walmsley 		} else {
85552650505SPaul Walmsley 			/* PLL disabled, apply bypass divisor */
85652650505SPaul Walmsley 			switch (pll_ctl_val & 0xc) {
85752650505SPaul Walmsley 			case 0:
85852650505SPaul Walmsley 				break;
85952650505SPaul Walmsley 			case 0x4:
86052650505SPaul Walmsley 				ck_dpll1.rate /= 2;
86152650505SPaul Walmsley 				break;
86252650505SPaul Walmsley 			default:
86352650505SPaul Walmsley 				ck_dpll1.rate /= 4;
86452650505SPaul Walmsley 				break;
86552650505SPaul Walmsley 			}
86652650505SPaul Walmsley 		}
86752650505SPaul Walmsley 	}
86852650505SPaul Walmsley 	propagate_rate(&ck_dpll1);
86952650505SPaul Walmsley 	/* Cache rates for clocks connected to ck_ref (not dpll1) */
87052650505SPaul Walmsley 	propagate_rate(&ck_ref);
871e9b7086bSTony Lindgren 	omap1_show_rates();
87265ae65c9SJanusz Krzysztofik 	if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
87352650505SPaul Walmsley 		/* Select slicer output as OMAP input clock */
87465ae65c9SJanusz Krzysztofik 		omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1,
87565ae65c9SJanusz Krzysztofik 				OMAP7XX_PCC_UPLD_CTRL);
87665ae65c9SJanusz Krzysztofik 	}
87752650505SPaul Walmsley 
87852650505SPaul Walmsley 	/* Amstrad Delta wants BCLK high when inactive */
87952650505SPaul Walmsley 	if (machine_is_ams_delta())
88052650505SPaul Walmsley 		omap_writel(omap_readl(ULPD_CLOCK_CTRL) |
88152650505SPaul Walmsley 				(1 << SDW_MCLK_INV_BIT),
88252650505SPaul Walmsley 				ULPD_CLOCK_CTRL);
88352650505SPaul Walmsley 
88452650505SPaul Walmsley 	/* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */
88552650505SPaul Walmsley 	/* (on 730, bit 13 must not be cleared) */
88652650505SPaul Walmsley 	if (cpu_is_omap7xx())
88752650505SPaul Walmsley 		omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL);
88852650505SPaul Walmsley 	else
88952650505SPaul Walmsley 		omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);
89052650505SPaul Walmsley 
89152650505SPaul Walmsley 	/* Put DSP/MPUI into reset until needed */
89252650505SPaul Walmsley 	omap_writew(0, ARM_RSTCT1);
89352650505SPaul Walmsley 	omap_writew(1, ARM_RSTCT2);
89452650505SPaul Walmsley 	omap_writew(0x400, ARM_IDLECT1);
89552650505SPaul Walmsley 
89652650505SPaul Walmsley 	/*
89752650505SPaul Walmsley 	 * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
89852650505SPaul Walmsley 	 * of the ARM_IDLECT2 register must be set to zero. The power-on
89952650505SPaul Walmsley 	 * default value of this bit is one.
90052650505SPaul Walmsley 	 */
90152650505SPaul Walmsley 	omap_writew(0x0000, ARM_IDLECT2);	/* Turn LCD clock off also */
90252650505SPaul Walmsley 
90352650505SPaul Walmsley 	/*
90452650505SPaul Walmsley 	 * Only enable those clocks we will need, let the drivers
90552650505SPaul Walmsley 	 * enable other clocks as necessary
90652650505SPaul Walmsley 	 */
90752650505SPaul Walmsley 	clk_enable(&armper_ck.clk);
90852650505SPaul Walmsley 	clk_enable(&armxor_ck.clk);
90952650505SPaul Walmsley 	clk_enable(&armtim_ck.clk); /* This should be done by timer code */
91052650505SPaul Walmsley 
91152650505SPaul Walmsley 	if (cpu_is_omap15xx())
91252650505SPaul Walmsley 		clk_enable(&arm_gpio_ck);
91352650505SPaul Walmsley 
91452650505SPaul Walmsley 	return 0;
91552650505SPaul Walmsley }
916e9b7086bSTony Lindgren 
917e9b7086bSTony Lindgren #define OMAP1_DPLL1_SANE_VALUE	60000000
918e9b7086bSTony Lindgren 
919e9b7086bSTony Lindgren void __init omap1_clk_late_init(void)
920e9b7086bSTony Lindgren {
9216560ee07SJanusz Krzysztofik 	unsigned long rate = ck_dpll1.rate;
9226560ee07SJanusz Krzysztofik 
923e9b7086bSTony Lindgren 	/* Find the highest supported frequency and enable it */
924e9b7086bSTony Lindgren 	if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
925e9b7086bSTony Lindgren 		pr_err("System frequencies not set, using default. Check your config.\n");
926f9e5908fSJanusz Krzysztofik 		/*
927f9e5908fSJanusz Krzysztofik 		 * Reprogramming the DPLL is tricky, it must be done from SRAM.
928f9e5908fSJanusz Krzysztofik 		 */
929f9e5908fSJanusz Krzysztofik 		omap_sram_reprogram_clock(0x2290, 0x0005);
930e9b7086bSTony Lindgren 		ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE;
931e9b7086bSTony Lindgren 	}
932e9b7086bSTony Lindgren 	propagate_rate(&ck_dpll1);
933e9b7086bSTony Lindgren 	omap1_show_rates();
9346560ee07SJanusz Krzysztofik 	loops_per_jiffy = cpufreq_scale(loops_per_jiffy, rate, ck_dpll1.rate);
935e9b7086bSTony Lindgren }
936