|
@@ -1925,3 +1925,114 @@ static struct omap_clk omap44xx_clks[] = {
|
|
|
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("omap-gpmc", "fck", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_i2c.1", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_i2c.2", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_i2c.3", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_i2c.4", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK(NULL, "mailboxes_ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_hsmmc.0", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_hsmmc.1", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_hsmmc.2", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_hsmmc.3", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_hsmmc.4", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap-mcbsp.4", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap2_mcspi.1", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap2_mcspi.2", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap2_mcspi.3", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap2_mcspi.4", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK(NULL, "uart1_ick", &dummy_ck, CK_443X),
|
|
|
+ CLK(NULL, "uart2_ick", &dummy_ck, CK_443X),
|
|
|
+ CLK(NULL, "uart3_ick", &dummy_ck, CK_443X),
|
|
|
+ CLK(NULL, "uart4_ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("usbhs_omap", "usbhost_ick", &dummy_ck, CK_443X),
|
|
|
+ CLK("usbhs_omap", "usbtll_fck", &dummy_ck, CK_443X),
|
|
|
+ CLK("usbhs_tll", "usbtll_fck", &dummy_ck, CK_443X),
|
|
|
+ CLK("omap_wdt", "ick", &dummy_ck, CK_443X),
|
|
|
+ CLK(NULL, "timer_32k_ck", &sys_32k_ck, CK_443X),
|
|
|
+ /* TODO: Remove "omap_timer.X" aliases once DT migration is complete */
|
|
|
+ CLK("omap_timer.1", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.2", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.3", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.4", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.9", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.10", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.11", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("omap_timer.5", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("omap_timer.6", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("omap_timer.7", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("omap_timer.8", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("4a318000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("48032000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("48034000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("48036000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("4803e000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("48086000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("48088000.timer", "timer_sys_ck", &sys_clkin_ck, CK_443X),
|
|
|
+ CLK("40138000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("4013a000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("4013c000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK("4013e000.timer", "timer_sys_ck", &syc_clk_div_ck, CK_443X),
|
|
|
+ CLK(NULL, "cpufreq_ck", &dpll_mpu_ck, CK_443X),
|
|
|
+};
|
|
|
+
|
|
|
+static const char *enable_init_clks[] = {
|
|
|
+ "emif1_fck",
|
|
|
+ "emif2_fck",
|
|
|
+ "gpmc_ick",
|
|
|
+ "l3_instr_ick",
|
|
|
+ "l3_main_3_ick",
|
|
|
+ "ocp_wp_noc_ick",
|
|
|
+};
|
|
|
+
|
|
|
+int __init omap4xxx_clk_init(void)
|
|
|
+{
|
|
|
+ u32 cpu_clkflg;
|
|
|
+ struct omap_clk *c;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ if (cpu_is_omap443x()) {
|
|
|
+ cpu_mask = RATE_IN_4430;
|
|
|
+ cpu_clkflg = CK_443X;
|
|
|
+ } else if (cpu_is_omap446x() || cpu_is_omap447x()) {
|
|
|
+ cpu_mask = RATE_IN_4460 | RATE_IN_4430;
|
|
|
+ cpu_clkflg = CK_446X | CK_443X;
|
|
|
+
|
|
|
+ if (cpu_is_omap447x())
|
|
|
+ pr_warn("WARNING: OMAP4470 clock data incomplete!\n");
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (c = omap44xx_clks; c < omap44xx_clks + ARRAY_SIZE(omap44xx_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));
|
|
|
+
|
|
|
+ /*
|
|
|
+ * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power
|
|
|
+ * state when turning the ABE clock domain. Workaround this by
|
|
|
+ * locking the ABE DPLL on boot.
|
|
|
+ * Lock the ABE DPLL in any case to avoid issues with audio.
|
|
|
+ */
|
|
|
+ rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck);
|
|
|
+ if (!rc)
|
|
|
+ rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ);
|
|
|
+ if (rc)
|
|
|
+ pr_err("%s: failed to configure ABE DPLL!\n", __func__);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|