xref: /linux/arch/arm/mach-omap1/clock_data.c (revision 77640aabd7558e43b65bc1a0311be2dbb42c3ff8)
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>
1852650505SPaul Walmsley #include <linux/clk.h>
1952650505SPaul Walmsley #include <linux/io.h>
2052650505SPaul Walmsley 
2152650505SPaul Walmsley #include <asm/mach-types.h>  /* for machine_is_* */
2252650505SPaul Walmsley 
2352650505SPaul Walmsley #include <plat/clock.h>
2452650505SPaul Walmsley #include <plat/cpu.h>
2552650505SPaul Walmsley #include <plat/clkdev_omap.h>
2652650505SPaul Walmsley #include <plat/usb.h>   /* for OTG_BASE */
2752650505SPaul Walmsley 
2852650505SPaul Walmsley #include "clock.h"
2952650505SPaul Walmsley 
30fb2fc920SPaul Walmsley /* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */
31fb2fc920SPaul Walmsley #define IDL_CLKOUT_ARM_SHIFT			12
32fb2fc920SPaul Walmsley #define IDLTIM_ARM_SHIFT			9
33fb2fc920SPaul Walmsley #define IDLAPI_ARM_SHIFT			8
34fb2fc920SPaul Walmsley #define IDLIF_ARM_SHIFT				6
35fb2fc920SPaul Walmsley #define IDLLB_ARM_SHIFT				4	/* undocumented? */
36fb2fc920SPaul Walmsley #define OMAP1510_IDLLCD_ARM_SHIFT		3	/* undocumented? */
37fb2fc920SPaul Walmsley #define IDLPER_ARM_SHIFT			2
38fb2fc920SPaul Walmsley #define IDLXORP_ARM_SHIFT			1
39fb2fc920SPaul Walmsley #define IDLWDT_ARM_SHIFT			0
40fb2fc920SPaul Walmsley 
41fb2fc920SPaul Walmsley /* Some MOD_CONF_CTRL_0 bit shifts - used in struct clk.enable_bit */
42fb2fc920SPaul Walmsley #define CONF_MOD_UART3_CLK_MODE_R		31
43fb2fc920SPaul Walmsley #define CONF_MOD_UART2_CLK_MODE_R		30
44fb2fc920SPaul Walmsley #define CONF_MOD_UART1_CLK_MODE_R		29
45fb2fc920SPaul Walmsley #define CONF_MOD_MMC_SD_CLK_REQ_R		23
46fb2fc920SPaul Walmsley #define CONF_MOD_MCBSP3_AUXON			20
47fb2fc920SPaul Walmsley 
48fb2fc920SPaul Walmsley /* Some MOD_CONF_CTRL_1 bit shifts - used in struct clk.enable_bit */
49fb2fc920SPaul Walmsley #define CONF_MOD_SOSSI_CLK_EN_R			16
50fb2fc920SPaul Walmsley 
51fb2fc920SPaul Walmsley /* Some OTG_SYSCON_2-specific bit fields */
52fb2fc920SPaul Walmsley #define OTG_SYSCON_2_UHOST_EN_SHIFT		8
53fb2fc920SPaul Walmsley 
54fb2fc920SPaul Walmsley /* Some SOFT_REQ_REG bit fields - used in struct clk.enable_bit */
55fb2fc920SPaul Walmsley #define SOFT_MMC2_DPLL_REQ_SHIFT	13
56fb2fc920SPaul Walmsley #define SOFT_MMC_DPLL_REQ_SHIFT		12
57fb2fc920SPaul Walmsley #define SOFT_UART3_DPLL_REQ_SHIFT	11
58fb2fc920SPaul Walmsley #define SOFT_UART2_DPLL_REQ_SHIFT	10
59fb2fc920SPaul Walmsley #define SOFT_UART1_DPLL_REQ_SHIFT	9
60fb2fc920SPaul Walmsley #define SOFT_USB_OTG_DPLL_REQ_SHIFT	8
61fb2fc920SPaul Walmsley #define SOFT_CAM_DPLL_REQ_SHIFT		7
62fb2fc920SPaul Walmsley #define SOFT_COM_MCKO_REQ_SHIFT		6
63fb2fc920SPaul Walmsley #define SOFT_PERIPH_REQ_SHIFT		5	/* sys_ck gate for UART2 ? */
64fb2fc920SPaul Walmsley #define USB_REQ_EN_SHIFT		4
65fb2fc920SPaul Walmsley #define SOFT_USB_REQ_SHIFT		3	/* sys_ck gate for USB host? */
66fb2fc920SPaul Walmsley #define SOFT_SDW_REQ_SHIFT		2	/* sys_ck gate for Bluetooth? */
67fb2fc920SPaul Walmsley #define SOFT_COM_REQ_SHIFT		1	/* sys_ck gate for com proc? */
68fb2fc920SPaul Walmsley #define SOFT_DPLL_REQ_SHIFT		0
69fb2fc920SPaul Walmsley 
70fb2fc920SPaul Walmsley /*
7152650505SPaul Walmsley  * Omap1 clocks
72fb2fc920SPaul Walmsley  */
7352650505SPaul Walmsley 
7452650505SPaul Walmsley static struct clk ck_ref = {
7552650505SPaul Walmsley 	.name		= "ck_ref",
7652650505SPaul Walmsley 	.ops		= &clkops_null,
7752650505SPaul Walmsley 	.rate		= 12000000,
7852650505SPaul Walmsley };
7952650505SPaul Walmsley 
8052650505SPaul Walmsley static struct clk ck_dpll1 = {
8152650505SPaul Walmsley 	.name		= "ck_dpll1",
8252650505SPaul Walmsley 	.ops		= &clkops_null,
8352650505SPaul Walmsley 	.parent		= &ck_ref,
8452650505SPaul Walmsley };
8552650505SPaul Walmsley 
8652650505SPaul Walmsley /*
8752650505SPaul Walmsley  * FIXME: This clock seems to be necessary but no-one has asked for its
8852650505SPaul Walmsley  * activation.  [ FIX: SoSSI, SSR ]
8952650505SPaul Walmsley  */
9052650505SPaul Walmsley static struct arm_idlect1_clk ck_dpll1out = {
9152650505SPaul Walmsley 	.clk = {
9252650505SPaul Walmsley 		.name		= "ck_dpll1out",
9352650505SPaul Walmsley 		.ops		= &clkops_generic,
9452650505SPaul Walmsley 		.parent		= &ck_dpll1,
9552650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL | ENABLE_REG_32BIT |
9652650505SPaul Walmsley 				  ENABLE_ON_INIT,
9752650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
9852650505SPaul Walmsley 		.enable_bit	= EN_CKOUT_ARM,
9952650505SPaul Walmsley 		.recalc		= &followparent_recalc,
10052650505SPaul Walmsley 	},
101fb2fc920SPaul Walmsley 	.idlect_shift	= IDL_CLKOUT_ARM_SHIFT,
10252650505SPaul Walmsley };
10352650505SPaul Walmsley 
10452650505SPaul Walmsley static struct clk sossi_ck = {
10552650505SPaul Walmsley 	.name		= "ck_sossi",
10652650505SPaul Walmsley 	.ops		= &clkops_generic,
10752650505SPaul Walmsley 	.parent		= &ck_dpll1out.clk,
10852650505SPaul Walmsley 	.flags		= CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT,
10952650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1),
110fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_SOSSI_CLK_EN_R,
11152650505SPaul Walmsley 	.recalc		= &omap1_sossi_recalc,
11252650505SPaul Walmsley 	.set_rate	= &omap1_set_sossi_rate,
11352650505SPaul Walmsley };
11452650505SPaul Walmsley 
11552650505SPaul Walmsley static struct clk arm_ck = {
11652650505SPaul Walmsley 	.name		= "arm_ck",
11752650505SPaul Walmsley 	.ops		= &clkops_null,
11852650505SPaul Walmsley 	.parent		= &ck_dpll1,
11952650505SPaul Walmsley 	.rate_offset	= CKCTL_ARMDIV_OFFSET,
12052650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
12152650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
12252650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
12352650505SPaul Walmsley };
12452650505SPaul Walmsley 
12552650505SPaul Walmsley static struct arm_idlect1_clk armper_ck = {
12652650505SPaul Walmsley 	.clk = {
12752650505SPaul Walmsley 		.name		= "armper_ck",
12852650505SPaul Walmsley 		.ops		= &clkops_generic,
12952650505SPaul Walmsley 		.parent		= &ck_dpll1,
13052650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
13152650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
13252650505SPaul Walmsley 		.enable_bit	= EN_PERCK,
13352650505SPaul Walmsley 		.rate_offset	= CKCTL_PERDIV_OFFSET,
13452650505SPaul Walmsley 		.recalc		= &omap1_ckctl_recalc,
13552650505SPaul Walmsley 		.round_rate	= omap1_clk_round_rate_ckctl_arm,
13652650505SPaul Walmsley 		.set_rate	= omap1_clk_set_rate_ckctl_arm,
13752650505SPaul Walmsley 	},
138fb2fc920SPaul Walmsley 	.idlect_shift	= IDLPER_ARM_SHIFT,
13952650505SPaul Walmsley };
14052650505SPaul Walmsley 
14152650505SPaul Walmsley /*
14252650505SPaul Walmsley  * FIXME: This clock seems to be necessary but no-one has asked for its
14352650505SPaul Walmsley  * activation.  [ GPIO code for 1510 ]
14452650505SPaul Walmsley  */
14552650505SPaul Walmsley static struct clk arm_gpio_ck = {
146*77640aabSVaradarajan, Charulatha 	.name		= "ick",
14752650505SPaul Walmsley 	.ops		= &clkops_generic,
14852650505SPaul Walmsley 	.parent		= &ck_dpll1,
14952650505SPaul Walmsley 	.flags		= ENABLE_ON_INIT,
15052650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
15152650505SPaul Walmsley 	.enable_bit	= EN_GPIOCK,
15252650505SPaul Walmsley 	.recalc		= &followparent_recalc,
15352650505SPaul Walmsley };
15452650505SPaul Walmsley 
15552650505SPaul Walmsley static struct arm_idlect1_clk armxor_ck = {
15652650505SPaul Walmsley 	.clk = {
15752650505SPaul Walmsley 		.name		= "armxor_ck",
15852650505SPaul Walmsley 		.ops		= &clkops_generic,
15952650505SPaul Walmsley 		.parent		= &ck_ref,
16052650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
16152650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
16252650505SPaul Walmsley 		.enable_bit	= EN_XORPCK,
16352650505SPaul Walmsley 		.recalc		= &followparent_recalc,
16452650505SPaul Walmsley 	},
165fb2fc920SPaul Walmsley 	.idlect_shift	= IDLXORP_ARM_SHIFT,
16652650505SPaul Walmsley };
16752650505SPaul Walmsley 
16852650505SPaul Walmsley static struct arm_idlect1_clk armtim_ck = {
16952650505SPaul Walmsley 	.clk = {
17052650505SPaul Walmsley 		.name		= "armtim_ck",
17152650505SPaul Walmsley 		.ops		= &clkops_generic,
17252650505SPaul Walmsley 		.parent		= &ck_ref,
17352650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
17452650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
17552650505SPaul Walmsley 		.enable_bit	= EN_TIMCK,
17652650505SPaul Walmsley 		.recalc		= &followparent_recalc,
17752650505SPaul Walmsley 	},
178fb2fc920SPaul Walmsley 	.idlect_shift	= IDLTIM_ARM_SHIFT,
17952650505SPaul Walmsley };
18052650505SPaul Walmsley 
18152650505SPaul Walmsley static struct arm_idlect1_clk armwdt_ck = {
18252650505SPaul Walmsley 	.clk = {
18352650505SPaul Walmsley 		.name		= "armwdt_ck",
18452650505SPaul Walmsley 		.ops		= &clkops_generic,
18552650505SPaul Walmsley 		.parent		= &ck_ref,
18652650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
18752650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
18852650505SPaul Walmsley 		.enable_bit	= EN_WDTCK,
1890dfc242fSPaul Walmsley 		.fixed_div	= 14,
1900dfc242fSPaul Walmsley 		.recalc		= &omap_fixed_divisor_recalc,
19152650505SPaul Walmsley 	},
192fb2fc920SPaul Walmsley 	.idlect_shift	= IDLWDT_ARM_SHIFT,
19352650505SPaul Walmsley };
19452650505SPaul Walmsley 
19552650505SPaul Walmsley static struct clk arminth_ck16xx = {
19652650505SPaul Walmsley 	.name		= "arminth_ck",
19752650505SPaul Walmsley 	.ops		= &clkops_null,
19852650505SPaul Walmsley 	.parent		= &arm_ck,
19952650505SPaul Walmsley 	.recalc		= &followparent_recalc,
20052650505SPaul Walmsley 	/* Note: On 16xx the frequency can be divided by 2 by programming
20152650505SPaul Walmsley 	 * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
20252650505SPaul Walmsley 	 *
20352650505SPaul Walmsley 	 * 1510 version is in TC clocks.
20452650505SPaul Walmsley 	 */
20552650505SPaul Walmsley };
20652650505SPaul Walmsley 
20752650505SPaul Walmsley static struct clk dsp_ck = {
20852650505SPaul Walmsley 	.name		= "dsp_ck",
20952650505SPaul Walmsley 	.ops		= &clkops_generic,
21052650505SPaul Walmsley 	.parent		= &ck_dpll1,
21152650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_CKCTL),
21252650505SPaul Walmsley 	.enable_bit	= EN_DSPCK,
21352650505SPaul Walmsley 	.rate_offset	= CKCTL_DSPDIV_OFFSET,
21452650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
21552650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
21652650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
21752650505SPaul Walmsley };
21852650505SPaul Walmsley 
21952650505SPaul Walmsley static struct clk dspmmu_ck = {
22052650505SPaul Walmsley 	.name		= "dspmmu_ck",
22152650505SPaul Walmsley 	.ops		= &clkops_null,
22252650505SPaul Walmsley 	.parent		= &ck_dpll1,
22352650505SPaul Walmsley 	.rate_offset	= CKCTL_DSPMMUDIV_OFFSET,
22452650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
22552650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
22652650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
22752650505SPaul Walmsley };
22852650505SPaul Walmsley 
22952650505SPaul Walmsley static struct clk dspper_ck = {
23052650505SPaul Walmsley 	.name		= "dspper_ck",
23152650505SPaul Walmsley 	.ops		= &clkops_dspck,
23252650505SPaul Walmsley 	.parent		= &ck_dpll1,
23352650505SPaul Walmsley 	.enable_reg	= DSP_IDLECT2,
23452650505SPaul Walmsley 	.enable_bit	= EN_PERCK,
23552650505SPaul Walmsley 	.rate_offset	= CKCTL_PERDIV_OFFSET,
23652650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc_dsp_domain,
23752650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
23852650505SPaul Walmsley 	.set_rate	= &omap1_clk_set_rate_dsp_domain,
23952650505SPaul Walmsley };
24052650505SPaul Walmsley 
24152650505SPaul Walmsley static struct clk dspxor_ck = {
24252650505SPaul Walmsley 	.name		= "dspxor_ck",
24352650505SPaul Walmsley 	.ops		= &clkops_dspck,
24452650505SPaul Walmsley 	.parent		= &ck_ref,
24552650505SPaul Walmsley 	.enable_reg	= DSP_IDLECT2,
24652650505SPaul Walmsley 	.enable_bit	= EN_XORPCK,
24752650505SPaul Walmsley 	.recalc		= &followparent_recalc,
24852650505SPaul Walmsley };
24952650505SPaul Walmsley 
25052650505SPaul Walmsley static struct clk dsptim_ck = {
25152650505SPaul Walmsley 	.name		= "dsptim_ck",
25252650505SPaul Walmsley 	.ops		= &clkops_dspck,
25352650505SPaul Walmsley 	.parent		= &ck_ref,
25452650505SPaul Walmsley 	.enable_reg	= DSP_IDLECT2,
25552650505SPaul Walmsley 	.enable_bit	= EN_DSPTIMCK,
25652650505SPaul Walmsley 	.recalc		= &followparent_recalc,
25752650505SPaul Walmsley };
25852650505SPaul Walmsley 
25952650505SPaul Walmsley static struct arm_idlect1_clk tc_ck = {
26052650505SPaul Walmsley 	.clk = {
26152650505SPaul Walmsley 		.name		= "tc_ck",
26252650505SPaul Walmsley 		.ops		= &clkops_null,
26352650505SPaul Walmsley 		.parent		= &ck_dpll1,
26452650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
26552650505SPaul Walmsley 		.rate_offset	= CKCTL_TCDIV_OFFSET,
26652650505SPaul Walmsley 		.recalc		= &omap1_ckctl_recalc,
26752650505SPaul Walmsley 		.round_rate	= omap1_clk_round_rate_ckctl_arm,
26852650505SPaul Walmsley 		.set_rate	= omap1_clk_set_rate_ckctl_arm,
26952650505SPaul Walmsley 	},
270fb2fc920SPaul Walmsley 	.idlect_shift	= IDLIF_ARM_SHIFT,
27152650505SPaul Walmsley };
27252650505SPaul Walmsley 
27352650505SPaul Walmsley static struct clk arminth_ck1510 = {
27452650505SPaul Walmsley 	.name		= "arminth_ck",
27552650505SPaul Walmsley 	.ops		= &clkops_null,
27652650505SPaul Walmsley 	.parent		= &tc_ck.clk,
27752650505SPaul Walmsley 	.recalc		= &followparent_recalc,
27852650505SPaul Walmsley 	/* Note: On 1510 the frequency follows TC_CK
27952650505SPaul Walmsley 	 *
28052650505SPaul Walmsley 	 * 16xx version is in MPU clocks.
28152650505SPaul Walmsley 	 */
28252650505SPaul Walmsley };
28352650505SPaul Walmsley 
28452650505SPaul Walmsley static struct clk tipb_ck = {
28552650505SPaul Walmsley 	/* No-idle controlled by "tc_ck" */
28652650505SPaul Walmsley 	.name		= "tipb_ck",
28752650505SPaul Walmsley 	.ops		= &clkops_null,
28852650505SPaul Walmsley 	.parent		= &tc_ck.clk,
28952650505SPaul Walmsley 	.recalc		= &followparent_recalc,
29052650505SPaul Walmsley };
29152650505SPaul Walmsley 
29252650505SPaul Walmsley static struct clk l3_ocpi_ck = {
29352650505SPaul Walmsley 	/* No-idle controlled by "tc_ck" */
29452650505SPaul Walmsley 	.name		= "l3_ocpi_ck",
29552650505SPaul Walmsley 	.ops		= &clkops_generic,
29652650505SPaul Walmsley 	.parent		= &tc_ck.clk,
29752650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT3),
29852650505SPaul Walmsley 	.enable_bit	= EN_OCPI_CK,
29952650505SPaul Walmsley 	.recalc		= &followparent_recalc,
30052650505SPaul Walmsley };
30152650505SPaul Walmsley 
30252650505SPaul Walmsley static struct clk tc1_ck = {
30352650505SPaul Walmsley 	.name		= "tc1_ck",
30452650505SPaul Walmsley 	.ops		= &clkops_generic,
30552650505SPaul Walmsley 	.parent		= &tc_ck.clk,
30652650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT3),
30752650505SPaul Walmsley 	.enable_bit	= EN_TC1_CK,
30852650505SPaul Walmsley 	.recalc		= &followparent_recalc,
30952650505SPaul Walmsley };
31052650505SPaul Walmsley 
31152650505SPaul Walmsley /*
31252650505SPaul Walmsley  * FIXME: This clock seems to be necessary but no-one has asked for its
31352650505SPaul Walmsley  * activation.  [ pm.c (SRAM), CCP, Camera ]
31452650505SPaul Walmsley  */
31552650505SPaul Walmsley static struct clk tc2_ck = {
31652650505SPaul Walmsley 	.name		= "tc2_ck",
31752650505SPaul Walmsley 	.ops		= &clkops_generic,
31852650505SPaul Walmsley 	.parent		= &tc_ck.clk,
31952650505SPaul Walmsley 	.flags		= ENABLE_ON_INIT,
32052650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT3),
32152650505SPaul Walmsley 	.enable_bit	= EN_TC2_CK,
32252650505SPaul Walmsley 	.recalc		= &followparent_recalc,
32352650505SPaul Walmsley };
32452650505SPaul Walmsley 
32552650505SPaul Walmsley static struct clk dma_ck = {
32652650505SPaul Walmsley 	/* No-idle controlled by "tc_ck" */
32752650505SPaul Walmsley 	.name		= "dma_ck",
32852650505SPaul Walmsley 	.ops		= &clkops_null,
32952650505SPaul Walmsley 	.parent		= &tc_ck.clk,
33052650505SPaul Walmsley 	.recalc		= &followparent_recalc,
33152650505SPaul Walmsley };
33252650505SPaul Walmsley 
33352650505SPaul Walmsley static struct clk dma_lcdfree_ck = {
33452650505SPaul Walmsley 	.name		= "dma_lcdfree_ck",
33552650505SPaul Walmsley 	.ops		= &clkops_null,
33652650505SPaul Walmsley 	.parent		= &tc_ck.clk,
33752650505SPaul Walmsley 	.recalc		= &followparent_recalc,
33852650505SPaul Walmsley };
33952650505SPaul Walmsley 
34052650505SPaul Walmsley static struct arm_idlect1_clk api_ck = {
34152650505SPaul Walmsley 	.clk = {
34252650505SPaul Walmsley 		.name		= "api_ck",
34352650505SPaul Walmsley 		.ops		= &clkops_generic,
34452650505SPaul Walmsley 		.parent		= &tc_ck.clk,
34552650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
34652650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
34752650505SPaul Walmsley 		.enable_bit	= EN_APICK,
34852650505SPaul Walmsley 		.recalc		= &followparent_recalc,
34952650505SPaul Walmsley 	},
350fb2fc920SPaul Walmsley 	.idlect_shift	= IDLAPI_ARM_SHIFT,
35152650505SPaul Walmsley };
35252650505SPaul Walmsley 
35352650505SPaul Walmsley static struct arm_idlect1_clk lb_ck = {
35452650505SPaul Walmsley 	.clk = {
35552650505SPaul Walmsley 		.name		= "lb_ck",
35652650505SPaul Walmsley 		.ops		= &clkops_generic,
35752650505SPaul Walmsley 		.parent		= &tc_ck.clk,
35852650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
35952650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
36052650505SPaul Walmsley 		.enable_bit	= EN_LBCK,
36152650505SPaul Walmsley 		.recalc		= &followparent_recalc,
36252650505SPaul Walmsley 	},
363fb2fc920SPaul Walmsley 	.idlect_shift	= IDLLB_ARM_SHIFT,
36452650505SPaul Walmsley };
36552650505SPaul Walmsley 
36652650505SPaul Walmsley static struct clk rhea1_ck = {
36752650505SPaul Walmsley 	.name		= "rhea1_ck",
36852650505SPaul Walmsley 	.ops		= &clkops_null,
36952650505SPaul Walmsley 	.parent		= &tc_ck.clk,
37052650505SPaul Walmsley 	.recalc		= &followparent_recalc,
37152650505SPaul Walmsley };
37252650505SPaul Walmsley 
37352650505SPaul Walmsley static struct clk rhea2_ck = {
37452650505SPaul Walmsley 	.name		= "rhea2_ck",
37552650505SPaul Walmsley 	.ops		= &clkops_null,
37652650505SPaul Walmsley 	.parent		= &tc_ck.clk,
37752650505SPaul Walmsley 	.recalc		= &followparent_recalc,
37852650505SPaul Walmsley };
37952650505SPaul Walmsley 
38052650505SPaul Walmsley static struct clk lcd_ck_16xx = {
38152650505SPaul Walmsley 	.name		= "lcd_ck",
38252650505SPaul Walmsley 	.ops		= &clkops_generic,
38352650505SPaul Walmsley 	.parent		= &ck_dpll1,
38452650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
38552650505SPaul Walmsley 	.enable_bit	= EN_LCDCK,
38652650505SPaul Walmsley 	.rate_offset	= CKCTL_LCDDIV_OFFSET,
38752650505SPaul Walmsley 	.recalc		= &omap1_ckctl_recalc,
38852650505SPaul Walmsley 	.round_rate	= omap1_clk_round_rate_ckctl_arm,
38952650505SPaul Walmsley 	.set_rate	= omap1_clk_set_rate_ckctl_arm,
39052650505SPaul Walmsley };
39152650505SPaul Walmsley 
39252650505SPaul Walmsley static struct arm_idlect1_clk lcd_ck_1510 = {
39352650505SPaul Walmsley 	.clk = {
39452650505SPaul Walmsley 		.name		= "lcd_ck",
39552650505SPaul Walmsley 		.ops		= &clkops_generic,
39652650505SPaul Walmsley 		.parent		= &ck_dpll1,
39752650505SPaul Walmsley 		.flags		= CLOCK_IDLE_CONTROL,
39852650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(ARM_IDLECT2),
39952650505SPaul Walmsley 		.enable_bit	= EN_LCDCK,
40052650505SPaul Walmsley 		.rate_offset	= CKCTL_LCDDIV_OFFSET,
40152650505SPaul Walmsley 		.recalc		= &omap1_ckctl_recalc,
40252650505SPaul Walmsley 		.round_rate	= omap1_clk_round_rate_ckctl_arm,
40352650505SPaul Walmsley 		.set_rate	= omap1_clk_set_rate_ckctl_arm,
40452650505SPaul Walmsley 	},
405fb2fc920SPaul Walmsley 	.idlect_shift	= OMAP1510_IDLLCD_ARM_SHIFT,
40652650505SPaul Walmsley };
40752650505SPaul Walmsley 
408fb2fc920SPaul Walmsley /*
409fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
410fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
411fb2fc920SPaul Walmsley  *
412fb2fc920SPaul Walmsley  * XXX does this need SYSC register handling?
413fb2fc920SPaul Walmsley  */
41452650505SPaul Walmsley static struct clk uart1_1510 = {
41552650505SPaul Walmsley 	.name		= "uart1_ck",
41652650505SPaul Walmsley 	.ops		= &clkops_null,
41752650505SPaul Walmsley 	/* Direct from ULPD, no real parent */
41852650505SPaul Walmsley 	.parent		= &armper_ck.clk,
41952650505SPaul Walmsley 	.rate		= 12000000,
42052650505SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
42152650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
422fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_UART1_CLK_MODE_R,
42352650505SPaul Walmsley 	.set_rate	= &omap1_set_uart_rate,
42452650505SPaul Walmsley 	.recalc		= &omap1_uart_recalc,
42552650505SPaul Walmsley };
42652650505SPaul Walmsley 
427fb2fc920SPaul Walmsley /*
428fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
429fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
430fb2fc920SPaul Walmsley  *
431fb2fc920SPaul Walmsley  * XXX SYSC register handling does not belong in the clock framework
432fb2fc920SPaul Walmsley  */
43352650505SPaul Walmsley static struct uart_clk uart1_16xx = {
43452650505SPaul Walmsley 	.clk	= {
43552650505SPaul Walmsley 		.name		= "uart1_ck",
436fb2fc920SPaul Walmsley 		.ops		= &clkops_uart_16xx,
43752650505SPaul Walmsley 		/* Direct from ULPD, no real parent */
43852650505SPaul Walmsley 		.parent		= &armper_ck.clk,
43952650505SPaul Walmsley 		.rate		= 48000000,
44051c19541SPaul Walmsley 		.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
44152650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
442fb2fc920SPaul Walmsley 		.enable_bit	= CONF_MOD_UART1_CLK_MODE_R,
44352650505SPaul Walmsley 	},
44452650505SPaul Walmsley 	.sysc_addr	= 0xfffb0054,
44552650505SPaul Walmsley };
44652650505SPaul Walmsley 
447fb2fc920SPaul Walmsley /*
448fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
449fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
450fb2fc920SPaul Walmsley  *
451fb2fc920SPaul Walmsley  * XXX does this need SYSC register handling?
452fb2fc920SPaul Walmsley  */
45352650505SPaul Walmsley static struct clk uart2_ck = {
45452650505SPaul Walmsley 	.name		= "uart2_ck",
45552650505SPaul Walmsley 	.ops		= &clkops_null,
45652650505SPaul Walmsley 	/* Direct from ULPD, no real parent */
45752650505SPaul Walmsley 	.parent		= &armper_ck.clk,
45852650505SPaul Walmsley 	.rate		= 12000000,
45952650505SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
46052650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
461fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_UART2_CLK_MODE_R,
46252650505SPaul Walmsley 	.set_rate	= &omap1_set_uart_rate,
46352650505SPaul Walmsley 	.recalc		= &omap1_uart_recalc,
46452650505SPaul Walmsley };
46552650505SPaul Walmsley 
466fb2fc920SPaul Walmsley /*
467fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
468fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
469fb2fc920SPaul Walmsley  *
470fb2fc920SPaul Walmsley  * XXX does this need SYSC register handling?
471fb2fc920SPaul Walmsley  */
47252650505SPaul Walmsley static struct clk uart3_1510 = {
47352650505SPaul Walmsley 	.name		= "uart3_ck",
47452650505SPaul Walmsley 	.ops		= &clkops_null,
47552650505SPaul Walmsley 	/* Direct from ULPD, no real parent */
47652650505SPaul Walmsley 	.parent		= &armper_ck.clk,
47752650505SPaul Walmsley 	.rate		= 12000000,
47852650505SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
47952650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
480fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_UART3_CLK_MODE_R,
48152650505SPaul Walmsley 	.set_rate	= &omap1_set_uart_rate,
48252650505SPaul Walmsley 	.recalc		= &omap1_uart_recalc,
48352650505SPaul Walmsley };
48452650505SPaul Walmsley 
485fb2fc920SPaul Walmsley /*
486fb2fc920SPaul Walmsley  * XXX The enable_bit here is misused - it simply switches between 12MHz
487fb2fc920SPaul Walmsley  * and 48MHz.  Reimplement with clksel.
488fb2fc920SPaul Walmsley  *
489fb2fc920SPaul Walmsley  * XXX SYSC register handling does not belong in the clock framework
490fb2fc920SPaul Walmsley  */
49152650505SPaul Walmsley static struct uart_clk uart3_16xx = {
49252650505SPaul Walmsley 	.clk	= {
49352650505SPaul Walmsley 		.name		= "uart3_ck",
494fb2fc920SPaul Walmsley 		.ops		= &clkops_uart_16xx,
49552650505SPaul Walmsley 		/* Direct from ULPD, no real parent */
49652650505SPaul Walmsley 		.parent		= &armper_ck.clk,
49752650505SPaul Walmsley 		.rate		= 48000000,
49851c19541SPaul Walmsley 		.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
49952650505SPaul Walmsley 		.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
500fb2fc920SPaul Walmsley 		.enable_bit	= CONF_MOD_UART3_CLK_MODE_R,
50152650505SPaul Walmsley 	},
50252650505SPaul Walmsley 	.sysc_addr	= 0xfffb9854,
50352650505SPaul Walmsley };
50452650505SPaul Walmsley 
50552650505SPaul Walmsley static struct clk usb_clko = {	/* 6 MHz output on W4_USB_CLKO */
50652650505SPaul Walmsley 	.name		= "usb_clko",
50752650505SPaul Walmsley 	.ops		= &clkops_generic,
50852650505SPaul Walmsley 	/* Direct from ULPD, no parent */
50952650505SPaul Walmsley 	.rate		= 6000000,
51051c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT,
51152650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(ULPD_CLOCK_CTRL),
51252650505SPaul Walmsley 	.enable_bit	= USB_MCLK_EN_BIT,
51352650505SPaul Walmsley };
51452650505SPaul Walmsley 
51552650505SPaul Walmsley static struct clk usb_hhc_ck1510 = {
51652650505SPaul Walmsley 	.name		= "usb_hhc_ck",
51752650505SPaul Walmsley 	.ops		= &clkops_generic,
51852650505SPaul Walmsley 	/* Direct from ULPD, no parent */
51952650505SPaul Walmsley 	.rate		= 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
52051c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT,
52152650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
52252650505SPaul Walmsley 	.enable_bit	= USB_HOST_HHC_UHOST_EN,
52352650505SPaul Walmsley };
52452650505SPaul Walmsley 
52552650505SPaul Walmsley static struct clk usb_hhc_ck16xx = {
52652650505SPaul Walmsley 	.name		= "usb_hhc_ck",
52752650505SPaul Walmsley 	.ops		= &clkops_generic,
52852650505SPaul Walmsley 	/* Direct from ULPD, no parent */
52952650505SPaul Walmsley 	.rate		= 48000000,
53052650505SPaul Walmsley 	/* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
53151c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT,
53252650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */
533fb2fc920SPaul Walmsley 	.enable_bit	= OTG_SYSCON_2_UHOST_EN_SHIFT
53452650505SPaul Walmsley };
53552650505SPaul Walmsley 
53652650505SPaul Walmsley static struct clk usb_dc_ck = {
53752650505SPaul Walmsley 	.name		= "usb_dc_ck",
53852650505SPaul Walmsley 	.ops		= &clkops_generic,
53952650505SPaul Walmsley 	/* Direct from ULPD, no parent */
54052650505SPaul Walmsley 	.rate		= 48000000,
54152650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
542fb2fc920SPaul Walmsley 	.enable_bit	= USB_REQ_EN_SHIFT,
54352650505SPaul Walmsley };
54452650505SPaul Walmsley 
54552650505SPaul Walmsley static struct clk usb_dc_ck7xx = {
54652650505SPaul Walmsley 	.name		= "usb_dc_ck",
54752650505SPaul Walmsley 	.ops		= &clkops_generic,
54852650505SPaul Walmsley 	/* Direct from ULPD, no parent */
54952650505SPaul Walmsley 	.rate		= 48000000,
55052650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
551fb2fc920SPaul Walmsley 	.enable_bit	= SOFT_USB_OTG_DPLL_REQ_SHIFT,
55252650505SPaul Walmsley };
55352650505SPaul Walmsley 
5548b8fbd39SCory Maccarrone static struct clk uart1_7xx = {
5558b8fbd39SCory Maccarrone 	.name		= "uart1_ck",
5568b8fbd39SCory Maccarrone 	.ops		= &clkops_generic,
5578b8fbd39SCory Maccarrone 	/* Direct from ULPD, no parent */
5588b8fbd39SCory Maccarrone 	.rate		= 12000000,
5598b8fbd39SCory Maccarrone 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
5608b8fbd39SCory Maccarrone 	.enable_bit	= 9,
5618b8fbd39SCory Maccarrone };
5628b8fbd39SCory Maccarrone 
5638b8fbd39SCory Maccarrone static struct clk uart2_7xx = {
5648b8fbd39SCory Maccarrone 	.name		= "uart2_ck",
5658b8fbd39SCory Maccarrone 	.ops		= &clkops_generic,
5668b8fbd39SCory Maccarrone 	/* Direct from ULPD, no parent */
5678b8fbd39SCory Maccarrone 	.rate		= 12000000,
5688b8fbd39SCory Maccarrone 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
5698b8fbd39SCory Maccarrone 	.enable_bit	= 11,
5708b8fbd39SCory Maccarrone };
5718b8fbd39SCory Maccarrone 
57252650505SPaul Walmsley static struct clk mclk_1510 = {
57352650505SPaul Walmsley 	.name		= "mclk",
57452650505SPaul Walmsley 	.ops		= &clkops_generic,
57552650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
57652650505SPaul Walmsley 	.rate		= 12000000,
57752650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
578fb2fc920SPaul Walmsley 	.enable_bit	= SOFT_COM_MCKO_REQ_SHIFT,
57952650505SPaul Walmsley };
58052650505SPaul Walmsley 
58152650505SPaul Walmsley static struct clk mclk_16xx = {
58252650505SPaul Walmsley 	.name		= "mclk",
58352650505SPaul Walmsley 	.ops		= &clkops_generic,
58452650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
58552650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(COM_CLK_DIV_CTRL_SEL),
58652650505SPaul Walmsley 	.enable_bit	= COM_ULPD_PLL_CLK_REQ,
58752650505SPaul Walmsley 	.set_rate	= &omap1_set_ext_clk_rate,
58852650505SPaul Walmsley 	.round_rate	= &omap1_round_ext_clk_rate,
58952650505SPaul Walmsley 	.init		= &omap1_init_ext_clk,
59052650505SPaul Walmsley };
59152650505SPaul Walmsley 
59252650505SPaul Walmsley static struct clk bclk_1510 = {
59352650505SPaul Walmsley 	.name		= "bclk",
59452650505SPaul Walmsley 	.ops		= &clkops_generic,
59552650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
59652650505SPaul Walmsley 	.rate		= 12000000,
59752650505SPaul Walmsley };
59852650505SPaul Walmsley 
59952650505SPaul Walmsley static struct clk bclk_16xx = {
60052650505SPaul Walmsley 	.name		= "bclk",
60152650505SPaul Walmsley 	.ops		= &clkops_generic,
60252650505SPaul Walmsley 	/* Direct from ULPD, no parent. May be enabled by ext hardware. */
60352650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SWD_CLK_DIV_CTRL_SEL),
60452650505SPaul Walmsley 	.enable_bit	= SWD_ULPD_PLL_CLK_REQ,
60552650505SPaul Walmsley 	.set_rate	= &omap1_set_ext_clk_rate,
60652650505SPaul Walmsley 	.round_rate	= &omap1_round_ext_clk_rate,
60752650505SPaul Walmsley 	.init		= &omap1_init_ext_clk,
60852650505SPaul Walmsley };
60952650505SPaul Walmsley 
61052650505SPaul Walmsley static struct clk mmc1_ck = {
611b92c170dSPaul Walmsley 	.name		= "mmc1_ck",
61252650505SPaul Walmsley 	.ops		= &clkops_generic,
61352650505SPaul Walmsley 	/* Functional clock is direct from ULPD, interface clock is ARMPER */
61452650505SPaul Walmsley 	.parent		= &armper_ck.clk,
61552650505SPaul Walmsley 	.rate		= 48000000,
61651c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
61752650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
618fb2fc920SPaul Walmsley 	.enable_bit	= CONF_MOD_MMC_SD_CLK_REQ_R,
61952650505SPaul Walmsley };
62052650505SPaul Walmsley 
621fb2fc920SPaul Walmsley /*
622fb2fc920SPaul Walmsley  * XXX MOD_CONF_CTRL_0 bit 20 is defined in the 1510 TRM as
623fb2fc920SPaul Walmsley  * CONF_MOD_MCBSP3_AUXON ??
624fb2fc920SPaul Walmsley  */
62552650505SPaul Walmsley static struct clk mmc2_ck = {
626b92c170dSPaul Walmsley 	.name		= "mmc2_ck",
62752650505SPaul Walmsley 	.ops		= &clkops_generic,
62852650505SPaul Walmsley 	/* Functional clock is direct from ULPD, interface clock is ARMPER */
62952650505SPaul Walmsley 	.parent		= &armper_ck.clk,
63052650505SPaul Walmsley 	.rate		= 48000000,
63151c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
63252650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
63352650505SPaul Walmsley 	.enable_bit	= 20,
63452650505SPaul Walmsley };
63552650505SPaul Walmsley 
63652650505SPaul Walmsley static struct clk mmc3_ck = {
637b92c170dSPaul Walmsley 	.name		= "mmc3_ck",
63852650505SPaul Walmsley 	.ops		= &clkops_generic,
63952650505SPaul Walmsley 	/* Functional clock is direct from ULPD, interface clock is ARMPER */
64052650505SPaul Walmsley 	.parent		= &armper_ck.clk,
64152650505SPaul Walmsley 	.rate		= 48000000,
64251c19541SPaul Walmsley 	.flags		= ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
64352650505SPaul Walmsley 	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
644fb2fc920SPaul Walmsley 	.enable_bit	= SOFT_MMC_DPLL_REQ_SHIFT,
64552650505SPaul Walmsley };
64652650505SPaul Walmsley 
64752650505SPaul Walmsley static struct clk virtual_ck_mpu = {
64852650505SPaul Walmsley 	.name		= "mpu",
64952650505SPaul Walmsley 	.ops		= &clkops_null,
65052650505SPaul Walmsley 	.parent		= &arm_ck, /* Is smarter alias for */
65152650505SPaul Walmsley 	.recalc		= &followparent_recalc,
65252650505SPaul Walmsley 	.set_rate	= &omap1_select_table_rate,
65352650505SPaul Walmsley 	.round_rate	= &omap1_round_to_table_rate,
65452650505SPaul Walmsley };
65552650505SPaul Walmsley 
65652650505SPaul Walmsley /* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
65752650505SPaul Walmsley remains active during MPU idle whenever this is enabled */
65852650505SPaul Walmsley static struct clk i2c_fck = {
65952650505SPaul Walmsley 	.name		= "i2c_fck",
66052650505SPaul Walmsley 	.ops		= &clkops_null,
66152650505SPaul Walmsley 	.flags		= CLOCK_NO_IDLE_PARENT,
66252650505SPaul Walmsley 	.parent		= &armxor_ck.clk,
66352650505SPaul Walmsley 	.recalc		= &followparent_recalc,
66452650505SPaul Walmsley };
66552650505SPaul Walmsley 
66652650505SPaul Walmsley static struct clk i2c_ick = {
66752650505SPaul Walmsley 	.name		= "i2c_ick",
66852650505SPaul Walmsley 	.ops		= &clkops_null,
66952650505SPaul Walmsley 	.flags		= CLOCK_NO_IDLE_PARENT,
67052650505SPaul Walmsley 	.parent		= &armper_ck.clk,
67152650505SPaul Walmsley 	.recalc		= &followparent_recalc,
67252650505SPaul Walmsley };
67352650505SPaul Walmsley 
67452650505SPaul Walmsley /*
67552650505SPaul Walmsley  * clkdev integration
67652650505SPaul Walmsley  */
67752650505SPaul Walmsley 
67852650505SPaul Walmsley static struct omap_clk omap_clks[] = {
67952650505SPaul Walmsley 	/* non-ULPD clocks */
68052650505SPaul Walmsley 	CLK(NULL,	"ck_ref",	&ck_ref,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
681e8ae6b6eSCory Maccarrone 	CLK(NULL,	"ck_dpll1",	&ck_dpll1,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
68252650505SPaul Walmsley 	/* CK_GEN1 clocks */
68352650505SPaul Walmsley 	CLK(NULL,	"ck_dpll1out",	&ck_dpll1out.clk, CK_16XX),
68452650505SPaul Walmsley 	CLK(NULL,	"ck_sossi",	&sossi_ck,	CK_16XX),
68552650505SPaul Walmsley 	CLK(NULL,	"arm_ck",	&arm_ck,	CK_16XX | CK_1510 | CK_310),
68652650505SPaul Walmsley 	CLK(NULL,	"armper_ck",	&armper_ck.clk,	CK_16XX | CK_1510 | CK_310),
687*77640aabSVaradarajan, Charulatha 	CLK("omap_gpio.0", "ick",	&arm_gpio_ck,	CK_1510 | CK_310),
68852650505SPaul Walmsley 	CLK(NULL,	"armxor_ck",	&armxor_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
68952650505SPaul Walmsley 	CLK(NULL,	"armtim_ck",	&armtim_ck.clk,	CK_16XX | CK_1510 | CK_310),
69052650505SPaul Walmsley 	CLK("omap_wdt",	"fck",		&armwdt_ck.clk,	CK_16XX | CK_1510 | CK_310),
69152650505SPaul Walmsley 	CLK("omap_wdt",	"ick",		&armper_ck.clk,	CK_16XX),
69252650505SPaul Walmsley 	CLK("omap_wdt", "ick",		&dummy_ck,	CK_1510 | CK_310),
69352650505SPaul Walmsley 	CLK(NULL,	"arminth_ck",	&arminth_ck1510, CK_1510 | CK_310),
69452650505SPaul Walmsley 	CLK(NULL,	"arminth_ck",	&arminth_ck16xx, CK_16XX),
69552650505SPaul Walmsley 	/* CK_GEN2 clocks */
69652650505SPaul Walmsley 	CLK(NULL,	"dsp_ck",	&dsp_ck,	CK_16XX | CK_1510 | CK_310),
69752650505SPaul Walmsley 	CLK(NULL,	"dspmmu_ck",	&dspmmu_ck,	CK_16XX | CK_1510 | CK_310),
69852650505SPaul Walmsley 	CLK(NULL,	"dspper_ck",	&dspper_ck,	CK_16XX | CK_1510 | CK_310),
69952650505SPaul Walmsley 	CLK(NULL,	"dspxor_ck",	&dspxor_ck,	CK_16XX | CK_1510 | CK_310),
70052650505SPaul Walmsley 	CLK(NULL,	"dsptim_ck",	&dsptim_ck,	CK_16XX | CK_1510 | CK_310),
70152650505SPaul Walmsley 	/* CK_GEN3 clocks */
70252650505SPaul Walmsley 	CLK(NULL,	"tc_ck",	&tc_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
70352650505SPaul Walmsley 	CLK(NULL,	"tipb_ck",	&tipb_ck,	CK_1510 | CK_310),
70452650505SPaul Walmsley 	CLK(NULL,	"l3_ocpi_ck",	&l3_ocpi_ck,	CK_16XX | CK_7XX),
70552650505SPaul Walmsley 	CLK(NULL,	"tc1_ck",	&tc1_ck,	CK_16XX),
70652650505SPaul Walmsley 	CLK(NULL,	"tc2_ck",	&tc2_ck,	CK_16XX),
70752650505SPaul Walmsley 	CLK(NULL,	"dma_ck",	&dma_ck,	CK_16XX | CK_1510 | CK_310),
70852650505SPaul Walmsley 	CLK(NULL,	"dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
709e8ae6b6eSCory Maccarrone 	CLK(NULL,	"api_ck",	&api_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
71052650505SPaul Walmsley 	CLK(NULL,	"lb_ck",	&lb_ck.clk,	CK_1510 | CK_310),
71152650505SPaul Walmsley 	CLK(NULL,	"rhea1_ck",	&rhea1_ck,	CK_16XX),
71252650505SPaul Walmsley 	CLK(NULL,	"rhea2_ck",	&rhea2_ck,	CK_16XX),
71352650505SPaul Walmsley 	CLK(NULL,	"lcd_ck",	&lcd_ck_16xx,	CK_16XX | CK_7XX),
71452650505SPaul Walmsley 	CLK(NULL,	"lcd_ck",	&lcd_ck_1510.clk, CK_1510 | CK_310),
71552650505SPaul Walmsley 	/* ULPD clocks */
71652650505SPaul Walmsley 	CLK(NULL,	"uart1_ck",	&uart1_1510,	CK_1510 | CK_310),
71752650505SPaul Walmsley 	CLK(NULL,	"uart1_ck",	&uart1_16xx.clk, CK_16XX),
7188b8fbd39SCory Maccarrone 	CLK(NULL,	"uart1_ck",	&uart1_7xx,	CK_7XX),
71952650505SPaul Walmsley 	CLK(NULL,	"uart2_ck",	&uart2_ck,	CK_16XX | CK_1510 | CK_310),
7208b8fbd39SCory Maccarrone 	CLK(NULL,	"uart2_ck",	&uart2_7xx,	CK_7XX),
72152650505SPaul Walmsley 	CLK(NULL,	"uart3_ck",	&uart3_1510,	CK_1510 | CK_310),
72252650505SPaul Walmsley 	CLK(NULL,	"uart3_ck",	&uart3_16xx.clk, CK_16XX),
72352650505SPaul Walmsley 	CLK(NULL,	"usb_clko",	&usb_clko,	CK_16XX | CK_1510 | CK_310),
72452650505SPaul Walmsley 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck1510, CK_1510 | CK_310),
72552650505SPaul Walmsley 	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck16xx, CK_16XX),
72652650505SPaul Walmsley 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX),
72752650505SPaul Walmsley 	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck7xx,	CK_7XX),
72852650505SPaul Walmsley 	CLK(NULL,	"mclk",		&mclk_1510,	CK_1510 | CK_310),
72952650505SPaul Walmsley 	CLK(NULL,	"mclk",		&mclk_16xx,	CK_16XX),
73052650505SPaul Walmsley 	CLK(NULL,	"bclk",		&bclk_1510,	CK_1510 | CK_310),
73152650505SPaul Walmsley 	CLK(NULL,	"bclk",		&bclk_16xx,	CK_16XX),
73252650505SPaul Walmsley 	CLK("mmci-omap.0", "fck",	&mmc1_ck,	CK_16XX | CK_1510 | CK_310),
73352650505SPaul Walmsley 	CLK("mmci-omap.0", "fck",	&mmc3_ck,	CK_7XX),
73452650505SPaul Walmsley 	CLK("mmci-omap.0", "ick",	&armper_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
73552650505SPaul Walmsley 	CLK("mmci-omap.1", "fck",	&mmc2_ck,	CK_16XX),
73652650505SPaul Walmsley 	CLK("mmci-omap.1", "ick",	&armper_ck.clk,	CK_16XX),
73752650505SPaul Walmsley 	/* Virtual clocks */
73852650505SPaul Walmsley 	CLK(NULL,	"mpu",		&virtual_ck_mpu, CK_16XX | CK_1510 | CK_310),
739bf92a407SCory Maccarrone 	CLK("i2c_omap.1", "fck",	&i2c_fck,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
74052650505SPaul Walmsley 	CLK("i2c_omap.1", "ick",	&i2c_ick,	CK_16XX),
741bf92a407SCory Maccarrone 	CLK("i2c_omap.1", "ick",	&dummy_ck,	CK_1510 | CK_310 | CK_7XX),
742c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.1", "fck",	&dummy_ck,	CK_7XX),
743c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.1", "ick",	&dummy_ck,	CK_7XX),
744c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.2", "fck",	&dummy_ck,	CK_7XX),
745c5c4dce4SCory Maccarrone 	CLK("omap1_spi100k.2", "ick",	&dummy_ck,	CK_7XX),
74652650505SPaul Walmsley 	CLK("omap_uwire", "fck",	&armxor_ck.clk,	CK_16XX | CK_1510 | CK_310),
74752650505SPaul Walmsley 	CLK("omap-mcbsp.1", "ick",	&dspper_ck,	CK_16XX),
74852650505SPaul Walmsley 	CLK("omap-mcbsp.1", "ick",	&dummy_ck,	CK_1510 | CK_310),
74952650505SPaul Walmsley 	CLK("omap-mcbsp.2", "ick",	&armper_ck.clk,	CK_16XX),
75052650505SPaul Walmsley 	CLK("omap-mcbsp.2", "ick",	&dummy_ck,	CK_1510 | CK_310),
75152650505SPaul Walmsley 	CLK("omap-mcbsp.3", "ick",	&dspper_ck,	CK_16XX),
75252650505SPaul Walmsley 	CLK("omap-mcbsp.3", "ick",	&dummy_ck,	CK_1510 | CK_310),
75352650505SPaul Walmsley 	CLK("omap-mcbsp.1", "fck",	&dspxor_ck,	CK_16XX | CK_1510 | CK_310),
75452650505SPaul Walmsley 	CLK("omap-mcbsp.2", "fck",	&armper_ck.clk,	CK_16XX | CK_1510 | CK_310),
75552650505SPaul Walmsley 	CLK("omap-mcbsp.3", "fck",	&dspxor_ck,	CK_16XX | CK_1510 | CK_310),
75652650505SPaul Walmsley };
75752650505SPaul Walmsley 
75852650505SPaul Walmsley /*
75952650505SPaul Walmsley  * init
76052650505SPaul Walmsley  */
76152650505SPaul Walmsley 
7629b11769fSCory Maccarrone static struct clk_functions omap1_clk_functions = {
76352650505SPaul Walmsley 	.clk_enable		= omap1_clk_enable,
76452650505SPaul Walmsley 	.clk_disable		= omap1_clk_disable,
76552650505SPaul Walmsley 	.clk_round_rate		= omap1_clk_round_rate,
76652650505SPaul Walmsley 	.clk_set_rate		= omap1_clk_set_rate,
76752650505SPaul Walmsley 	.clk_disable_unused	= omap1_clk_disable_unused,
76852650505SPaul Walmsley };
76952650505SPaul Walmsley 
77052650505SPaul Walmsley int __init omap1_clk_init(void)
77152650505SPaul Walmsley {
77252650505SPaul Walmsley 	struct omap_clk *c;
77352650505SPaul Walmsley 	const struct omap_clock_config *info;
77452650505SPaul Walmsley 	int crystal_type = 0; /* Default 12 MHz */
77552650505SPaul Walmsley 	u32 reg, cpu_mask;
77652650505SPaul Walmsley 
77752650505SPaul Walmsley #ifdef CONFIG_DEBUG_LL
77852650505SPaul Walmsley 	/*
77952650505SPaul Walmsley 	 * Resets some clocks that may be left on from bootloader,
78052650505SPaul Walmsley 	 * but leaves serial clocks on.
78152650505SPaul Walmsley 	 */
78252650505SPaul Walmsley 	omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
78352650505SPaul Walmsley #endif
78452650505SPaul Walmsley 
78552650505SPaul Walmsley 	/* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */
78652650505SPaul Walmsley 	reg = omap_readw(SOFT_REQ_REG) & (1 << 4);
78752650505SPaul Walmsley 	omap_writew(reg, SOFT_REQ_REG);
78852650505SPaul Walmsley 	if (!cpu_is_omap15xx())
78952650505SPaul Walmsley 		omap_writew(0, SOFT_REQ_REG2);
79052650505SPaul Walmsley 
79152650505SPaul Walmsley 	clk_init(&omap1_clk_functions);
79252650505SPaul Walmsley 
79352650505SPaul Walmsley 	/* By default all idlect1 clocks are allowed to idle */
79452650505SPaul Walmsley 	arm_idlect1_mask = ~0;
79552650505SPaul Walmsley 
79652650505SPaul Walmsley 	for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
79752650505SPaul Walmsley 		clk_preinit(c->lk.clk);
79852650505SPaul Walmsley 
79952650505SPaul Walmsley 	cpu_mask = 0;
80052650505SPaul Walmsley 	if (cpu_is_omap16xx())
80152650505SPaul Walmsley 		cpu_mask |= CK_16XX;
80252650505SPaul Walmsley 	if (cpu_is_omap1510())
80352650505SPaul Walmsley 		cpu_mask |= CK_1510;
80452650505SPaul Walmsley 	if (cpu_is_omap7xx())
80552650505SPaul Walmsley 		cpu_mask |= CK_7XX;
80652650505SPaul Walmsley 	if (cpu_is_omap310())
80752650505SPaul Walmsley 		cpu_mask |= CK_310;
80852650505SPaul Walmsley 
80952650505SPaul Walmsley 	for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
81052650505SPaul Walmsley 		if (c->cpu & cpu_mask) {
81152650505SPaul Walmsley 			clkdev_add(&c->lk);
81252650505SPaul Walmsley 			clk_register(c->lk.clk);
81352650505SPaul Walmsley 		}
81452650505SPaul Walmsley 
81552650505SPaul Walmsley 	/* Pointers to these clocks are needed by code in clock.c */
81652650505SPaul Walmsley 	api_ck_p = clk_get(NULL, "api_ck");
81752650505SPaul Walmsley 	ck_dpll1_p = clk_get(NULL, "ck_dpll1");
81852650505SPaul Walmsley 	ck_ref_p = clk_get(NULL, "ck_ref");
81952650505SPaul Walmsley 
82052650505SPaul Walmsley 	info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config);
82152650505SPaul Walmsley 	if (info != NULL) {
82252650505SPaul Walmsley 		if (!cpu_is_omap15xx())
82352650505SPaul Walmsley 			crystal_type = info->system_clock_type;
82452650505SPaul Walmsley 	}
82552650505SPaul Walmsley 
82652650505SPaul Walmsley #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
82752650505SPaul Walmsley 	ck_ref.rate = 13000000;
82852650505SPaul Walmsley #elif defined(CONFIG_ARCH_OMAP16XX)
82952650505SPaul Walmsley 	if (crystal_type == 2)
83052650505SPaul Walmsley 		ck_ref.rate = 19200000;
83152650505SPaul Walmsley #endif
83252650505SPaul Walmsley 
83352650505SPaul Walmsley 	pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: "
83452650505SPaul Walmsley 		"0x%04x\n", omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
83552650505SPaul Walmsley 		omap_readw(ARM_CKCTL));
83652650505SPaul Walmsley 
83752650505SPaul Walmsley 	/* We want to be in syncronous scalable mode */
83852650505SPaul Walmsley 	omap_writew(0x1000, ARM_SYSST);
83952650505SPaul Walmsley 
84052650505SPaul Walmsley #ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER
84152650505SPaul Walmsley 	/* Use values set by bootloader. Determine PLL rate and recalculate
84252650505SPaul Walmsley 	 * dependent clocks as if kernel had changed PLL or divisors.
84352650505SPaul Walmsley 	 */
84452650505SPaul Walmsley 	{
84552650505SPaul Walmsley 		unsigned pll_ctl_val = omap_readw(DPLL_CTL);
84652650505SPaul Walmsley 
84752650505SPaul Walmsley 		ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */
84852650505SPaul Walmsley 		if (pll_ctl_val & 0x10) {
84952650505SPaul Walmsley 			/* PLL enabled, apply multiplier and divisor */
85052650505SPaul Walmsley 			if (pll_ctl_val & 0xf80)
85152650505SPaul Walmsley 				ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;
85252650505SPaul Walmsley 			ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;
85352650505SPaul Walmsley 		} else {
85452650505SPaul Walmsley 			/* PLL disabled, apply bypass divisor */
85552650505SPaul Walmsley 			switch (pll_ctl_val & 0xc) {
85652650505SPaul Walmsley 			case 0:
85752650505SPaul Walmsley 				break;
85852650505SPaul Walmsley 			case 0x4:
85952650505SPaul Walmsley 				ck_dpll1.rate /= 2;
86052650505SPaul Walmsley 				break;
86152650505SPaul Walmsley 			default:
86252650505SPaul Walmsley 				ck_dpll1.rate /= 4;
86352650505SPaul Walmsley 				break;
86452650505SPaul Walmsley 			}
86552650505SPaul Walmsley 		}
86652650505SPaul Walmsley 	}
86752650505SPaul Walmsley #else
86852650505SPaul Walmsley 	/* Find the highest supported frequency and enable it */
86952650505SPaul Walmsley 	if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
87052650505SPaul Walmsley 		printk(KERN_ERR "System frequencies not set. Check your config.\n");
87152650505SPaul Walmsley 		/* Guess sane values (60MHz) */
87252650505SPaul Walmsley 		omap_writew(0x2290, DPLL_CTL);
87352650505SPaul Walmsley 		omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL);
87452650505SPaul Walmsley 		ck_dpll1.rate = 60000000;
87552650505SPaul Walmsley 	}
87652650505SPaul Walmsley #endif
87752650505SPaul Walmsley 	propagate_rate(&ck_dpll1);
87852650505SPaul Walmsley 	/* Cache rates for clocks connected to ck_ref (not dpll1) */
87952650505SPaul Walmsley 	propagate_rate(&ck_ref);
88052650505SPaul Walmsley 	printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): "
88152650505SPaul Walmsley 		"%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
88252650505SPaul Walmsley 	       ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
88352650505SPaul Walmsley 	       ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
88452650505SPaul Walmsley 	       arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
88552650505SPaul Walmsley 
88652650505SPaul Walmsley #if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE)
88752650505SPaul Walmsley 	/* Select slicer output as OMAP input clock */
88852650505SPaul Walmsley 	omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1, OMAP7XX_PCC_UPLD_CTRL);
88952650505SPaul Walmsley #endif
89052650505SPaul Walmsley 
89152650505SPaul Walmsley 	/* Amstrad Delta wants BCLK high when inactive */
89252650505SPaul Walmsley 	if (machine_is_ams_delta())
89352650505SPaul Walmsley 		omap_writel(omap_readl(ULPD_CLOCK_CTRL) |
89452650505SPaul Walmsley 				(1 << SDW_MCLK_INV_BIT),
89552650505SPaul Walmsley 				ULPD_CLOCK_CTRL);
89652650505SPaul Walmsley 
89752650505SPaul Walmsley 	/* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */
89852650505SPaul Walmsley 	/* (on 730, bit 13 must not be cleared) */
89952650505SPaul Walmsley 	if (cpu_is_omap7xx())
90052650505SPaul Walmsley 		omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL);
90152650505SPaul Walmsley 	else
90252650505SPaul Walmsley 		omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);
90352650505SPaul Walmsley 
90452650505SPaul Walmsley 	/* Put DSP/MPUI into reset until needed */
90552650505SPaul Walmsley 	omap_writew(0, ARM_RSTCT1);
90652650505SPaul Walmsley 	omap_writew(1, ARM_RSTCT2);
90752650505SPaul Walmsley 	omap_writew(0x400, ARM_IDLECT1);
90852650505SPaul Walmsley 
90952650505SPaul Walmsley 	/*
91052650505SPaul Walmsley 	 * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
91152650505SPaul Walmsley 	 * of the ARM_IDLECT2 register must be set to zero. The power-on
91252650505SPaul Walmsley 	 * default value of this bit is one.
91352650505SPaul Walmsley 	 */
91452650505SPaul Walmsley 	omap_writew(0x0000, ARM_IDLECT2);	/* Turn LCD clock off also */
91552650505SPaul Walmsley 
91652650505SPaul Walmsley 	/*
91752650505SPaul Walmsley 	 * Only enable those clocks we will need, let the drivers
91852650505SPaul Walmsley 	 * enable other clocks as necessary
91952650505SPaul Walmsley 	 */
92052650505SPaul Walmsley 	clk_enable(&armper_ck.clk);
92152650505SPaul Walmsley 	clk_enable(&armxor_ck.clk);
92252650505SPaul Walmsley 	clk_enable(&armtim_ck.clk); /* This should be done by timer code */
92352650505SPaul Walmsley 
92452650505SPaul Walmsley 	if (cpu_is_omap15xx())
92552650505SPaul Walmsley 		clk_enable(&arm_gpio_ck);
92652650505SPaul Walmsley 
92752650505SPaul Walmsley 	return 0;
92852650505SPaul Walmsley }
929