|
@@ -918,3 +918,44 @@ static const char *enable_init_clks[] = {
|
|
"dpll_mpu_m2_ck",
|
|
"dpll_mpu_m2_ck",
|
|
"l3_gclk",
|
|
"l3_gclk",
|
|
"l4hs_gclk",
|
|
"l4hs_gclk",
|
|
|
|
+ "l4fw_gclk",
|
|
|
|
+ "l4ls_gclk",
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+int __init am33xx_clk_init(void)
|
|
|
|
+{
|
|
|
|
+ struct omap_clk *c;
|
|
|
|
+ u32 cpu_clkflg;
|
|
|
|
+
|
|
|
|
+ if (soc_is_am33xx()) {
|
|
|
|
+ cpu_mask = RATE_IN_AM33XX;
|
|
|
|
+ cpu_clkflg = CK_AM33XX;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (c = am33xx_clks; c < am33xx_clks + ARRAY_SIZE(am33xx_clks); c++) {
|
|
|
|
+ if (c->cpu & cpu_clkflg) {
|
|
|
|
+ clkdev_add(&c->lk);
|
|
|
|
+ if (!__clk_init(NULL, c->lk.clk))
|
|
|
|
+ omap2_init_clk_hw_omap_clocks(c->lk.clk);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ omap2_clk_disable_autoidle_all();
|
|
|
|
+
|
|
|
|
+ omap2_clk_enable_init_clocks(enable_init_clks,
|
|
|
|
+ ARRAY_SIZE(enable_init_clks));
|
|
|
|
+
|
|
|
|
+ /* TRM ERRATA: Timer 3 & 6 default parent (TCLKIN) may not be always
|
|
|
|
+ * physically present, in such a case HWMOD enabling of
|
|
|
|
+ * clock would be failure with default parent. And timer
|
|
|
|
+ * probe thinks clock is already enabled, this leads to
|
|
|
|
+ * crash upon accessing timer 3 & 6 registers in probe.
|
|
|
|
+ * Fix by setting parent of both these timers to master
|
|
|
|
+ * oscillator clock.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ clk_set_parent(&timer3_fck, &sys_clkin_ck);
|
|
|
|
+ clk_set_parent(&timer6_fck, &sys_clkin_ck);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|