Message ID | 1386657900-12132-5-git-send-email-shobhit.kumar@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 10 Dec 2013, Shobhit Kumar <shobhit.kumar@intel.com> wrote: > 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 > I think this could be simplified still, but that's bikeshedding... Reviewed-by: Jani Nikula <jani.nikula@intel.com> > Signed-off-by: Vijayakumar Balakrishnan <vijayakumar.balakrishnan@intel.com> > Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com> > --- > drivers/gpu/drm/i915/intel_dsi_pll.c | 30 ++++++++++++++++++++---------- > 1 file changed, 20 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c > index 0d1b17f..ba79ec1 100644 > --- a/drivers/gpu/drm/i915/intel_dsi_pll.c > +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c > @@ -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]; > -- > 1.8.3.2 >
diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c index 0d1b17f..ba79ec1 100644 --- a/drivers/gpu/drm/i915/intel_dsi_pll.c +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c @@ -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];