diff options
Diffstat (limited to 'arch/arm/mach-omap2/clock44xx_data.c')
| -rw-r--r-- | arch/arm/mach-omap2/clock44xx_data.c | 271 | 
1 files changed, 224 insertions, 47 deletions
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index 044df38f65c..c0b6fbda340 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c @@ -1397,6 +1397,40 @@ static struct clk dss_dss_clk = {  	.recalc		= &followparent_recalc,  }; +static const struct clksel_rate div3_8to32_rates[] = { +	{ .div = 8, .val = 0, .flags = RATE_IN_44XX }, +	{ .div = 16, .val = 1, .flags = RATE_IN_44XX }, +	{ .div = 32, .val = 2, .flags = RATE_IN_44XX }, +	{ .div = 0 }, +}; + +static const struct clksel div_ts_div[] = { +	{ .parent = &l4_wkup_clk_mux_ck, .rates = div3_8to32_rates }, +	{ .parent = NULL }, +}; + +static struct clk div_ts_ck = { +	.name		= "div_ts_ck", +	.parent		= &l4_wkup_clk_mux_ck, +	.clksel		= div_ts_div, +	.clksel_reg	= OMAP4430_CM_WKUP_BANDGAP_CLKCTRL, +	.clksel_mask	= OMAP4430_CLKSEL_24_25_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk bandgap_ts_fclk = { +	.name		= "bandgap_ts_fclk", +	.ops		= &clkops_omap2_dflt, +	.enable_reg	= OMAP4430_CM_WKUP_BANDGAP_CLKCTRL, +	.enable_bit	= OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT, +	.clkdm_name	= "l4_wkup_clkdm", +	.parent		= &div_ts_ck, +	.recalc		= &followparent_recalc, +}; +  static struct clk dss_48mhz_clk = {  	.name		= "dss_48mhz_clk",  	.ops		= &clkops_omap2_dflt, @@ -1605,6 +1639,7 @@ static struct clk gpmc_ick = {  	.ops		= &clkops_omap2_dflt,  	.enable_reg	= OMAP4430_CM_L3_2_GPMC_CLKCTRL,  	.enable_bit	= OMAP4430_MODULEMODE_HWCTRL, +	.flags		= ENABLE_ON_INIT,  	.clkdm_name	= "l3_2_clkdm",  	.parent		= &l3_div_ck,  	.recalc		= &followparent_recalc, @@ -2773,19 +2808,39 @@ static struct clk trace_clk_div_ck = {  /* SCRM aux clk nodes */ -static const struct clksel auxclk_sel[] = { +static const struct clksel auxclk_src_sel[] = {  	{ .parent = &sys_clkin_ck, .rates = div_1_0_rates },  	{ .parent = &dpll_core_m3x2_ck, .rates = div_1_1_rates },  	{ .parent = &dpll_per_m3x2_ck, .rates = div_1_2_rates },  	{ .parent = NULL },  }; -static struct clk auxclk0_ck = { -	.name		= "auxclk0_ck", +static const struct clksel_rate div16_1to16_rates[] = { +	{ .div = 1, .val = 0, .flags = RATE_IN_4430 }, +	{ .div = 2, .val = 1, .flags = RATE_IN_4430 }, +	{ .div = 3, .val = 2, .flags = RATE_IN_4430 }, +	{ .div = 4, .val = 3, .flags = RATE_IN_4430 }, +	{ .div = 5, .val = 4, .flags = RATE_IN_4430 }, +	{ .div = 6, .val = 5, .flags = RATE_IN_4430 }, +	{ .div = 7, .val = 6, .flags = RATE_IN_4430 }, +	{ .div = 8, .val = 7, .flags = RATE_IN_4430 }, +	{ .div = 9, .val = 8, .flags = RATE_IN_4430 }, +	{ .div = 10, .val = 9, .flags = RATE_IN_4430 }, +	{ .div = 11, .val = 10, .flags = RATE_IN_4430 }, +	{ .div = 12, .val = 11, .flags = RATE_IN_4430 }, +	{ .div = 13, .val = 12, .flags = RATE_IN_4430 }, +	{ .div = 14, .val = 13, .flags = RATE_IN_4430 }, +	{ .div = 15, .val = 14, .flags = RATE_IN_4430 }, +	{ .div = 16, .val = 15, .flags = RATE_IN_4430 }, +	{ .div = 0 }, +}; + +static struct clk auxclk0_src_ck = { +	.name		= "auxclk0_src_ck",  	.parent		= &sys_clkin_ck,  	.init		= &omap2_init_clksel_parent,  	.ops		= &clkops_omap2_dflt, -	.clksel		= auxclk_sel, +	.clksel		= auxclk_src_sel,  	.clksel_reg	= OMAP4_SCRM_AUXCLK0,  	.clksel_mask	= OMAP4_SRCSELECT_MASK,  	.recalc		= &omap2_clksel_recalc, @@ -2793,12 +2848,29 @@ static struct clk auxclk0_ck = {  	.enable_bit	= OMAP4_ENABLE_SHIFT,  }; -static struct clk auxclk1_ck = { -	.name		= "auxclk1_ck", +static const struct clksel auxclk0_sel[] = { +	{ .parent = &auxclk0_src_ck, .rates = div16_1to16_rates }, +	{ .parent = NULL }, +}; + +static struct clk auxclk0_ck = { +	.name		= "auxclk0_ck", +	.parent		= &auxclk0_src_ck, +	.clksel		= auxclk0_sel, +	.clksel_reg	= OMAP4_SCRM_AUXCLK0, +	.clksel_mask	= OMAP4_CLKDIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk auxclk1_src_ck = { +	.name		= "auxclk1_src_ck",  	.parent		= &sys_clkin_ck,  	.init		= &omap2_init_clksel_parent,  	.ops		= &clkops_omap2_dflt, -	.clksel		= auxclk_sel, +	.clksel		= auxclk_src_sel,  	.clksel_reg	= OMAP4_SCRM_AUXCLK1,  	.clksel_mask	= OMAP4_SRCSELECT_MASK,  	.recalc		= &omap2_clksel_recalc, @@ -2806,12 +2878,29 @@ static struct clk auxclk1_ck = {  	.enable_bit	= OMAP4_ENABLE_SHIFT,  }; -static struct clk auxclk2_ck = { -	.name		= "auxclk2_ck", +static const struct clksel auxclk1_sel[] = { +	{ .parent = &auxclk1_src_ck, .rates = div16_1to16_rates }, +	{ .parent = NULL }, +}; + +static struct clk auxclk1_ck = { +	.name		= "auxclk1_ck", +	.parent		= &auxclk1_src_ck, +	.clksel		= auxclk1_sel, +	.clksel_reg	= OMAP4_SCRM_AUXCLK1, +	.clksel_mask	= OMAP4_CLKDIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk auxclk2_src_ck = { +	.name		= "auxclk2_src_ck",  	.parent		= &sys_clkin_ck,  	.init		= &omap2_init_clksel_parent,  	.ops		= &clkops_omap2_dflt, -	.clksel		= auxclk_sel, +	.clksel		= auxclk_src_sel,  	.clksel_reg	= OMAP4_SCRM_AUXCLK2,  	.clksel_mask	= OMAP4_SRCSELECT_MASK,  	.recalc		= &omap2_clksel_recalc, @@ -2819,12 +2908,29 @@ static struct clk auxclk2_ck = {  	.enable_bit	= OMAP4_ENABLE_SHIFT,  }; -static struct clk auxclk3_ck = { -	.name		= "auxclk3_ck", +static const struct clksel auxclk2_sel[] = { +	{ .parent = &auxclk2_src_ck, .rates = div16_1to16_rates }, +	{ .parent = NULL }, +}; + +static struct clk auxclk2_ck = { +	.name		= "auxclk2_ck", +	.parent		= &auxclk2_src_ck, +	.clksel		= auxclk2_sel, +	.clksel_reg	= OMAP4_SCRM_AUXCLK2, +	.clksel_mask	= OMAP4_CLKDIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk auxclk3_src_ck = { +	.name		= "auxclk3_src_ck",  	.parent		= &sys_clkin_ck,  	.init		= &omap2_init_clksel_parent,  	.ops		= &clkops_omap2_dflt, -	.clksel		= auxclk_sel, +	.clksel		= auxclk_src_sel,  	.clksel_reg	= OMAP4_SCRM_AUXCLK3,  	.clksel_mask	= OMAP4_SRCSELECT_MASK,  	.recalc		= &omap2_clksel_recalc, @@ -2832,12 +2938,29 @@ static struct clk auxclk3_ck = {  	.enable_bit	= OMAP4_ENABLE_SHIFT,  }; -static struct clk auxclk4_ck = { -	.name		= "auxclk4_ck", +static const struct clksel auxclk3_sel[] = { +	{ .parent = &auxclk3_src_ck, .rates = div16_1to16_rates }, +	{ .parent = NULL }, +}; + +static struct clk auxclk3_ck = { +	.name		= "auxclk3_ck", +	.parent		= &auxclk3_src_ck, +	.clksel		= auxclk3_sel, +	.clksel_reg	= OMAP4_SCRM_AUXCLK3, +	.clksel_mask	= OMAP4_CLKDIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk auxclk4_src_ck = { +	.name		= "auxclk4_src_ck",  	.parent		= &sys_clkin_ck,  	.init		= &omap2_init_clksel_parent,  	.ops		= &clkops_omap2_dflt, -	.clksel		= auxclk_sel, +	.clksel		= auxclk_src_sel,  	.clksel_reg	= OMAP4_SCRM_AUXCLK4,  	.clksel_mask	= OMAP4_SRCSELECT_MASK,  	.recalc		= &omap2_clksel_recalc, @@ -2845,12 +2968,29 @@ static struct clk auxclk4_ck = {  	.enable_bit	= OMAP4_ENABLE_SHIFT,  }; -static struct clk auxclk5_ck = { -	.name		= "auxclk5_ck", +static const struct clksel auxclk4_sel[] = { +	{ .parent = &auxclk4_src_ck, .rates = div16_1to16_rates }, +	{ .parent = NULL }, +}; + +static struct clk auxclk4_ck = { +	.name		= "auxclk4_ck", +	.parent		= &auxclk4_src_ck, +	.clksel		= auxclk4_sel, +	.clksel_reg	= OMAP4_SCRM_AUXCLK4, +	.clksel_mask	= OMAP4_CLKDIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; + +static struct clk auxclk5_src_ck = { +	.name		= "auxclk5_src_ck",  	.parent		= &sys_clkin_ck,  	.init		= &omap2_init_clksel_parent,  	.ops		= &clkops_omap2_dflt, -	.clksel		= auxclk_sel, +	.clksel		= auxclk_src_sel,  	.clksel_reg	= OMAP4_SCRM_AUXCLK5,  	.clksel_mask	= OMAP4_SRCSELECT_MASK,  	.recalc		= &omap2_clksel_recalc, @@ -2858,6 +2998,23 @@ static struct clk auxclk5_ck = {  	.enable_bit	= OMAP4_ENABLE_SHIFT,  }; +static const struct clksel auxclk5_sel[] = { +	{ .parent = &auxclk5_src_ck, .rates = div16_1to16_rates }, +	{ .parent = NULL }, +}; + +static struct clk auxclk5_ck = { +	.name		= "auxclk5_ck", +	.parent		= &auxclk5_src_ck, +	.clksel		= auxclk5_sel, +	.clksel_reg	= OMAP4_SCRM_AUXCLK5, +	.clksel_mask	= OMAP4_CLKDIV_MASK, +	.ops		= &clkops_null, +	.recalc		= &omap2_clksel_recalc, +	.round_rate	= &omap2_clksel_round_rate, +	.set_rate	= &omap2_clksel_set_rate, +}; +  static const struct clksel auxclkreq_sel[] = {  	{ .parent = &auxclk0_ck, .rates = div_1_0_rates },  	{ .parent = &auxclk1_ck, .rates = div_1_1_rates }, @@ -3028,14 +3185,16 @@ static struct omap_clk omap44xx_clks[] = {  	CLK(NULL,	"aes2_fck",			&aes2_fck,	CK_443X),  	CLK(NULL,	"aess_fck",			&aess_fck,	CK_443X),  	CLK(NULL,	"bandgap_fclk",			&bandgap_fclk,	CK_443X), +	CLK(NULL,	"bandgap_ts_fclk",		&bandgap_ts_fclk,	CK_446X),  	CLK(NULL,	"des3des_fck",			&des3des_fck,	CK_443X), +	CLK(NULL,	"div_ts_ck",			&div_ts_ck,	CK_446X),  	CLK(NULL,	"dmic_sync_mux_ck",		&dmic_sync_mux_ck,	CK_443X),  	CLK(NULL,	"dmic_fck",			&dmic_fck,	CK_443X),  	CLK(NULL,	"dsp_fck",			&dsp_fck,	CK_443X), -	CLK("omapdss_dss",	"sys_clk",			&dss_sys_clk,	CK_443X), -	CLK("omapdss_dss",	"tv_clk",			&dss_tv_clk,	CK_443X), -	CLK("omapdss_dss",	"video_clk",			&dss_48mhz_clk,	CK_443X), -	CLK("omapdss_dss",	"fck",				&dss_dss_clk,	CK_443X), +	CLK(NULL,	"dss_sys_clk",			&dss_sys_clk,	CK_443X), +	CLK(NULL,	"dss_tv_clk",			&dss_tv_clk,	CK_443X), +	CLK(NULL,	"dss_48mhz_clk",		&dss_48mhz_clk,	CK_443X), +	CLK(NULL,	"dss_dss_clk",			&dss_dss_clk,	CK_443X),  	CLK("omapdss_dss",	"ick",				&dss_fck,	CK_443X),  	CLK(NULL,	"efuse_ctrl_cust_fck",		&efuse_ctrl_cust_fck,	CK_443X),  	CLK(NULL,	"emif1_fck",			&emif1_fck,	CK_443X), @@ -3056,12 +3215,12 @@ static struct omap_clk omap44xx_clks[] = {  	CLK(NULL,	"gpio6_ick",			&gpio6_ick,	CK_443X),  	CLK(NULL,	"gpmc_ick",			&gpmc_ick,	CK_443X),  	CLK(NULL,	"gpu_fck",			&gpu_fck,	CK_443X), -	CLK("omap2_hdq.0",	"fck",				&hdq1w_fck,	CK_443X), +	CLK(NULL,	"hdq1w_fck",			&hdq1w_fck,	CK_443X),  	CLK(NULL,	"hsi_fck",			&hsi_fck,	CK_443X), -	CLK("omap_i2c.1",	"fck",				&i2c1_fck,	CK_443X), -	CLK("omap_i2c.2",	"fck",				&i2c2_fck,	CK_443X), -	CLK("omap_i2c.3",	"fck",				&i2c3_fck,	CK_443X), -	CLK("omap_i2c.4",	"fck",				&i2c4_fck,	CK_443X), +	CLK(NULL,	"i2c1_fck",			&i2c1_fck,	CK_443X), +	CLK(NULL,	"i2c2_fck",			&i2c2_fck,	CK_443X), +	CLK(NULL,	"i2c3_fck",			&i2c3_fck,	CK_443X), +	CLK(NULL,	"i2c4_fck",			&i2c4_fck,	CK_443X),  	CLK(NULL,	"ipu_fck",			&ipu_fck,	CK_443X),  	CLK(NULL,	"iss_ctrlclk",			&iss_ctrlclk,	CK_443X),  	CLK(NULL,	"iss_fck",			&iss_fck,	CK_443X), @@ -3072,23 +3231,23 @@ static struct omap_clk omap44xx_clks[] = {  	CLK(NULL,	"mcasp_sync_mux_ck",		&mcasp_sync_mux_ck,	CK_443X),  	CLK(NULL,	"mcasp_fck",			&mcasp_fck,	CK_443X),  	CLK(NULL,	"mcbsp1_sync_mux_ck",		&mcbsp1_sync_mux_ck,	CK_443X), -	CLK("omap-mcbsp.1",	"fck",				&mcbsp1_fck,	CK_443X), +	CLK(NULL,	"mcbsp1_fck",			&mcbsp1_fck,	CK_443X),  	CLK(NULL,	"mcbsp2_sync_mux_ck",		&mcbsp2_sync_mux_ck,	CK_443X), -	CLK("omap-mcbsp.2",	"fck",				&mcbsp2_fck,	CK_443X), +	CLK(NULL,	"mcbsp2_fck",			&mcbsp2_fck,	CK_443X),  	CLK(NULL,	"mcbsp3_sync_mux_ck",		&mcbsp3_sync_mux_ck,	CK_443X), -	CLK("omap-mcbsp.3",	"fck",				&mcbsp3_fck,	CK_443X), +	CLK(NULL,	"mcbsp3_fck",			&mcbsp3_fck,	CK_443X),  	CLK(NULL,	"mcbsp4_sync_mux_ck",		&mcbsp4_sync_mux_ck,	CK_443X), -	CLK("omap-mcbsp.4",	"fck",				&mcbsp4_fck,	CK_443X), +	CLK(NULL,	"mcbsp4_fck",			&mcbsp4_fck,	CK_443X),  	CLK(NULL,	"mcpdm_fck",			&mcpdm_fck,	CK_443X), -	CLK("omap2_mcspi.1",	"fck",				&mcspi1_fck,	CK_443X), -	CLK("omap2_mcspi.2",	"fck",				&mcspi2_fck,	CK_443X), -	CLK("omap2_mcspi.3",	"fck",				&mcspi3_fck,	CK_443X), -	CLK("omap2_mcspi.4",	"fck",				&mcspi4_fck,	CK_443X), -	CLK("omap_hsmmc.0",	"fck",				&mmc1_fck,	CK_443X), -	CLK("omap_hsmmc.1",	"fck",				&mmc2_fck,	CK_443X), -	CLK("omap_hsmmc.2",	"fck",				&mmc3_fck,	CK_443X), -	CLK("omap_hsmmc.3",	"fck",				&mmc4_fck,	CK_443X), -	CLK("omap_hsmmc.4",	"fck",				&mmc5_fck,	CK_443X), +	CLK(NULL,	"mcspi1_fck",			&mcspi1_fck,	CK_443X), +	CLK(NULL,	"mcspi2_fck",			&mcspi2_fck,	CK_443X), +	CLK(NULL,	"mcspi3_fck",			&mcspi3_fck,	CK_443X), +	CLK(NULL,	"mcspi4_fck",			&mcspi4_fck,	CK_443X), +	CLK(NULL,	"mmc1_fck",			&mmc1_fck,	CK_443X), +	CLK(NULL,	"mmc2_fck",			&mmc2_fck,	CK_443X), +	CLK(NULL,	"mmc3_fck",			&mmc3_fck,	CK_443X), +	CLK(NULL,	"mmc4_fck",			&mmc4_fck,	CK_443X), +	CLK(NULL,	"mmc5_fck",			&mmc5_fck,	CK_443X),  	CLK(NULL,	"ocp2scp_usb_phy_phy_48m",	&ocp2scp_usb_phy_phy_48m,	CK_443X),  	CLK(NULL,	"ocp2scp_usb_phy_ick",		&ocp2scp_usb_phy_ick,	CK_443X),  	CLK(NULL,	"ocp_wp_noc_ick",		&ocp_wp_noc_ick,	CK_443X), @@ -3145,21 +3304,27 @@ static struct omap_clk omap44xx_clks[] = {  	CLK(NULL,	"usim_ck",			&usim_ck,	CK_443X),  	CLK(NULL,	"usim_fclk",			&usim_fclk,	CK_443X),  	CLK(NULL,	"usim_fck",			&usim_fck,	CK_443X), -	CLK("omap_wdt",	"fck",				&wd_timer2_fck,	CK_443X), +	CLK(NULL,	"wd_timer2_fck",		&wd_timer2_fck,	CK_443X),  	CLK(NULL,	"wd_timer3_fck",		&wd_timer3_fck,	CK_443X),  	CLK(NULL,	"stm_clk_div_ck",		&stm_clk_div_ck,	CK_443X),  	CLK(NULL,	"trace_clk_div_ck",		&trace_clk_div_ck,	CK_443X), +	CLK(NULL,	"auxclk0_src_ck",		&auxclk0_src_ck,	CK_443X),  	CLK(NULL,	"auxclk0_ck",			&auxclk0_ck,	CK_443X), -	CLK(NULL,	"auxclk1_ck",			&auxclk1_ck,	CK_443X), -	CLK(NULL,	"auxclk2_ck",			&auxclk2_ck,	CK_443X), -	CLK(NULL,	"auxclk3_ck",			&auxclk3_ck,	CK_443X), -	CLK(NULL,	"auxclk4_ck",			&auxclk4_ck,	CK_443X), -	CLK(NULL,	"auxclk5_ck",			&auxclk5_ck,	CK_443X),  	CLK(NULL,	"auxclkreq0_ck",		&auxclkreq0_ck,	CK_443X), +	CLK(NULL,	"auxclk1_src_ck",		&auxclk1_src_ck,	CK_443X), +	CLK(NULL,	"auxclk1_ck",			&auxclk1_ck,	CK_443X),  	CLK(NULL,	"auxclkreq1_ck",		&auxclkreq1_ck,	CK_443X), +	CLK(NULL,	"auxclk2_src_ck",		&auxclk2_src_ck,	CK_443X), +	CLK(NULL,	"auxclk2_ck",			&auxclk2_ck,	CK_443X),  	CLK(NULL,	"auxclkreq2_ck",		&auxclkreq2_ck,	CK_443X), +	CLK(NULL,	"auxclk3_src_ck",		&auxclk3_src_ck,	CK_443X), +	CLK(NULL,	"auxclk3_ck",			&auxclk3_ck,	CK_443X),  	CLK(NULL,	"auxclkreq3_ck",		&auxclkreq3_ck,	CK_443X), +	CLK(NULL,	"auxclk4_src_ck",		&auxclk4_src_ck,	CK_443X), +	CLK(NULL,	"auxclk4_ck",			&auxclk4_ck,	CK_443X),  	CLK(NULL,	"auxclkreq4_ck",		&auxclkreq4_ck,	CK_443X), +	CLK(NULL,	"auxclk5_src_ck",		&auxclk5_src_ck,	CK_443X), +	CLK(NULL,	"auxclk5_ck",			&auxclk5_ck,	CK_443X),  	CLK(NULL,	"auxclkreq5_ck",		&auxclkreq5_ck,	CK_443X),  	CLK(NULL,	"gpmc_ck",			&dummy_ck,	CK_443X),  	CLK(NULL,	"gpt1_ick",			&dummy_ck,	CK_443X), @@ -3208,10 +3373,22 @@ int __init omap4xxx_clk_init(void)  	if (cpu_is_omap44xx()) {  		cpu_mask = RATE_IN_4430;  		cpu_clkflg = CK_443X; +	} else if (cpu_is_omap446x()) { +		cpu_mask = RATE_IN_4460; +		cpu_clkflg = CK_446X; +	} else { +		return 0;  	}  	clk_init(&omap2_clk_functions); +	/* +	 * Must stay commented until all OMAP SoC drivers are +	 * converted to runtime PM, or drivers may start crashing +	 * +	 * omap2_clk_disable_clkdm_control(); +	 */ +  	for (c = omap44xx_clks; c < omap44xx_clks + ARRAY_SIZE(omap44xx_clks);  									  c++)  		clk_preinit(c->lk.clk);  |