Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e1eed5a authored by Shobhit Kumar's avatar Shobhit Kumar Committed by Daniel Vetter
Browse files

drm/i915: Try harder to get best m, n, p values with minimal error



Basically check for both +ive and -ive deviation from target clock and
pick the one with minimal error. If we get a direct match, break from
loop to acheive some optimization.

v2: Use signed variable for target and calculated dsi clock values

Signed-off-by: default avatarVijayakumar Balakrishnan <vijayakumar.balakrishnan@intel.com>
Signed-off-by: default avatarShobhit Kumar <shobhit.kumar@intel.com>
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 44d4c6ee
Loading
Loading
Loading
Loading
+20 −10
Original line number Original line Diff line number Diff line
@@ -169,8 +169,8 @@ static int dsi_calc_mnp(u32 dsi_clk, struct dsi_mnp *dsi_mnp)
	u32 ref_clk;
	u32 ref_clk;
	u32 error;
	u32 error;
	u32 tmp_error;
	u32 tmp_error;
	u32 target_dsi_clk;
	int target_dsi_clk;
	u32 calc_dsi_clk;
	int calc_dsi_clk;
	u32 calc_m;
	u32 calc_m;
	u32 calc_p;
	u32 calc_p;
	u32 m_seed;
	u32 m_seed;
@@ -184,22 +184,32 @@ static int dsi_calc_mnp(u32 dsi_clk, struct dsi_mnp *dsi_mnp)
	ref_clk = 25000;
	ref_clk = 25000;
	target_dsi_clk = dsi_clk;
	target_dsi_clk = dsi_clk;
	error = 0xFFFFFFFF;
	error = 0xFFFFFFFF;
	tmp_error = 0xFFFFFFFF;
	calc_m = 0;
	calc_m = 0;
	calc_p = 0;
	calc_p = 0;


	for (m = 62; m <= 92; m++) {
	for (m = 62; m <= 92; m++) {
		for (p = 2; p <= 6; p++) {
		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;
			calc_dsi_clk = (m * ref_clk) / p;
			if (calc_dsi_clk >= target_dsi_clk) {
			if (calc_dsi_clk == target_dsi_clk) {
				tmp_error = 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) {
			if (tmp_error < error) {
				error = tmp_error;
				error = tmp_error;
				calc_m = m;
				calc_m = m;
				calc_p = p;
				calc_p = p;
			}
			}
		}
		}
		}

		if (error == 0)
			break;
	}
	}


	m_seed = lfsr_converts[calc_m - 62];
	m_seed = lfsr_converts[calc_m - 62];