| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 | /* * AM33XX Clock data * * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * Vaibhav Hiremath <hvaibhav@ti.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2. * * This program is distributed "as is" WITHOUT ANY WARRANTY of any * kind, whether express or implied; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */#include <linux/kernel.h>#include <linux/list.h>#include <linux/clk-private.h>#include <linux/clkdev.h>#include <linux/io.h>#include "am33xx.h"#include "soc.h"#include "iomap.h"#include "clock.h"#include "control.h"#include "cm.h"#include "cm33xx.h"#include "cm-regbits-33xx.h"#include "prm.h"/* Modulemode control */#define AM33XX_MODULEMODE_HWCTRL_SHIFT		0#define AM33XX_MODULEMODE_SWCTRL_SHIFT		1/*LIST_HEAD(clocks);*//* Root clocks *//* RTC 32k */DEFINE_CLK_FIXED_RATE(clk_32768_ck, CLK_IS_ROOT, 32768, 0x0);/* On-Chip 32KHz RC OSC */DEFINE_CLK_FIXED_RATE(clk_rc32k_ck, CLK_IS_ROOT, 32000, 0x0);/* Crystal input clks */DEFINE_CLK_FIXED_RATE(virt_19200000_ck, CLK_IS_ROOT, 19200000, 0x0);DEFINE_CLK_FIXED_RATE(virt_24000000_ck, CLK_IS_ROOT, 24000000, 0x0);DEFINE_CLK_FIXED_RATE(virt_25000000_ck, CLK_IS_ROOT, 25000000, 0x0);DEFINE_CLK_FIXED_RATE(virt_26000000_ck, CLK_IS_ROOT, 26000000, 0x0);/* Oscillator clock *//* 19.2, 24, 25 or 26 MHz */static const char *sys_clkin_ck_parents[] = {	"virt_19200000_ck", "virt_24000000_ck", "virt_25000000_ck",	"virt_26000000_ck",};/* * sys_clk in: input to the dpll and also used as funtional clock for, *   adc_tsc, smartreflex0-1, timer1-7, mcasp0-1, dcan0-1, cefuse * */DEFINE_CLK_MUX(sys_clkin_ck, sys_clkin_ck_parents, NULL, 0x0,	       AM33XX_CTRL_REGADDR(AM33XX_CONTROL_STATUS),	       AM33XX_CONTROL_STATUS_SYSBOOT1_SHIFT,	       AM33XX_CONTROL_STATUS_SYSBOOT1_WIDTH,	       0, NULL);/* External clock - 12 MHz */DEFINE_CLK_FIXED_RATE(tclkin_ck, CLK_IS_ROOT, 12000000, 0x0);/* Module clocks and DPLL outputs *//* DPLL_CORE */static struct dpll_data dpll_core_dd = {	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_CORE,	.clk_bypass	= &sys_clkin_ck,	.clk_ref	= &sys_clkin_ck,	.control_reg	= AM33XX_CM_CLKMODE_DPLL_CORE,	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_CORE,	.mult_mask	= AM33XX_DPLL_MULT_MASK,	.div1_mask	= AM33XX_DPLL_DIV_MASK,	.enable_mask	= AM33XX_DPLL_EN_MASK,	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK,	.max_multiplier	= 2047,	.max_divider	= 128,	.min_divider	= 1,};/* CLKDCOLDO output */static const char *dpll_core_ck_parents[] = {	"sys_clkin_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 const struct clk_ops dpll_x2_ck_ops = {	.recalc_rate	= &omap3_clkoutx2_recalc,};static struct clk_hw_omap dpll_core_x2_ck_hw = {	.hw	= {		.clk	= &dpll_core_x2_ck,	},	.flags		= CLOCK_CLKOUTX2,};DEFINE_STRUCT_CLK(dpll_core_x2_ck, dpll_core_x2_ck_parents, dpll_x2_ck_ops);DEFINE_CLK_DIVIDER(dpll_core_m4_ck, "dpll_core_x2_ck", &dpll_core_x2_ck,		   0x0, AM33XX_CM_DIV_M4_DPLL_CORE,		   AM33XX_HSDIVIDER_CLKOUT1_DIV_SHIFT,		   AM33XX_HSDIVIDER_CLKOUT1_DIV_WIDTH, CLK_DIVIDER_ONE_BASED,		   NULL);DEFINE_CLK_DIVIDER(dpll_core_m5_ck, "dpll_core_x2_ck", &dpll_core_x2_ck,		   0x0, AM33XX_CM_DIV_M5_DPLL_CORE,		   AM33XX_HSDIVIDER_CLKOUT2_DIV_SHIFT,		   AM33XX_HSDIVIDER_CLKOUT2_DIV_WIDTH,		   CLK_DIVIDER_ONE_BASED, NULL);DEFINE_CLK_DIVIDER(dpll_core_m6_ck, "dpll_core_x2_ck", &dpll_core_x2_ck,		   0x0, AM33XX_CM_DIV_M6_DPLL_CORE,		   AM33XX_HSDIVIDER_CLKOUT3_DIV_SHIFT,		   AM33XX_HSDIVIDER_CLKOUT3_DIV_WIDTH,		   CLK_DIVIDER_ONE_BASED, NULL);/* DPLL_MPU */static struct dpll_data dpll_mpu_dd = {	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_MPU,	.clk_bypass	= &sys_clkin_ck,	.clk_ref	= &sys_clkin_ck,	.control_reg	= AM33XX_CM_CLKMODE_DPLL_MPU,	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_MPU,	.mult_mask	= AM33XX_DPLL_MULT_MASK,	.div1_mask	= AM33XX_DPLL_DIV_MASK,	.enable_mask	= AM33XX_DPLL_EN_MASK,	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK,	.max_multiplier	= 2047,	.max_divider	= 128,	.min_divider	= 1,};/* CLKOUT: fdpll/M2 */static struct clk dpll_mpu_ck;static const struct clk_ops dpll_mpu_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_mpu_ck_hw = {	.hw = {		.clk	= &dpll_mpu_ck,	},	.dpll_data	= &dpll_mpu_dd,	.ops		= &clkhwops_omap3_dpll,};DEFINE_STRUCT_CLK(dpll_mpu_ck, dpll_core_ck_parents, dpll_mpu_ck_ops);/* * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 * and ALT_CLK1/2) */DEFINE_CLK_DIVIDER(dpll_mpu_m2_ck, "dpll_mpu_ck", &dpll_mpu_ck,		   0x0, AM33XX_CM_DIV_M2_DPLL_MPU, AM33XX_DPLL_CLKOUT_DIV_SHIFT,		   AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);/* DPLL_DDR */static struct dpll_data dpll_ddr_dd = {	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_DDR,	.clk_bypass	= &sys_clkin_ck,	.clk_ref	= &sys_clkin_ck,	.control_reg	= AM33XX_CM_CLKMODE_DPLL_DDR,	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_DDR,	.mult_mask	= AM33XX_DPLL_MULT_MASK,	.div1_mask	= AM33XX_DPLL_DIV_MASK,	.enable_mask	= AM33XX_DPLL_EN_MASK,	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK,	.max_multiplier	= 2047,	.max_divider	= 128,	.min_divider	= 1,};/* CLKOUT: fdpll/M2 */static struct clk dpll_ddr_ck;static const struct clk_ops dpll_ddr_ck_ops = {	.recalc_rate	= &omap3_dpll_recalc,	.get_parent	= &omap2_init_dpll_parent,	.round_rate	= &omap2_dpll_round_rate,	.set_rate	= &omap3_noncore_dpll_set_rate,};static struct clk_hw_omap dpll_ddr_ck_hw = {	.hw = {		.clk	= &dpll_ddr_ck,	},	.dpll_data	= &dpll_ddr_dd,	.ops		= &clkhwops_omap3_dpll,};DEFINE_STRUCT_CLK(dpll_ddr_ck, dpll_core_ck_parents, dpll_ddr_ck_ops);/* * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 * and ALT_CLK1/2) */DEFINE_CLK_DIVIDER(dpll_ddr_m2_ck, "dpll_ddr_ck", &dpll_ddr_ck,		   0x0, AM33XX_CM_DIV_M2_DPLL_DDR,		   AM33XX_DPLL_CLKOUT_DIV_SHIFT, AM33XX_DPLL_CLKOUT_DIV_WIDTH,		   CLK_DIVIDER_ONE_BASED, NULL);/* emif_fck functional clock */DEFINE_CLK_FIXED_FACTOR(dpll_ddr_m2_div2_ck, "dpll_ddr_m2_ck", &dpll_ddr_m2_ck,			0x0, 1, 2);/* DPLL_DISP */static struct dpll_data dpll_disp_dd = {	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_DISP,	.clk_bypass	= &sys_clkin_ck,	.clk_ref	= &sys_clkin_ck,	.control_reg	= AM33XX_CM_CLKMODE_DPLL_DISP,	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_DISP,	.mult_mask	= AM33XX_DPLL_MULT_MASK,	.div1_mask	= AM33XX_DPLL_DIV_MASK,	.enable_mask	= AM33XX_DPLL_EN_MASK,	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK,	.max_multiplier	= 2047,	.max_divider	= 128,	.min_divider	= 1,};/* CLKOUT: fdpll/M2 */static struct clk dpll_disp_ck;static struct clk_hw_omap dpll_disp_ck_hw = {	.hw = {		.clk	= &dpll_disp_ck,	},	.dpll_data	= &dpll_disp_dd,	.ops		= &clkhwops_omap3_dpll,};DEFINE_STRUCT_CLK(dpll_disp_ck, dpll_core_ck_parents, dpll_ddr_ck_ops);/* * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 * and ALT_CLK1/2) */DEFINE_CLK_DIVIDER(dpll_disp_m2_ck, "dpll_disp_ck", &dpll_disp_ck, 0x0,		   AM33XX_CM_DIV_M2_DPLL_DISP, AM33XX_DPLL_CLKOUT_DIV_SHIFT,		   AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);/* DPLL_PER */static struct dpll_data dpll_per_dd = {	.mult_div1_reg	= AM33XX_CM_CLKSEL_DPLL_PERIPH,	.clk_bypass	= &sys_clkin_ck,	.clk_ref	= &sys_clkin_ck,	.control_reg	= AM33XX_CM_CLKMODE_DPLL_PER,	.modes		= (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),	.idlest_reg	= AM33XX_CM_IDLEST_DPLL_PER,	.mult_mask	= AM33XX_DPLL_MULT_PERIPH_MASK,	.div1_mask	= AM33XX_DPLL_PER_DIV_MASK,	.enable_mask	= AM33XX_DPLL_EN_MASK,	.idlest_mask	= AM33XX_ST_DPLL_CLK_MASK,	.max_multiplier	= 2047,	.max_divider	= 128,	.min_divider	= 1,	.flags		= DPLL_J_TYPE,};/* CLKDCOLDO */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_core_ck_parents, dpll_ddr_ck_ops);/* CLKOUT: fdpll/M2 */DEFINE_CLK_DIVIDER(dpll_per_m2_ck, "dpll_per_ck", &dpll_per_ck, 0x0,		   AM33XX_CM_DIV_M2_DPLL_PER, AM33XX_DPLL_CLKOUT_DIV_SHIFT,		   AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED,		   NULL);DEFINE_CLK_FIXED_FACTOR(dpll_per_m2_div4_wkupdm_ck, "dpll_per_m2_ck",			&dpll_per_m2_ck, 0x0, 1, 4);DEFINE_CLK_FIXED_FACTOR(dpll_per_m2_div4_ck, "dpll_per_m2_ck",			&dpll_per_m2_ck, 0x0, 1, 4);DEFINE_CLK_FIXED_FACTOR(dpll_core_m4_div2_ck, "dpll_core_m4_ck",			&dpll_core_m4_ck, 0x0, 1, 2);DEFINE_CLK_FIXED_FACTOR(l4_rtc_gclk, "dpll_core_m4_ck", &dpll_core_m4_ck, 0x0,			1, 2);DEFINE_CLK_FIXED_FACTOR(clk_24mhz, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0, 1,			8);/* * Below clock nodes describes clockdomains derived out * of core clock. */static const struct clk_ops clk_ops_null = {};static const char *l3_gclk_parents[] = {	"dpll_core_m4_ck"};static struct clk l3_gclk;DEFINE_STRUCT_CLK_HW_OMAP(l3_gclk, NULL);DEFINE_STRUCT_CLK(l3_gclk, l3_gclk_parents, clk_ops_null);static struct clk l4hs_gclk;DEFINE_STRUCT_CLK_HW_OMAP(l4hs_gclk, NULL);DEFINE_STRUCT_CLK(l4hs_gclk, l3_gclk_parents, clk_ops_null);static const char *l3s_gclk_parents[] = {	"dpll_core_m4_div2_ck"};static struct clk l3s_gclk;DEFINE_STRUCT_CLK_HW_OMAP(l3s_gclk, NULL);DEFINE_STRUCT_CLK(l3s_gclk, l3s_gclk_parents, clk_ops_null);static struct clk l4fw_gclk;DEFINE_STRUCT_CLK_HW_OMAP(l4fw_gclk, NULL);DEFINE_STRUCT_CLK(l4fw_gclk, l3s_gclk_parents, clk_ops_null);static struct clk l4ls_gclk;DEFINE_STRUCT_CLK_HW_OMAP(l4ls_gclk, NULL);DEFINE_STRUCT_CLK(l4ls_gclk, l3s_gclk_parents, clk_ops_null);static struct clk sysclk_div_ck;DEFINE_STRUCT_CLK_HW_OMAP(sysclk_div_ck, NULL);DEFINE_STRUCT_CLK(sysclk_div_ck, l3_gclk_parents, clk_ops_null);/* * In order to match the clock domain with hwmod clockdomain entry, * separate clock nodes is required for the modules which are * directly getting their funtioncal clock from sys_clkin. */static struct clk adc_tsc_fck;DEFINE_STRUCT_CLK_HW_OMAP(adc_tsc_fck, NULL);DEFINE_STRUCT_CLK(adc_tsc_fck, dpll_core_ck_parents, clk_ops_null);static struct clk dcan0_fck;DEFINE_STRUCT_CLK_HW_OMAP(dcan0_fck, NULL);DEFINE_STRUCT_CLK(dcan0_fck, dpll_core_ck_parents, clk_ops_null);static struct clk dcan1_fck;DEFINE_STRUCT_CLK_HW_OMAP(dcan1_fck, NULL);DEFINE_STRUCT_CLK(dcan1_fck, dpll_core_ck_parents, clk_ops_null);static struct clk mcasp0_fck;DEFINE_STRUCT_CLK_HW_OMAP(mcasp0_fck, NULL);DEFINE_STRUCT_CLK(mcasp0_fck, dpll_core_ck_parents, clk_ops_null);static struct clk mcasp1_fck;DEFINE_STRUCT_CLK_HW_OMAP(mcasp1_fck, NULL);DEFINE_STRUCT_CLK(mcasp1_fck, dpll_core_ck_parents, clk_ops_null);static struct clk smartreflex0_fck;DEFINE_STRUCT_CLK_HW_OMAP(smartreflex0_fck, NULL);DEFINE_STRUCT_CLK(smartreflex0_fck, dpll_core_ck_parents, clk_ops_null);static struct clk smartreflex1_fck;DEFINE_STRUCT_CLK_HW_OMAP(smartreflex1_fck, NULL);DEFINE_STRUCT_CLK(smartreflex1_fck, dpll_core_ck_parents, clk_ops_null);/* * Modules clock nodes * * The following clock leaf nodes are added for the moment because: * *  - hwmod data is not present for these modules, either hwmod *    control is not required or its not populated. *  - Driver code is not yet migrated to use hwmod/runtime pm *  - Modules outside kernel access (to disable them by default) * *     - debugss *     - mmu (gfx domain) *     - cefuse *     - usbotg_fck (its additional clock and not really a modulemode) *     - ieee5000 */DEFINE_CLK_GATE(debugss_ick, "dpll_core_m4_ck", &dpll_core_m4_ck, 0x0,		AM33XX_CM_WKUP_DEBUGSS_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,		0x0, NULL);DEFINE_CLK_GATE(mmu_fck, "dpll_core_m4_ck", &dpll_core_m4_ck, 0x0,		AM33XX_CM_GFX_MMUDATA_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,		0x0, NULL);DEFINE_CLK_GATE(cefuse_fck, "sys_clkin_ck", &sys_clkin_ck, 0x0,		AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,		0x0, NULL);/* * clkdiv32 is generated from fixed division of 732.4219 */DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732);DEFINE_CLK_GATE(clkdiv32k_ick, "clkdiv32k_ck", &clkdiv32k_ck, 0x0,		AM33XX_CM_PER_CLKDIV32K_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,		0x0, NULL);/* "usbotg_fck" is an additional clock and not really a modulemode */DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0,		AM33XX_CM_CLKDCOLDO_DPLL_PER, AM33XX_ST_DPLL_CLKDCOLDO_SHIFT,		0x0, NULL);DEFINE_CLK_GATE(ieee5000_fck, "dpll_core_m4_div2_ck", &dpll_core_m4_div2_ck,		0x0, AM33XX_CM_PER_IEEE5000_CLKCTRL,		AM33XX_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);/* Timers */static const struct clksel timer1_clkmux_sel[] = {	{ .parent = &sys_clkin_ck, .rates = div_1_0_rates },	{ .parent = &clkdiv32k_ick, .rates = div_1_1_rates },	{ .parent = &tclkin_ck, .rates = div_1_2_rates },	{ .parent = &clk_rc32k_ck, .rates = div_1_3_rates },	{ .parent = &clk_32768_ck, .rates = div_1_4_rates },	{ .parent = NULL },};static const char *timer1_ck_parents[] = {	"sys_clkin_ck", "clkdiv32k_ick", "tclkin_ck", "clk_rc32k_ck",	"clk_32768_ck",};static struct clk timer1_fck;static const struct clk_ops timer1_fck_ops = {	.recalc_rate	= &omap2_clksel_recalc,	.get_parent	= &omap2_clksel_find_parent_index,	.set_parent	= &omap2_clksel_set_parent,	.init		= &omap2_init_clk_clkdm,};static struct clk_hw_omap timer1_fck_hw = {	.hw	= {		.clk	= &timer1_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer1_clkmux_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER1MS_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_2_MASK,};DEFINE_STRUCT_CLK(timer1_fck, timer1_ck_parents, timer1_fck_ops);static const struct clksel timer2_to_7_clk_sel[] = {	{ .parent = &tclkin_ck, .rates = div_1_0_rates },	{ .parent = &sys_clkin_ck, .rates = div_1_1_rates },	{ .parent = &clkdiv32k_ick, .rates = div_1_2_rates },	{ .parent = NULL },};static const char *timer2_to_7_ck_parents[] = {	"tclkin_ck", "sys_clkin_ck", "clkdiv32k_ick",};static struct clk timer2_fck;static struct clk_hw_omap timer2_fck_hw = {	.hw	= {		.clk	= &timer2_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer2_to_7_clk_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER2_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK,};DEFINE_STRUCT_CLK(timer2_fck, timer2_to_7_ck_parents, timer1_fck_ops);static struct clk timer3_fck;static struct clk_hw_omap timer3_fck_hw = {	.hw	= {		.clk	= &timer3_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer2_to_7_clk_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER3_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK,};DEFINE_STRUCT_CLK(timer3_fck, timer2_to_7_ck_parents, timer1_fck_ops);static struct clk timer4_fck;static struct clk_hw_omap timer4_fck_hw = {	.hw	= {		.clk	= &timer4_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer2_to_7_clk_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER4_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK,};DEFINE_STRUCT_CLK(timer4_fck, timer2_to_7_ck_parents, timer1_fck_ops);static struct clk timer5_fck;static struct clk_hw_omap timer5_fck_hw = {	.hw	= {		.clk	= &timer5_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer2_to_7_clk_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER5_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK,};DEFINE_STRUCT_CLK(timer5_fck, timer2_to_7_ck_parents, timer1_fck_ops);static struct clk timer6_fck;static struct clk_hw_omap timer6_fck_hw = {	.hw	= {		.clk	= &timer6_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer2_to_7_clk_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER6_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK,};DEFINE_STRUCT_CLK(timer6_fck, timer2_to_7_ck_parents, timer1_fck_ops);static struct clk timer7_fck;static struct clk_hw_omap timer7_fck_hw = {	.hw	= {		.clk	= &timer7_fck,	},	.clkdm_name	= "l4ls_clkdm",	.clksel		= timer2_to_7_clk_sel,	.clksel_reg	= AM33XX_CLKSEL_TIMER7_CLK,	.clksel_mask	= AM33XX_CLKSEL_0_1_MASK,};DEFINE_STRUCT_CLK(timer7_fck, timer2_to_7_ck_parents, timer1_fck_ops);DEFINE_CLK_FIXED_FACTOR(cpsw_125mhz_gclk,			"dpll_core_m5_ck",			&dpll_core_m5_ck,			0x0,			1, 2);static const struct clk_ops cpsw_fck_ops = {	.recalc_rate	= &omap2_clksel_recalc,	.get_parent	= &omap2_clksel_find_parent_index,	.set_parent	= &omap2_clksel_set_parent,};static const struct clksel cpsw_cpts_rft_clkmux_sel[] = {	{ .parent = &dpll_core_m5_ck, .rates = div_1_0_rates },	{ .parent = &dpll_core_m4_ck, .rates = div_1_1_rates },	{ .parent = NULL },};static const char *cpsw_cpts_rft_ck_parents[] = {	"dpll_core_m5_ck", "dpll_core_m4_ck",
 |