|
@@ -245,9 +245,9 @@ static void sun4i_get_pll5_factors(u32 *freq, u32 parent_rate,
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * sun6i_a31_get_pll6_factors() - calculates n, k factors for A31 PLL6
|
|
|
- * PLL6 rate is calculated as follows
|
|
|
- * rate = parent_rate * n * (k + 1) / 2
|
|
|
+ * sun6i_a31_get_pll6_factors() - calculates n, k factors for A31 PLL6x2
|
|
|
+ * PLL6x2 rate is calculated as follows
|
|
|
+ * rate = parent_rate * (n + 1) * (k + 1)
|
|
|
* parent_rate is always 24Mhz
|
|
|
*/
|
|
|
|
|
@@ -256,13 +256,7 @@ static void sun6i_a31_get_pll6_factors(u32 *freq, u32 parent_rate,
|
|
|
{
|
|
|
u8 div;
|
|
|
|
|
|
- /*
|
|
|
- * We always have 24MHz / 2, so we can just say that our
|
|
|
- * parent clock is 12MHz.
|
|
|
- */
|
|
|
- parent_rate = parent_rate / 2;
|
|
|
-
|
|
|
- /* Normalize value to a parent_rate multiple (24M / 2) */
|
|
|
+ /* Normalize value to a parent_rate multiple (24M) */
|
|
|
div = *freq / parent_rate;
|
|
|
*freq = parent_rate * div;
|
|
|
|
|
@@ -274,7 +268,7 @@ static void sun6i_a31_get_pll6_factors(u32 *freq, u32 parent_rate,
|
|
|
if (*k > 3)
|
|
|
*k = 3;
|
|
|
|
|
|
- *n = DIV_ROUND_UP(div, (*k+1));
|
|
|
+ *n = DIV_ROUND_UP(div, (*k+1)) - 1;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -445,6 +439,7 @@ static struct clk_factors_config sun6i_a31_pll6_config = {
|
|
|
.nwidth = 5,
|
|
|
.kshift = 4,
|
|
|
.kwidth = 2,
|
|
|
+ .n_start = 1,
|
|
|
};
|
|
|
|
|
|
static struct clk_factors_config sun4i_apb1_config = {
|
|
@@ -504,6 +499,7 @@ static const struct factors_data sun6i_a31_pll6_data __initconst = {
|
|
|
.enable = 31,
|
|
|
.table = &sun6i_a31_pll6_config,
|
|
|
.getter = sun6i_a31_get_pll6_factors,
|
|
|
+ .name = "pll6x2",
|
|
|
};
|
|
|
|
|
|
static const struct factors_data sun4i_apb1_data __initconst = {
|
|
@@ -942,6 +938,14 @@ static const struct divs_data pll6_divs_data __initconst = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+static const struct divs_data sun6i_a31_pll6_divs_data __initconst = {
|
|
|
+ .factors = &sun6i_a31_pll6_data,
|
|
|
+ .ndivs = 1,
|
|
|
+ .div = {
|
|
|
+ { .fixed = 2 }, /* normal output */
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* sunxi_divs_clk_setup() - Setup function for leaf divisors on clocks
|
|
|
*
|
|
@@ -1082,7 +1086,6 @@ static const struct of_device_id clk_factors_match[] __initconst = {
|
|
|
{.compatible = "allwinner,sun6i-a31-pll1-clk", .data = &sun6i_a31_pll1_data,},
|
|
|
{.compatible = "allwinner,sun8i-a23-pll1-clk", .data = &sun8i_a23_pll1_data,},
|
|
|
{.compatible = "allwinner,sun7i-a20-pll4-clk", .data = &sun7i_a20_pll4_data,},
|
|
|
- {.compatible = "allwinner,sun6i-a31-pll6-clk", .data = &sun6i_a31_pll6_data,},
|
|
|
{.compatible = "allwinner,sun4i-a10-apb1-clk", .data = &sun4i_apb1_data,},
|
|
|
{.compatible = "allwinner,sun7i-a20-out-clk", .data = &sun7i_a20_out_data,},
|
|
|
{}
|
|
@@ -1101,6 +1104,7 @@ static const struct of_device_id clk_div_match[] __initconst = {
|
|
|
static const struct of_device_id clk_divs_match[] __initconst = {
|
|
|
{.compatible = "allwinner,sun4i-a10-pll5-clk", .data = &pll5_divs_data,},
|
|
|
{.compatible = "allwinner,sun4i-a10-pll6-clk", .data = &pll6_divs_data,},
|
|
|
+ {.compatible = "allwinner,sun6i-a31-pll6-clk", .data = &sun6i_a31_pll6_divs_data,},
|
|
|
{}
|
|
|
};
|
|
|
|