|
@@ -398,3 +398,162 @@ static struct clk_hw_omap dpll_iva_ck_hw = {
|
|
|
|
|
|
DEFINE_STRUCT_CLK(dpll_iva_ck, dpll_iva_ck_parents, dpll_ck_ops);
|
|
|
|
|
|
+static const char *dpll_iva_x2_ck_parents[] = {
|
|
|
+ "dpll_iva_ck",
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dpll_iva_x2_ck;
|
|
|
+
|
|
|
+static struct clk_hw_omap dpll_iva_x2_ck_hw = {
|
|
|
+ .hw = {
|
|
|
+ .clk = &dpll_iva_x2_ck,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_STRUCT_CLK(dpll_iva_x2_ck, dpll_iva_x2_ck_parents, dpll_abe_x2_ck_ops);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m4x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_DIV_M4_DPLL_IVA,
|
|
|
+ OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_iva_m5x2_ck, "dpll_iva_x2_ck", &dpll_iva_x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_DIV_M5_DPLL_IVA,
|
|
|
+ OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK);
|
|
|
+
|
|
|
+/* DPLL_MPU */
|
|
|
+static struct dpll_data dpll_mpu_dd = {
|
|
|
+ .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_MPU,
|
|
|
+ .clk_bypass = &div_mpu_hs_clk,
|
|
|
+ .clk_ref = &sys_clkin_ck,
|
|
|
+ .control_reg = OMAP4430_CM_CLKMODE_DPLL_MPU,
|
|
|
+ .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
|
|
+ .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_MPU,
|
|
|
+ .idlest_reg = OMAP4430_CM_IDLEST_DPLL_MPU,
|
|
|
+ .mult_mask = OMAP4430_DPLL_MULT_MASK,
|
|
|
+ .div1_mask = OMAP4430_DPLL_DIV_MASK,
|
|
|
+ .enable_mask = OMAP4430_DPLL_EN_MASK,
|
|
|
+ .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
|
|
|
+ .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
|
|
|
+ .max_multiplier = 2047,
|
|
|
+ .max_divider = 128,
|
|
|
+ .min_divider = 1,
|
|
|
+};
|
|
|
+
|
|
|
+static const char *dpll_mpu_ck_parents[] = {
|
|
|
+ "sys_clkin_ck", "div_mpu_hs_clk"
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dpll_mpu_ck;
|
|
|
+
|
|
|
+static struct clk_hw_omap dpll_mpu_ck_hw = {
|
|
|
+ .hw = {
|
|
|
+ .clk = &dpll_mpu_ck,
|
|
|
+ },
|
|
|
+ .dpll_data = &dpll_mpu_dd,
|
|
|
+ .ops = &clkhwops_omap3_dpll,
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_STRUCT_CLK(dpll_mpu_ck, dpll_mpu_ck_parents, dpll_ck_ops);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(mpu_periphclk, "dpll_mpu_ck", &dpll_mpu_ck, 0x0, 1, 2);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_mpu_m2_ck, "dpll_mpu_ck", &dpll_mpu_ck, 0x0,
|
|
|
+ OMAP4430_CM_DIV_M2_DPLL_MPU,
|
|
|
+ OMAP4430_DPLL_CLKOUT_DIV_MASK);
|
|
|
+
|
|
|
+DEFINE_CLK_FIXED_FACTOR(per_hs_clk_div_ck, "dpll_abe_m3x2_ck",
|
|
|
+ &dpll_abe_m3x2_ck, 0x0, 1, 2);
|
|
|
+
|
|
|
+static const char *per_hsd_byp_clk_mux_ck_parents[] = {
|
|
|
+ "sys_clkin_ck", "per_hs_clk_div_ck",
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_CLK_MUX(per_hsd_byp_clk_mux_ck, per_hsd_byp_clk_mux_ck_parents, NULL,
|
|
|
+ 0x0, OMAP4430_CM_CLKSEL_DPLL_PER, OMAP4430_DPLL_BYP_CLKSEL_SHIFT,
|
|
|
+ OMAP4430_DPLL_BYP_CLKSEL_WIDTH, 0x0, NULL);
|
|
|
+
|
|
|
+/* DPLL_PER */
|
|
|
+static struct dpll_data dpll_per_dd = {
|
|
|
+ .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_PER,
|
|
|
+ .clk_bypass = &per_hsd_byp_clk_mux_ck,
|
|
|
+ .clk_ref = &sys_clkin_ck,
|
|
|
+ .control_reg = OMAP4430_CM_CLKMODE_DPLL_PER,
|
|
|
+ .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
|
|
|
+ .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_PER,
|
|
|
+ .idlest_reg = OMAP4430_CM_IDLEST_DPLL_PER,
|
|
|
+ .mult_mask = OMAP4430_DPLL_MULT_MASK,
|
|
|
+ .div1_mask = OMAP4430_DPLL_DIV_MASK,
|
|
|
+ .enable_mask = OMAP4430_DPLL_EN_MASK,
|
|
|
+ .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
|
|
|
+ .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
|
|
|
+ .max_multiplier = 2047,
|
|
|
+ .max_divider = 128,
|
|
|
+ .min_divider = 1,
|
|
|
+};
|
|
|
+
|
|
|
+static const char *dpll_per_ck_parents[] = {
|
|
|
+ "sys_clkin_ck", "per_hsd_byp_clk_mux_ck"
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dpll_per_ck;
|
|
|
+
|
|
|
+static struct clk_hw_omap dpll_per_ck_hw = {
|
|
|
+ .hw = {
|
|
|
+ .clk = &dpll_per_ck,
|
|
|
+ },
|
|
|
+ .dpll_data = &dpll_per_dd,
|
|
|
+ .ops = &clkhwops_omap3_dpll,
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_STRUCT_CLK(dpll_per_ck, dpll_per_ck_parents, dpll_ck_ops);
|
|
|
+
|
|
|
+DEFINE_CLK_DIVIDER(dpll_per_m2_ck, "dpll_per_ck", &dpll_per_ck, 0x0,
|
|
|
+ OMAP4430_CM_DIV_M2_DPLL_PER, OMAP4430_DPLL_CLKOUT_DIV_SHIFT,
|
|
|
+ OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL);
|
|
|
+
|
|
|
+static const char *dpll_per_x2_ck_parents[] = {
|
|
|
+ "dpll_per_ck",
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk dpll_per_x2_ck;
|
|
|
+
|
|
|
+static struct clk_hw_omap dpll_per_x2_ck_hw = {
|
|
|
+ .hw = {
|
|
|
+ .clk = &dpll_per_x2_ck,
|
|
|
+ },
|
|
|
+ .flags = CLOCK_CLKOUTX2,
|
|
|
+ .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER,
|
|
|
+ .ops = &clkhwops_omap4_dpllmx,
|
|
|
+};
|
|
|
+
|
|
|
+DEFINE_STRUCT_CLK(dpll_per_x2_ck, dpll_per_x2_ck_parents, dpll_abe_x2_ck_ops);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m2x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_DIV_M2_DPLL_PER,
|
|
|
+ OMAP4430_DPLL_CLKOUT_DIV_MASK);
|
|
|
+
|
|
|
+static const char *dpll_per_m3x2_ck_parents[] = {
|
|
|
+ "dpll_per_x2_ck",
|
|
|
+};
|
|
|
+
|
|
|
+static const struct clksel dpll_per_m3x2_div[] = {
|
|
|
+ { .parent = &dpll_per_x2_ck, .rates = div31_1to31_rates },
|
|
|
+ { .parent = NULL },
|
|
|
+};
|
|
|
+
|
|
|
+/* XXX Missing round_rate, set_rate in ops */
|
|
|
+DEFINE_CLK_OMAP_MUX_GATE(dpll_per_m3x2_ck, NULL, dpll_per_m3x2_div,
|
|
|
+ OMAP4430_CM_DIV_M3_DPLL_PER,
|
|
|
+ OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
|
|
|
+ OMAP4430_CM_DIV_M3_DPLL_PER,
|
|
|
+ OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL,
|
|
|
+ dpll_per_m3x2_ck_parents, dmic_fck_ops);
|
|
|
+
|
|
|
+DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m4x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck,
|
|
|
+ 0x0, OMAP4430_CM_DIV_M4_DPLL_PER,
|
|
|
+ OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK);
|
|
|
+
|
|
|
+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);
|
|
|
+
|