|
@@ -116,6 +116,18 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
|
|
div = DIV_ROUND_UP(prate, mode_rate);
|
|
div = DIV_ROUND_UP(prate, mode_rate);
|
|
if (ATMEL_HLCDC_CLKDIV(div) & ~ATMEL_HLCDC_CLKDIV_MASK)
|
|
if (ATMEL_HLCDC_CLKDIV(div) & ~ATMEL_HLCDC_CLKDIV_MASK)
|
|
div = ATMEL_HLCDC_CLKDIV_MASK;
|
|
div = ATMEL_HLCDC_CLKDIV_MASK;
|
|
|
|
+ } else {
|
|
|
|
+ int div_low = prate / mode_rate;
|
|
|
|
+
|
|
|
|
+ if (div_low >= 2 &&
|
|
|
|
+ ((prate / div_low - mode_rate) <
|
|
|
|
+ 10 * (mode_rate - prate / div)))
|
|
|
|
+ /*
|
|
|
|
+ * At least 10 times better when using a higher
|
|
|
|
+ * frequency than requested, instead of a lower.
|
|
|
|
+ * So, go with that.
|
|
|
|
+ */
|
|
|
|
+ div = div_low;
|
|
}
|
|
}
|
|
|
|
|
|
cfg |= ATMEL_HLCDC_CLKDIV(div);
|
|
cfg |= ATMEL_HLCDC_CLKDIV(div);
|