|
@@ -4030,37 +4030,35 @@ static void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
|
|
|
/* Program iCLKIP clock to the desired frequency */
|
|
|
static void lpt_program_iclkip(struct drm_crtc *crtc)
|
|
|
{
|
|
|
- struct drm_device *dev = crtc->dev;
|
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
|
|
|
int clock = to_intel_crtc(crtc)->config->base.adjusted_mode.crtc_clock;
|
|
|
u32 divsel, phaseinc, auxdiv, phasedir = 0;
|
|
|
u32 temp;
|
|
|
|
|
|
lpt_disable_iclkip(dev_priv);
|
|
|
|
|
|
- /* 20MHz is a corner case which is out of range for the 7-bit divisor */
|
|
|
- if (clock == 20000) {
|
|
|
- auxdiv = 1;
|
|
|
- divsel = 0x41;
|
|
|
- phaseinc = 0x20;
|
|
|
- } else {
|
|
|
- /* The iCLK virtual clock root frequency is in MHz,
|
|
|
- * but the adjusted_mode->crtc_clock in in KHz. To get the
|
|
|
- * divisors, it is necessary to divide one by another, so we
|
|
|
- * convert the virtual clock precision to KHz here for higher
|
|
|
- * precision.
|
|
|
- */
|
|
|
+ /* The iCLK virtual clock root frequency is in MHz,
|
|
|
+ * but the adjusted_mode->crtc_clock in in KHz. To get the
|
|
|
+ * divisors, it is necessary to divide one by another, so we
|
|
|
+ * convert the virtual clock precision to KHz here for higher
|
|
|
+ * precision.
|
|
|
+ */
|
|
|
+ for (auxdiv = 0; auxdiv < 2; auxdiv++) {
|
|
|
u32 iclk_virtual_root_freq = 172800 * 1000;
|
|
|
u32 iclk_pi_range = 64;
|
|
|
- u32 desired_divisor, msb_divisor_value, pi_value;
|
|
|
+ u32 desired_divisor;
|
|
|
|
|
|
- desired_divisor = DIV_ROUND_CLOSEST(iclk_virtual_root_freq, clock);
|
|
|
- msb_divisor_value = desired_divisor / iclk_pi_range;
|
|
|
- pi_value = desired_divisor % iclk_pi_range;
|
|
|
+ desired_divisor = DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
|
|
|
+ clock << auxdiv);
|
|
|
+ divsel = (desired_divisor / iclk_pi_range) - 2;
|
|
|
+ phaseinc = desired_divisor % iclk_pi_range;
|
|
|
|
|
|
- auxdiv = 0;
|
|
|
- divsel = msb_divisor_value - 2;
|
|
|
- phaseinc = pi_value;
|
|
|
+ /*
|
|
|
+ * Near 20MHz is a corner case which is
|
|
|
+ * out of range for the 7-bit divisor
|
|
|
+ */
|
|
|
+ if (divsel <= 0x7f)
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
/* This should not happen with any sane values */
|