|
@@ -169,8 +169,8 @@ static int dsi_calc_mnp(u32 dsi_clk, struct dsi_mnp *dsi_mnp)
|
|
|
u32 ref_clk;
|
|
|
u32 error;
|
|
|
u32 tmp_error;
|
|
|
- u32 target_dsi_clk;
|
|
|
- u32 calc_dsi_clk;
|
|
|
+ int target_dsi_clk;
|
|
|
+ int calc_dsi_clk;
|
|
|
u32 calc_m;
|
|
|
u32 calc_p;
|
|
|
u32 m_seed;
|
|
@@ -184,22 +184,32 @@ static int dsi_calc_mnp(u32 dsi_clk, struct dsi_mnp *dsi_mnp)
|
|
|
ref_clk = 25000;
|
|
|
target_dsi_clk = dsi_clk;
|
|
|
error = 0xFFFFFFFF;
|
|
|
+ tmp_error = 0xFFFFFFFF;
|
|
|
calc_m = 0;
|
|
|
calc_p = 0;
|
|
|
|
|
|
for (m = 62; m <= 92; m++) {
|
|
|
for (p = 2; p <= 6; p++) {
|
|
|
-
|
|
|
+ /* Find the optimal m and p divisors
|
|
|
+ with minimal error +/- the required clock */
|
|
|
calc_dsi_clk = (m * ref_clk) / p;
|
|
|
- if (calc_dsi_clk >= target_dsi_clk) {
|
|
|
- tmp_error = calc_dsi_clk - target_dsi_clk;
|
|
|
- if (tmp_error < error) {
|
|
|
- error = tmp_error;
|
|
|
- calc_m = m;
|
|
|
- calc_p = p;
|
|
|
- }
|
|
|
+ if (calc_dsi_clk == target_dsi_clk) {
|
|
|
+ calc_m = m;
|
|
|
+ calc_p = p;
|
|
|
+ error = 0;
|
|
|
+ break;
|
|
|
+ } else
|
|
|
+ tmp_error = abs(target_dsi_clk - calc_dsi_clk);
|
|
|
+
|
|
|
+ if (tmp_error < error) {
|
|
|
+ error = tmp_error;
|
|
|
+ calc_m = m;
|
|
|
+ calc_p = p;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (error == 0)
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
m_seed = lfsr_converts[calc_m - 62];
|