|
@@ -557,3 +557,200 @@ DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m5x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
|
|
|
0x0, OMAP4430_CM_DIV_M5_DPLL_PER,
|
|
|
OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
|
|
|
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m6x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_DIV_M6_DPLL_PER,
|
|
|
+ OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m7x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_DIV_M7_DPLL_PER,
|
|
|
+ OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(usb_hs_clk_div_ck, "dpll_abe_m3x2_ck",
|
|
|
+ &dpll_abe_m3x2_ck, 0x0, 1, 3);
|
|
|
+
|
|
|
+/* DPLL_USB */
|
|
|
+static struct dpll_data dpll_usb_dd = {
|
|
|
+ .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_USB,
|
|
|
+ .clk_bypass = &usb_hs_clk_div_ck,
|
|
|
+ .flags = DPLL_J_TYPE,
|
|
|
+ .clk_ref = &sys_clkin_ck,
|
|
|
+ .control_reg = OMAP4430_CM_CLKMODE_DPLL_USB,
|
|
|
+ .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
|
|
+ .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB,
|
|
|
+ .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB,
|
|
|
+ .mult_mask = OMAP4430_DPLL_MULT_USB_MASK,
|
|
|
+ .div1_mask = OMAP4430_DPLL_DIV_0_7_MASK,
|
|
|
+ .enable_mask = OMAP4430_DPLL_EN_MASK,
|
|
|
+ .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
|
|
|
+ .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
|
|
|
+ .sddiv_mask = OMAP4430_DPLL_SD_DIV_MASK,
|
|
|
+ .max_multiplier = 4095,
|
|
|
+ .max_divider = 256,
|
|
|
+ .min_divider = 1,
|
|
|
+};
|
|
|
+
|
|
|
+static const char *dpll_usb_ck_parents[] = {
|
|
|
+ "sys_clkin_ck", "usb_hs_clk_div_ck"
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dpll_usb_ck;
|
|
|
+
|
|
|
+static struct clk_hw_omap dpll_usb_ck_hw = {
|
|
|
+ .hw = {
|
|
|
+ .clk = &dpll_usb_ck,
|
|
|
+ },
|
|
|
+ .dpll_data = &dpll_usb_dd,
|
|
|
+ .ops = &clkhwops_omap3_dpll,
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_STRUCT_CLK(dpll_usb_ck, dpll_usb_ck_parents, dpll_ck_ops);
|
|
|
+
|
|
|
+static const char *dpll_usb_clkdcoldo_ck_parents[] = {
|
|
|
+ "dpll_usb_ck",
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dpll_usb_clkdcoldo_ck;
|
|
|
+
|
|
|
+static const struct clk_ops dpll_usb_clkdcoldo_ck_ops = {
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk_hw_omap dpll_usb_clkdcoldo_ck_hw = {
|
|
|
+ .hw = {
|
|
|
+ .clk = &dpll_usb_clkdcoldo_ck,
|
|
|
+ },
|
|
|
+ .clksel_reg = OMAP4430_CM_CLKDCOLDO_DPLL_USB,
|
|
|
+ .ops = &clkhwops_omap4_dpllmx,
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_STRUCT_CLK(dpll_usb_clkdcoldo_ck, dpll_usb_clkdcoldo_ck_parents,
|
|
|
+ dpll_usb_clkdcoldo_ck_ops);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_usb_m2_ck, "dpll_usb_ck", &dpll_usb_ck, 0x0,
|
|
|
+ OMAP4430_CM_DIV_M2_DPLL_USB,
|
|
|
+ OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK);
|
|
|
+
|
|
|
+static const char *ducati_clk_mux_ck_parents[] = {
|
|
|
+ "div_core_ck", "dpll_per_m6x2_ck",
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_CLK_MUX(ducati_clk_mux_ck, ducati_clk_mux_ck_parents, NULL, 0x0,
|
|
|
+ OMAP4430_CM_CLKSEL_DUCATI_ISS_ROOT, OMAP4430_CLKSEL_0_0_SHIFT,
|
|
|
+ OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(func_12m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
|
|
|
+ 0x0, 1, 16);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(func_24m_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0,
|
|
|
+ 1, 4);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(func_24mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
|
|
|
+ 0x0, 1, 8);
|
|
|
+
|
|
|
+static const struct clk_div_table func_48m_fclk_rates[] = {
|
|
|
+ { .div = 4, .val = 0 },
|
|
|
+ { .div = 8, .val = 1 },
|
|
|
+ { .div = 0 },
|
|
|
+};
|
|
|
+DEFINE_CLK_DIVIDER_TABLE(func_48m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
|
|
|
+ OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_48m_fclk_rates,
|
|
|
+ NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(func_48mc_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
|
|
|
+ 0x0, 1, 4);
|
|
|
+
|
|
|
+static const struct clk_div_table func_64m_fclk_rates[] = {
|
|
|
+ { .div = 2, .val = 0 },
|
|
|
+ { .div = 4, .val = 1 },
|
|
|
+ { .div = 0 },
|
|
|
+};
|
|
|
+DEFINE_CLK_DIVIDER_TABLE(func_64m_fclk, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
|
|
|
+ OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_64m_fclk_rates,
|
|
|
+ NULL);
|
|
|
+
|
|
|
+static const struct clk_div_table func_96m_fclk_rates[] = {
|
|
|
+ { .div = 2, .val = 0 },
|
|
|
+ { .div = 4, .val = 1 },
|
|
|
+ { .div = 0 },
|
|
|
+};
|
|
|
+DEFINE_CLK_DIVIDER_TABLE(func_96m_fclk, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
|
|
|
+ OMAP4430_SCALE_FCLK_WIDTH, 0x0, func_96m_fclk_rates,
|
|
|
+ NULL);
|
|
|
+
|
|
|
+static const struct clk_div_table init_60m_fclk_rates[] = {
|
|
|
+ { .div = 1, .val = 0 },
|
|
|
+ { .div = 8, .val = 1 },
|
|
|
+ { .div = 0 },
|
|
|
+};
|
|
|
+DEFINE_CLK_DIVIDER_TABLE(init_60m_fclk, "dpll_usb_m2_ck", &dpll_usb_m2_ck,
|
|
|
+ 0x0, OMAP4430_CM_CLKSEL_USB_60MHZ,
|
|
|
+ OMAP4430_CLKSEL_0_0_SHIFT, OMAP4430_CLKSEL_0_0_WIDTH,
|
|
|
+ 0x0, init_60m_fclk_rates, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_DIVIDER(l3_div_ck, "div_core_ck", &div_core_ck, 0x0,
|
|
|
+ OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L3_SHIFT,
|
|
|
+ OMAP4430_CLKSEL_L3_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_DIVIDER(l4_div_ck, "l3_div_ck", &l3_div_ck, 0x0,
|
|
|
+ OMAP4430_CM_CLKSEL_CORE, OMAP4430_CLKSEL_L4_SHIFT,
|
|
|
+ OMAP4430_CLKSEL_L4_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(lp_clk_div_ck, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
|
|
|
+ 0x0, 1, 16);
|
|
|
+
|
|
|
+static const char *l4_wkup_clk_mux_ck_parents[] = {
|
|
|
+ "sys_clkin_ck", "lp_clk_div_ck",
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_CLK_MUX(l4_wkup_clk_mux_ck, l4_wkup_clk_mux_ck_parents, NULL, 0x0,
|
|
|
+ OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
|
|
|
+ OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+static const struct clk_div_table ocp_abe_iclk_rates[] = {
|
|
|
+ { .div = 2, .val = 0 },
|
|
|
+ { .div = 1, .val = 1 },
|
|
|
+ { .div = 0 },
|
|
|
+};
|
|
|
+DEFINE_CLK_DIVIDER_TABLE(ocp_abe_iclk, "aess_fclk", &aess_fclk, 0x0,
|
|
|
+ OMAP4430_CM1_ABE_AESS_CLKCTRL,
|
|
|
+ OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
|
|
|
+ OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
|
|
|
+ 0x0, ocp_abe_iclk_rates, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(per_abe_24m_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck,
|
|
|
+ 0x0, 1, 4);
|
|
|
+
|
|
|
+DEFINE_CLK_DIVIDER(per_abe_nc_fclk, "dpll_abe_m2_ck", &dpll_abe_m2_ck, 0x0,
|
|
|
+ OMAP4430_CM_SCALE_FCLK, OMAP4430_SCALE_FCLK_SHIFT,
|
|
|
+ OMAP4430_SCALE_FCLK_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_DIVIDER(syc_clk_div_ck, "sys_clkin_ck", &sys_clkin_ck, 0x0,
|
|
|
+ OMAP4430_CM_ABE_DSS_SYS_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
|
|
|
+ OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+static const char *dbgclk_mux_ck_parents[] = {
|
|
|
+ "sys_clkin_ck"
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dbgclk_mux_ck;
|
|
|
+DEFINE_STRUCT_CLK_HW_OMAP(dbgclk_mux_ck, NULL);
|
|
|
+DEFINE_STRUCT_CLK(dbgclk_mux_ck, dbgclk_mux_ck_parents,
|
|
|
+ dpll_usb_clkdcoldo_ck_ops);
|
|
|
+
|
|
|
+/* Leaf clocks controlled by modules */
|
|
|
+
|
|
|
+DEFINE_CLK_GATE(aes1_fck, "l3_div_ck", &l3_div_ck, 0x0,
|
|
|
+ OMAP4430_CM_L4SEC_AES1_CLKCTRL,
|
|
|
+ OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_GATE(aes2_fck, "l3_div_ck", &l3_div_ck, 0x0,
|
|
|
+ OMAP4430_CM_L4SEC_AES2_CLKCTRL,
|
|
|
+ OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_GATE(aess_fck, "aess_fclk", &aess_fclk, 0x0,
|
|
|
+ OMAP4430_CM1_ABE_AESS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT,
|
|
|
+ 0x0, NULL);
|
|
|
+
|
|
|
+DEFINE_CLK_GATE(bandgap_fclk, "sys_32k_ck", &sys_32k_ck, 0x0,
|