| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756 | 
							- /*
 
-  * OMAP4 Clock data
 
-  *
 
-  * Copyright (C) 2009-2012 Texas Instruments, Inc.
 
-  * Copyright (C) 2009-2010 Nokia Corporation
 
-  *
 
-  * Paul Walmsley (paul@pwsan.com)
 
-  * Rajendra Nayak (rnayak@ti.com)
 
-  * Benoit Cousson (b-cousson@ti.com)
 
-  * Mike Turquette (mturquette@ti.com)
 
-  *
 
-  * This program is free software; you can redistribute it and/or modify
 
-  * it under the terms of the GNU General Public License version 2 as
 
-  * published by the Free Software Foundation.
 
-  *
 
-  * XXX Some of the ES1 clocks have been removed/changed; once support
 
-  * is added for discriminating clocks by ES level, these should be added back
 
-  * in.
 
-  */
 
- #include <linux/kernel.h>
 
- #include <linux/list.h>
 
- #include <linux/clk-private.h>
 
- #include <linux/clkdev.h>
 
- #include <linux/io.h>
 
- #include "soc.h"
 
- #include "iomap.h"
 
- #include "clock.h"
 
- #include "clock44xx.h"
 
- #include "cm1_44xx.h"
 
- #include "cm2_44xx.h"
 
- #include "cm-regbits-44xx.h"
 
- #include "prm44xx.h"
 
- #include "prm-regbits-44xx.h"
 
- #include "control.h"
 
- #include "scrm44xx.h"
 
- /* OMAP4 modulemode control */
 
- #define OMAP4430_MODULEMODE_HWCTRL_SHIFT		0
 
- #define OMAP4430_MODULEMODE_SWCTRL_SHIFT		1
 
- /*
 
-  * OMAP4 ABE DPLL default frequency. In OMAP4460 TRM version V, section
 
-  * "3.6.3.2.3 CM1_ABE Clock Generator" states that the "DPLL_ABE_X2_CLK
 
-  * must be set to 196.608 MHz" and hence, the DPLL locked frequency is
 
-  * half of this value.
 
-  */
 
- #define OMAP4_DPLL_ABE_DEFFREQ				98304000
 
- /* Root clocks */
 
- DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(pad_clks_src_ck, CLK_IS_ROOT, 12000000, 0x0);
 
- DEFINE_CLK_GATE(pad_clks_ck, "pad_clks_src_ck", &pad_clks_src_ck, 0x0,
 
- 		OMAP4430_CM_CLKSEL_ABE, OMAP4430_PAD_CLKS_GATE_SHIFT,
 
- 		0x0, NULL);
 
- DEFINE_CLK_FIXED_RATE(pad_slimbus_core_clks_ck, CLK_IS_ROOT, 12000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(secure_32k_clk_src_ck, CLK_IS_ROOT, 32768, 0x0);
 
- DEFINE_CLK_FIXED_RATE(slimbus_src_clk, CLK_IS_ROOT, 12000000, 0x0);
 
- DEFINE_CLK_GATE(slimbus_clk, "slimbus_src_clk", &slimbus_src_clk, 0x0,
 
- 		OMAP4430_CM_CLKSEL_ABE, OMAP4430_SLIMBUS_CLK_GATE_SHIFT,
 
- 		0x0, NULL);
 
- DEFINE_CLK_FIXED_RATE(sys_32k_ck, CLK_IS_ROOT, 32768, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_12000000_ck, CLK_IS_ROOT, 12000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_13000000_ck, CLK_IS_ROOT, 13000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_16800000_ck, CLK_IS_ROOT, 16800000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_19200000_ck, CLK_IS_ROOT, 19200000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_26000000_ck, CLK_IS_ROOT, 26000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_27000000_ck, CLK_IS_ROOT, 27000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(virt_38400000_ck, CLK_IS_ROOT, 38400000, 0x0);
 
- static const char *sys_clkin_ck_parents[] = {
 
- 	"virt_12000000_ck", "virt_13000000_ck", "virt_16800000_ck",
 
- 	"virt_19200000_ck", "virt_26000000_ck", "virt_27000000_ck",
 
- 	"virt_38400000_ck",
 
- };
 
- DEFINE_CLK_MUX(sys_clkin_ck, sys_clkin_ck_parents, NULL, 0x0,
 
- 	       OMAP4430_CM_SYS_CLKSEL, OMAP4430_SYS_CLKSEL_SHIFT,
 
- 	       OMAP4430_SYS_CLKSEL_WIDTH, CLK_MUX_INDEX_ONE, NULL);
 
- DEFINE_CLK_FIXED_RATE(tie_low_clock_ck, CLK_IS_ROOT, 0, 0x0);
 
- DEFINE_CLK_FIXED_RATE(utmi_phy_clkout_ck, CLK_IS_ROOT, 60000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(xclk60mhsp1_ck, CLK_IS_ROOT, 60000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(xclk60mhsp2_ck, CLK_IS_ROOT, 60000000, 0x0);
 
- DEFINE_CLK_FIXED_RATE(xclk60motg_ck, CLK_IS_ROOT, 60000000, 0x0);
 
- /* Module clocks and DPLL outputs */
 
- static const char *abe_dpll_bypass_clk_mux_ck_parents[] = {
 
- 	"sys_clkin_ck", "sys_32k_ck",
 
- };
 
- DEFINE_CLK_MUX(abe_dpll_bypass_clk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents,
 
- 	       NULL, 0x0, OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_SHIFT,
 
- 	       OMAP4430_CLKSEL_WIDTH, 0x0, NULL);
 
- DEFINE_CLK_MUX(abe_dpll_refclk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents, NULL,
 
- 	       0x0, OMAP4430_CM_ABE_PLL_REF_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
 
- 	       OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
 
- /* DPLL_ABE */
 
- static struct dpll_data dpll_abe_dd = {
 
- 	.mult_div1_reg	= OMAP4430_CM_CLKSEL_DPLL_ABE,
 
- 	.clk_bypass	= &abe_dpll_bypass_clk_mux_ck,
 
- 	.clk_ref	= &abe_dpll_refclk_mux_ck,
 
- 	.control_reg	= OMAP4430_CM_CLKMODE_DPLL_ABE,
 
- 	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
 
- 	.autoidle_reg	= OMAP4430_CM_AUTOIDLE_DPLL_ABE,
 
- 	.idlest_reg	= OMAP4430_CM_IDLEST_DPLL_ABE,
 
- 	.mult_mask	= OMAP4430_DPLL_MULT_MASK,
 
- 	.div1_mask	= OMAP4430_DPLL_DIV_MASK,
 
- 	.enable_mask	= OMAP4430_DPLL_EN_MASK,
 
- 	.autoidle_mask	= OMAP4430_AUTO_DPLL_MODE_MASK,
 
- 	.idlest_mask	= OMAP4430_ST_DPLL_CLK_MASK,
 
- 	.m4xen_mask	= OMAP4430_DPLL_REGM4XEN_MASK,
 
- 	.lpmode_mask	= OMAP4430_DPLL_LPMODE_EN_MASK,
 
- 	.max_multiplier	= 2047,
 
- 	.max_divider	= 128,
 
- 	.min_divider	= 1,
 
- };
 
- static const char *dpll_abe_ck_parents[] = {
 
- 	"abe_dpll_refclk_mux_ck",
 
- };
 
- static struct clk dpll_abe_ck;
 
- static const struct clk_ops dpll_abe_ck_ops = {
 
- 	.enable		= &omap3_noncore_dpll_enable,
 
- 	.disable	= &omap3_noncore_dpll_disable,
 
- 	.recalc_rate	= &omap4_dpll_regm4xen_recalc,
 
- 	.round_rate	= &omap4_dpll_regm4xen_round_rate,
 
- 	.set_rate	= &omap3_noncore_dpll_set_rate,
 
- 	.get_parent	= &omap2_init_dpll_parent,
 
- };
 
- static struct clk_hw_omap dpll_abe_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_abe_ck,
 
- 	},
 
- 	.dpll_data	= &dpll_abe_dd,
 
- 	.ops		= &clkhwops_omap3_dpll,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_abe_ck, dpll_abe_ck_parents, dpll_abe_ck_ops);
 
- static const char *dpll_abe_x2_ck_parents[] = {
 
- 	"dpll_abe_ck",
 
- };
 
- static struct clk dpll_abe_x2_ck;
 
- static const struct clk_ops dpll_abe_x2_ck_ops = {
 
- 	.recalc_rate	= &omap3_clkoutx2_recalc,
 
- };
 
- static struct clk_hw_omap dpll_abe_x2_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_abe_x2_ck,
 
- 	},
 
- 	.flags		= CLOCK_CLKOUTX2,
 
- 	.clksel_reg	= OMAP4430_CM_DIV_M2_DPLL_ABE,
 
- 	.ops		= &clkhwops_omap4_dpllmx,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_abe_x2_ck, dpll_abe_x2_ck_parents, dpll_abe_x2_ck_ops);
 
- static const struct clk_ops omap_hsdivider_ops = {
 
- 	.set_rate	= &omap2_clksel_set_rate,
 
- 	.recalc_rate	= &omap2_clksel_recalc,
 
- 	.round_rate	= &omap2_clksel_round_rate,
 
- };
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m2x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M2_DPLL_ABE,
 
- 			  OMAP4430_DPLL_CLKOUT_DIV_MASK);
 
- DEFINE_CLK_FIXED_FACTOR(abe_24m_fclk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
 
- 			0x0, 1, 8);
 
- DEFINE_CLK_DIVIDER(abe_clk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, 0x0,
 
- 		   OMAP4430_CM_CLKSEL_ABE, OMAP4430_CLKSEL_OPP_SHIFT,
 
- 		   OMAP4430_CLKSEL_OPP_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
 
- DEFINE_CLK_DIVIDER(aess_fclk, "abe_clk", &abe_clk, 0x0,
 
- 		   OMAP4430_CM1_ABE_AESS_CLKCTRL,
 
- 		   OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
 
- 		   OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
 
- 		   0x0, NULL);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m3x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M3_DPLL_ABE,
 
- 			  OMAP4430_DPLL_CLKOUTHIF_DIV_MASK);
 
- static const char *core_hsd_byp_clk_mux_ck_parents[] = {
 
- 	"sys_clkin_ck", "dpll_abe_m3x2_ck",
 
- };
 
- DEFINE_CLK_MUX(core_hsd_byp_clk_mux_ck, core_hsd_byp_clk_mux_ck_parents, NULL,
 
- 	       0x0, OMAP4430_CM_CLKSEL_DPLL_CORE,
 
- 	       OMAP4430_DPLL_BYP_CLKSEL_SHIFT, OMAP4430_DPLL_BYP_CLKSEL_WIDTH,
 
- 	       0x0, NULL);
 
- /* DPLL_CORE */
 
- static struct dpll_data dpll_core_dd = {
 
- 	.mult_div1_reg	= OMAP4430_CM_CLKSEL_DPLL_CORE,
 
- 	.clk_bypass	= &core_hsd_byp_clk_mux_ck,
 
- 	.clk_ref	= &sys_clkin_ck,
 
- 	.control_reg	= OMAP4430_CM_CLKMODE_DPLL_CORE,
 
- 	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
 
- 	.autoidle_reg	= OMAP4430_CM_AUTOIDLE_DPLL_CORE,
 
- 	.idlest_reg	= OMAP4430_CM_IDLEST_DPLL_CORE,
 
- 	.mult_mask	= OMAP4430_DPLL_MULT_MASK,
 
- 	.div1_mask	= OMAP4430_DPLL_DIV_MASK,
 
- 	.enable_mask	= OMAP4430_DPLL_EN_MASK,
 
- 	.autoidle_mask	= OMAP4430_AUTO_DPLL_MODE_MASK,
 
- 	.idlest_mask	= OMAP4430_ST_DPLL_CLK_MASK,
 
- 	.max_multiplier	= 2047,
 
- 	.max_divider	= 128,
 
- 	.min_divider	= 1,
 
- };
 
- static const char *dpll_core_ck_parents[] = {
 
- 	"sys_clkin_ck", "core_hsd_byp_clk_mux_ck"
 
- };
 
- static struct clk dpll_core_ck;
 
- static const struct clk_ops dpll_core_ck_ops = {
 
- 	.recalc_rate	= &omap3_dpll_recalc,
 
- 	.get_parent	= &omap2_init_dpll_parent,
 
- };
 
- static struct clk_hw_omap dpll_core_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_core_ck,
 
- 	},
 
- 	.dpll_data	= &dpll_core_dd,
 
- 	.ops		= &clkhwops_omap3_dpll,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_core_ck, dpll_core_ck_parents, dpll_core_ck_ops);
 
- static const char *dpll_core_x2_ck_parents[] = {
 
- 	"dpll_core_ck",
 
- };
 
- static struct clk dpll_core_x2_ck;
 
- static struct clk_hw_omap dpll_core_x2_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_core_x2_ck,
 
- 	},
 
- };
 
- DEFINE_STRUCT_CLK(dpll_core_x2_ck, dpll_core_x2_ck_parents, dpll_abe_x2_ck_ops);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m6x2_ck, "dpll_core_x2_ck",
 
- 			  &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M6_DPLL_CORE,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m2_ck, "dpll_core_ck", &dpll_core_ck, 0x0,
 
- 			  OMAP4430_CM_DIV_M2_DPLL_CORE,
 
- 			  OMAP4430_DPLL_CLKOUT_DIV_MASK);
 
- DEFINE_CLK_FIXED_FACTOR(ddrphy_ck, "dpll_core_m2_ck", &dpll_core_m2_ck, 0x0, 1,
 
- 			2);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m5x2_ck, "dpll_core_x2_ck",
 
- 			  &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M5_DPLL_CORE,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
 
- DEFINE_CLK_DIVIDER(div_core_ck, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck, 0x0,
 
- 		   OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_CORE_SHIFT,
 
- 		   OMAP4430_CLKSEL_CORE_WIDTH, 0x0, NULL);
 
- DEFINE_CLK_DIVIDER(div_iva_hs_clk, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck,
 
- 		   0x0, OMAP4430_CM_BYPCLK_DPLL_IVA, OMAP4430_CLKSEL_0_1_SHIFT,
 
- 		   OMAP4430_CLKSEL_0_1_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
 
- DEFINE_CLK_DIVIDER(div_mpu_hs_clk, "dpll_core_m5x2_ck", &dpll_core_m5x2_ck,
 
- 		   0x0, OMAP4430_CM_BYPCLK_DPLL_MPU, OMAP4430_CLKSEL_0_1_SHIFT,
 
- 		   OMAP4430_CLKSEL_0_1_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m4x2_ck, "dpll_core_x2_ck",
 
- 			  &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M4_DPLL_CORE,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
 
- DEFINE_CLK_FIXED_FACTOR(dll_clk_div_ck, "dpll_core_m4x2_ck", &dpll_core_m4x2_ck,
 
- 			0x0, 1, 2);
 
- DEFINE_CLK_DIVIDER(dpll_abe_m2_ck, "dpll_abe_ck", &dpll_abe_ck, 0x0,
 
- 		   OMAP4430_CM_DIV_M2_DPLL_ABE, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
 
- 		   OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
 
- static const struct clk_ops dmic_fck_ops = {
 
- 	.enable		= &omap2_dflt_clk_enable,
 
- 	.disable	= &omap2_dflt_clk_disable,
 
- 	.is_enabled	= &omap2_dflt_clk_is_enabled,
 
- 	.recalc_rate	= &omap2_clksel_recalc,
 
- 	.get_parent	= &omap2_clksel_find_parent_index,
 
- 	.set_parent	= &omap2_clksel_set_parent,
 
- 	.init		= &omap2_init_clk_clkdm,
 
- };
 
- static const char *dpll_core_m3x2_ck_parents[] = {
 
- 	"dpll_core_x2_ck",
 
- };
 
- static const struct clksel dpll_core_m3x2_div[] = {
 
- 	{ .parent = &dpll_core_x2_ck, .rates = div31_1to31_rates },
 
- 	{ .parent = NULL },
 
- };
 
- /* XXX Missing round_rate, set_rate in ops */
 
- DEFINE_CLK_OMAP_MUX_GATE(dpll_core_m3x2_ck, NULL, dpll_core_m3x2_div,
 
- 			 OMAP4430_CM_DIV_M3_DPLL_CORE,
 
- 			 OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
 
- 			 OMAP4430_CM_DIV_M3_DPLL_CORE,
 
- 			 OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
 
- 			 dpll_core_m3x2_ck_parents, dmic_fck_ops);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m7x2_ck, "dpll_core_x2_ck",
 
- 			  &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M7_DPLL_CORE,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
 
- static const char *iva_hsd_byp_clk_mux_ck_parents[] = {
 
- 	"sys_clkin_ck", "div_iva_hs_clk",
 
- };
 
- DEFINE_CLK_MUX(iva_hsd_byp_clk_mux_ck, iva_hsd_byp_clk_mux_ck_parents, NULL,
 
- 	       0x0, OMAP4430_CM_CLKSEL_DPLL_IVA, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
 
- 	       OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
 
- /* DPLL_IVA */
 
- static struct dpll_data dpll_iva_dd = {
 
- 	.mult_div1_reg	= OMAP4430_CM_CLKSEL_DPLL_IVA,
 
- 	.clk_bypass	= &iva_hsd_byp_clk_mux_ck,
 
- 	.clk_ref	= &sys_clkin_ck,
 
- 	.control_reg	= OMAP4430_CM_CLKMODE_DPLL_IVA,
 
- 	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
 
- 	.autoidle_reg	= OMAP4430_CM_AUTOIDLE_DPLL_IVA,
 
- 	.idlest_reg	= OMAP4430_CM_IDLEST_DPLL_IVA,
 
- 	.mult_mask	= OMAP4430_DPLL_MULT_MASK,
 
- 	.div1_mask	= OMAP4430_DPLL_DIV_MASK,
 
- 	.enable_mask	= OMAP4430_DPLL_EN_MASK,
 
- 	.autoidle_mask	= OMAP4430_AUTO_DPLL_MODE_MASK,
 
- 	.idlest_mask	= OMAP4430_ST_DPLL_CLK_MASK,
 
- 	.max_multiplier	= 2047,
 
- 	.max_divider	= 128,
 
- 	.min_divider	= 1,
 
- };
 
- static const char *dpll_iva_ck_parents[] = {
 
- 	"sys_clkin_ck", "iva_hsd_byp_clk_mux_ck"
 
- };
 
- static struct clk dpll_iva_ck;
 
- static const struct clk_ops dpll_ck_ops = {
 
- 	.enable		= &omap3_noncore_dpll_enable,
 
- 	.disable	= &omap3_noncore_dpll_disable,
 
- 	.recalc_rate	= &omap3_dpll_recalc,
 
- 	.round_rate	= &omap2_dpll_round_rate,
 
- 	.set_rate	= &omap3_noncore_dpll_set_rate,
 
- 	.get_parent	= &omap2_init_dpll_parent,
 
- };
 
- static struct clk_hw_omap dpll_iva_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_iva_ck,
 
- 	},
 
- 	.dpll_data	= &dpll_iva_dd,
 
- 	.ops		= &clkhwops_omap3_dpll,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_iva_ck, dpll_iva_ck_parents, dpll_ck_ops);
 
- static const char *dpll_iva_x2_ck_parents[] = {
 
- 	"dpll_iva_ck",
 
- };
 
- static struct clk dpll_iva_x2_ck;
 
- static struct clk_hw_omap dpll_iva_x2_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_iva_x2_ck,
 
- 	},
 
- };
 
- DEFINE_STRUCT_CLK(dpll_iva_x2_ck, dpll_iva_x2_ck_parents, dpll_abe_x2_ck_ops);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m4x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M4_DPLL_IVA,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m5x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M5_DPLL_IVA,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
 
- /* DPLL_MPU */
 
- static struct dpll_data dpll_mpu_dd = {
 
- 	.mult_div1_reg	= OMAP4430_CM_CLKSEL_DPLL_MPU,
 
- 	.clk_bypass	= &div_mpu_hs_clk,
 
- 	.clk_ref	= &sys_clkin_ck,
 
- 	.control_reg	= OMAP4430_CM_CLKMODE_DPLL_MPU,
 
- 	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
 
- 	.autoidle_reg	= OMAP4430_CM_AUTOIDLE_DPLL_MPU,
 
- 	.idlest_reg	= OMAP4430_CM_IDLEST_DPLL_MPU,
 
- 	.mult_mask	= OMAP4430_DPLL_MULT_MASK,
 
- 	.div1_mask	= OMAP4430_DPLL_DIV_MASK,
 
- 	.enable_mask	= OMAP4430_DPLL_EN_MASK,
 
- 	.autoidle_mask	= OMAP4430_AUTO_DPLL_MODE_MASK,
 
- 	.idlest_mask	= OMAP4430_ST_DPLL_CLK_MASK,
 
- 	.max_multiplier	= 2047,
 
- 	.max_divider	= 128,
 
- 	.min_divider	= 1,
 
- };
 
- static const char *dpll_mpu_ck_parents[] = {
 
- 	"sys_clkin_ck", "div_mpu_hs_clk"
 
- };
 
- static struct clk dpll_mpu_ck;
 
- static struct clk_hw_omap dpll_mpu_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_mpu_ck,
 
- 	},
 
- 	.dpll_data	= &dpll_mpu_dd,
 
- 	.ops		= &clkhwops_omap3_dpll,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_mpu_ck, dpll_mpu_ck_parents, dpll_ck_ops);
 
- DEFINE_CLK_FIXED_FACTOR(mpu_periphclk, "dpll_mpu_ck", &dpll_mpu_ck, 0x0, 1, 2);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_mpu_m2_ck, "dpll_mpu_ck", &dpll_mpu_ck, 0x0,
 
- 			  OMAP4430_CM_DIV_M2_DPLL_MPU,
 
- 			  OMAP4430_DPLL_CLKOUT_DIV_MASK);
 
- DEFINE_CLK_FIXED_FACTOR(per_hs_clk_div_ck, "dpll_abe_m3x2_ck",
 
- 			&dpll_abe_m3x2_ck, 0x0, 1, 2);
 
- static const char *per_hsd_byp_clk_mux_ck_parents[] = {
 
- 	"sys_clkin_ck", "per_hs_clk_div_ck",
 
- };
 
- DEFINE_CLK_MUX(per_hsd_byp_clk_mux_ck, per_hsd_byp_clk_mux_ck_parents, NULL,
 
- 	       0x0, OMAP4430_CM_CLKSEL_DPLL_PER, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
 
- 	       OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
 
- /* DPLL_PER */
 
- static struct dpll_data dpll_per_dd = {
 
- 	.mult_div1_reg	= OMAP4430_CM_CLKSEL_DPLL_PER,
 
- 	.clk_bypass	= &per_hsd_byp_clk_mux_ck,
 
- 	.clk_ref	= &sys_clkin_ck,
 
- 	.control_reg	= OMAP4430_CM_CLKMODE_DPLL_PER,
 
- 	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
 
- 	.autoidle_reg	= OMAP4430_CM_AUTOIDLE_DPLL_PER,
 
- 	.idlest_reg	= OMAP4430_CM_IDLEST_DPLL_PER,
 
- 	.mult_mask	= OMAP4430_DPLL_MULT_MASK,
 
- 	.div1_mask	= OMAP4430_DPLL_DIV_MASK,
 
- 	.enable_mask	= OMAP4430_DPLL_EN_MASK,
 
- 	.autoidle_mask	= OMAP4430_AUTO_DPLL_MODE_MASK,
 
- 	.idlest_mask	= OMAP4430_ST_DPLL_CLK_MASK,
 
- 	.max_multiplier	= 2047,
 
- 	.max_divider	= 128,
 
- 	.min_divider	= 1,
 
- };
 
- static const char *dpll_per_ck_parents[] = {
 
- 	"sys_clkin_ck", "per_hsd_byp_clk_mux_ck"
 
- };
 
- static struct clk dpll_per_ck;
 
- static struct clk_hw_omap dpll_per_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_per_ck,
 
- 	},
 
- 	.dpll_data	= &dpll_per_dd,
 
- 	.ops		= &clkhwops_omap3_dpll,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_per_ck, dpll_per_ck_parents, dpll_ck_ops);
 
- DEFINE_CLK_DIVIDER(dpll_per_m2_ck, "dpll_per_ck", &dpll_per_ck, 0x0,
 
- 		   OMAP4430_CM_DIV_M2_DPLL_PER, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
 
- 		   OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
 
- static const char *dpll_per_x2_ck_parents[] = {
 
- 	"dpll_per_ck",
 
- };
 
- static struct clk dpll_per_x2_ck;
 
- static struct clk_hw_omap dpll_per_x2_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_per_x2_ck,
 
- 	},
 
- 	.flags		= CLOCK_CLKOUTX2,
 
- 	.clksel_reg	= OMAP4430_CM_DIV_M2_DPLL_PER,
 
- 	.ops		= &clkhwops_omap4_dpllmx,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_per_x2_ck, dpll_per_x2_ck_parents, dpll_abe_x2_ck_ops);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m2x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M2_DPLL_PER,
 
- 			  OMAP4430_DPLL_CLKOUT_DIV_MASK);
 
- static const char *dpll_per_m3x2_ck_parents[] = {
 
- 	"dpll_per_x2_ck",
 
- };
 
- static const struct clksel dpll_per_m3x2_div[] = {
 
- 	{ .parent = &dpll_per_x2_ck, .rates = div31_1to31_rates },
 
- 	{ .parent = NULL },
 
- };
 
- /* XXX Missing round_rate, set_rate in ops */
 
- DEFINE_CLK_OMAP_MUX_GATE(dpll_per_m3x2_ck, NULL, dpll_per_m3x2_div,
 
- 			 OMAP4430_CM_DIV_M3_DPLL_PER,
 
- 			 OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
 
- 			 OMAP4430_CM_DIV_M3_DPLL_PER,
 
- 			 OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
 
- 			 dpll_per_m3x2_ck_parents, dmic_fck_ops);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m4x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M4_DPLL_PER,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m5x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M5_DPLL_PER,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m6x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M6_DPLL_PER,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m7x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
 
- 			  0x0, OMAP4430_CM_DIV_M7_DPLL_PER,
 
- 			  OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
 
- DEFINE_CLK_FIXED_FACTOR(usb_hs_clk_div_ck, "dpll_abe_m3x2_ck",
 
- 			&dpll_abe_m3x2_ck, 0x0, 1, 3);
 
- /* DPLL_USB */
 
- static struct dpll_data dpll_usb_dd = {
 
- 	.mult_div1_reg	= OMAP4430_CM_CLKSEL_DPLL_USB,
 
- 	.clk_bypass	= &usb_hs_clk_div_ck,
 
- 	.flags		= DPLL_J_TYPE,
 
- 	.clk_ref	= &sys_clkin_ck,
 
- 	.control_reg	= OMAP4430_CM_CLKMODE_DPLL_USB,
 
- 	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
 
- 	.autoidle_reg	= OMAP4430_CM_AUTOIDLE_DPLL_USB,
 
- 	.idlest_reg	= OMAP4430_CM_IDLEST_DPLL_USB,
 
- 	.mult_mask	= OMAP4430_DPLL_MULT_USB_MASK,
 
- 	.div1_mask	= OMAP4430_DPLL_DIV_0_7_MASK,
 
- 	.enable_mask	= OMAP4430_DPLL_EN_MASK,
 
- 	.autoidle_mask	= OMAP4430_AUTO_DPLL_MODE_MASK,
 
- 	.idlest_mask	= OMAP4430_ST_DPLL_CLK_MASK,
 
- 	.sddiv_mask	= OMAP4430_DPLL_SD_DIV_MASK,
 
- 	.max_multiplier	= 4095,
 
- 	.max_divider	= 256,
 
- 	.min_divider	= 1,
 
- };
 
- static const char *dpll_usb_ck_parents[] = {
 
- 	"sys_clkin_ck", "usb_hs_clk_div_ck"
 
- };
 
- static struct clk dpll_usb_ck;
 
- static struct clk_hw_omap dpll_usb_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_usb_ck,
 
- 	},
 
- 	.dpll_data	= &dpll_usb_dd,
 
- 	.ops		= &clkhwops_omap3_dpll,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_usb_ck, dpll_usb_ck_parents, dpll_ck_ops);
 
- static const char *dpll_usb_clkdcoldo_ck_parents[] = {
 
- 	"dpll_usb_ck",
 
- };
 
- static struct clk dpll_usb_clkdcoldo_ck;
 
- static const struct clk_ops dpll_usb_clkdcoldo_ck_ops = {
 
- };
 
- static struct clk_hw_omap dpll_usb_clkdcoldo_ck_hw = {
 
- 	.hw = {
 
- 		.clk = &dpll_usb_clkdcoldo_ck,
 
- 	},
 
- 	.clksel_reg	= OMAP4430_CM_CLKDCOLDO_DPLL_USB,
 
- 	.ops		= &clkhwops_omap4_dpllmx,
 
- };
 
- DEFINE_STRUCT_CLK(dpll_usb_clkdcoldo_ck, dpll_usb_clkdcoldo_ck_parents,
 
- 		  dpll_usb_clkdcoldo_ck_ops);
 
- DEFINE_CLK_OMAP_HSDIVIDER(dpll_usb_m2_ck, "dpll_usb_ck", &dpll_usb_ck, 0x0,
 
- 			  OMAP4430_CM_DIV_M2_DPLL_USB,
 
- 			  OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK);
 
- static const char *ducati_clk_mux_ck_parents[] = {
 
- 	"div_core_ck", "dpll_per_m6x2_ck",
 
- };
 
- DEFINE_CLK_MUX(ducati_clk_mux_ck, ducati_clk_mux_ck_parents, NULL, 0x0,
 
- 	       OMAP4430_CM_CLKSEL_DUCATI_ISS_ROOT, OMAP4430_CLKSEL_0_0_SHIFT,
 
- 	       OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
 
- DEFINE_CLK_FIXED_FACTOR(func_12m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
 
- 			0x0, 1, 16);
 
- DEFINE_CLK_FIXED_FACTOR(func_24m_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0,
 
- 			1, 4);
 
- DEFINE_CLK_FIXED_FACTOR(func_24mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
 
- 			0x0, 1, 8);
 
- static const struct clk_div_table func_48m_fclk_rates[] = {
 
- 	{ .div = 4, .val = 0 },
 
- 	{ .div = 8, .val = 1 },
 
- 	{ .div = 0 },
 
- };
 
- DEFINE_CLK_DIVIDER_TABLE(func_48m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
 
- 			 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
 
- 			 OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_48m_fclk_rates,
 
- 			 NULL);
 
- DEFINE_CLK_FIXED_FACTOR(func_48mc_fclk,	"dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
 
- 			0x0, 1, 4);
 
- static const struct clk_div_table func_64m_fclk_rates[] = {
 
- 	{ .div = 2, .val = 0 },
 
- 	{ .div = 4, .val = 1 },
 
- 	{ .div = 0 },
 
- };
 
- DEFINE_CLK_DIVIDER_TABLE(func_64m_fclk, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck,
 
- 			 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
 
- 			 OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_64m_fclk_rates,
 
- 			 NULL);
 
- static const struct clk_div_table func_96m_fclk_rates[] = {
 
- 	{ .div = 2, .val = 0 },
 
- 	{ .div = 4, .val = 1 },
 
- 	{ .div = 0 },
 
- };
 
- DEFINE_CLK_DIVIDER_TABLE(func_96m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
 
- 			 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
 
- 			 OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_96m_fclk_rates,
 
- 			 NULL);
 
- static const struct clk_div_table init_60m_fclk_rates[] = {
 
- 	{ .div = 1, .val = 0 },
 
- 	{ .div = 8, .val = 1 },
 
- 	{ .div = 0 },
 
- };
 
- DEFINE_CLK_DIVIDER_TABLE(init_60m_fclk, "dpll_usb_m2_ck", &dpll_usb_m2_ck,
 
- 			 0x0, OMAP4430_CM_CLKSEL_USB_60MHZ,
 
- 			 OMAP4430_CLKSEL_0_0_SHIFT, OMAP4430_CLKSEL_0_0_WIDTH,
 
- 			 0x0, init_60m_fclk_rates, NULL);
 
- DEFINE_CLK_DIVIDER(l3_div_ck, "div_core_ck", &div_core_ck, 0x0,
 
- 		   OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L3_SHIFT,
 
- 		   OMAP4430_CLKSEL_L3_WIDTH, 0x0, NULL);
 
- DEFINE_CLK_DIVIDER(l4_div_ck, "l3_div_ck", &l3_div_ck, 0x0,
 
- 		   OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L4_SHIFT,
 
- 		   OMAP4430_CLKSEL_L4_WIDTH, 0x0, NULL);
 
- DEFINE_CLK_FIXED_FACTOR(lp_clk_div_ck, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
 
- 			0x0, 1, 16);
 
- static const char *l4_wkup_clk_mux_ck_parents[] = {
 
- 	"sys_clkin_ck", "lp_clk_div_ck",
 
- };
 
- DEFINE_CLK_MUX(l4_wkup_clk_mux_ck, l4_wkup_clk_mux_ck_parents, NULL, 0x0,
 
- 	       OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
 
- 	       OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
 
- static const struct clk_div_table ocp_abe_iclk_rates[] = {
 
- 	{ .div = 2, .val = 0 },
 
- 	{ .div = 1, .val = 1 },
 
- 	{ .div = 0 },
 
- };
 
- DEFINE_CLK_DIVIDER_TABLE(ocp_abe_iclk, "aess_fclk", &aess_fclk, 0x0,
 
- 			 OMAP4430_CM1_ABE_AESS_CLKCTRL,
 
- 			 OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
 
- 			 OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
 
- 			 0x0, ocp_abe_iclk_rates, NULL);
 
- DEFINE_CLK_FIXED_FACTOR(per_abe_24m_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck,
 
- 			0x0, 1, 4);
 
- DEFINE_CLK_DIVIDER(per_abe_nc_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck, 0x0,
 
- 		   OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
 
- 		   OMAP4430_SCALE_FCLK_WIDTH, 0x0, NULL);
 
- DEFINE_CLK_DIVIDER(syc_clk_div_ck, "sys_clkin_ck", &sys_clkin_ck, 0x0,
 
- 		   OMAP4430_CM_ABE_DSS_SYS_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
 
- 		   OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
 
- static const char *dbgclk_mux_ck_parents[] = {
 
- 	"sys_clkin_ck"
 
- };
 
- static struct clk dbgclk_mux_ck;
 
- DEFINE_STRUCT_CLK_HW_OMAP(dbgclk_mux_ck, NULL);
 
- DEFINE_STRUCT_CLK(dbgclk_mux_ck, dbgclk_mux_ck_parents,
 
- 		  dpll_usb_clkdcoldo_ck_ops);
 
- /* Leaf clocks controlled by modules */
 
- DEFINE_CLK_GATE(aes1_fck, "l3_div_ck", &l3_div_ck, 0x0,
 
- 		OMAP4430_CM_L4SEC_AES1_CLKCTRL,
 
- 		OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
 
- DEFINE_CLK_GATE(aes2_fck, "l3_div_ck", &l3_div_ck, 0x0,
 
- 		OMAP4430_CM_L4SEC_AES2_CLKCTRL,
 
- 		OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
 
- DEFINE_CLK_GATE(aess_fck, "aess_fclk", &aess_fclk, 0x0,
 
- 		OMAP4430_CM1_ABE_AESS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT,
 
- 		0x0, NULL);
 
- DEFINE_CLK_GATE(bandgap_fclk, "sys_32k_ck", &sys_32k_ck, 0x0,
 
 
  |