summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/clk/sunxi/clk-sunxi.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
index 692680d1b716..8135e311d38d 100644
--- a/drivers/clk/sunxi/clk-sunxi.c
+++ b/drivers/clk/sunxi/clk-sunxi.c
@@ -305,7 +305,7 @@ static void sun6i_a31_get_pll1_factors(u32 *freq, u32 parent_rate,
const u8 f0[11] = {3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 2^3 * 3^1 */
const u8 N_max = 32; /* 5 bits */
const u8 K_max = 4; /* 2 bits */
- const u8 M_max = 4; /* 2 bits */
+ u8 M_max = 4; /* 2 bits */
u8 N = 1, K = 1, M = 1; /* multiplicators (e.g. N = n+1) */
u32 freq_mhz, tmp;
u8 success;
@@ -314,6 +314,18 @@ static void sun6i_a31_get_pll1_factors(u32 *freq, u32 parent_rate,
freq_mhz = *freq / 1000000;
+ /* Limit (24 MHz * (n+1) * (k+1)) to be less than 2.6 GHz
+ * This is caused by stability issues observed.
+ */
+ if (freq_mhz <= 400)
+ M_max = 4;
+ else if (freq_mhz <= 800)
+ M_max = 3;
+ else if (freq_mhz <= 1200)
+ M_max = 2;
+ else
+ M_max = 1;
+
/* minimum possible frequency is 6 */
if (freq_mhz<6)
freq_mhz = 6;