|
@@ -343,3 +343,184 @@ DEFINE_CLK_FIXED_FACTOR(clk_24mhz, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0, 1,
|
|
|
/*
|
|
|
* 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,
|