aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-02-17 14:41:12 -0500
committerVille Syrjälä <ville.syrjala@linux.intel.com>2016-03-01 06:05:43 -0500
commit8802e5b6de51ebbedb8a03e816ca847d860e07f5 (patch)
treed3cb271f5380db637bb7a750fd0219ef9dd4266d /drivers/gpu/drm/i915/intel_display.c
parent64b46a06313634cf9ce5808ebd63dc82573be34c (diff)
drm/i915: Read out VGA dotclock properly on LPT
Rather than assume the VGA dotclock is really the FDI based thing, let's read out the real thing via iclkip, and after readout it'll get to compare it with the FDI based number to make sure they're in sync. Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1455738073-14502-6-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Imre Deak <imre.deak@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 1f3552397689..44fcff0343f2 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4105,6 +4105,43 @@ static void lpt_program_iclkip(struct drm_crtc *crtc)
4105 I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE); 4105 I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE);
4106} 4106}
4107 4107
4108int lpt_get_iclkip(struct drm_i915_private *dev_priv)
4109{
4110 u32 divsel, phaseinc, auxdiv;
4111 u32 iclk_virtual_root_freq = 172800 * 1000;
4112 u32 iclk_pi_range = 64;
4113 u32 desired_divisor;
4114 u32 temp;
4115
4116 if ((I915_READ(PIXCLK_GATE) & PIXCLK_GATE_UNGATE) == 0)
4117 return 0;
4118
4119 mutex_lock(&dev_priv->sb_lock);
4120
4121 temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
4122 if (temp & SBI_SSCCTL_DISABLE) {
4123 mutex_unlock(&dev_priv->sb_lock);
4124 return 0;
4125 }
4126
4127 temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
4128 divsel = (temp & SBI_SSCDIVINTPHASE_DIVSEL_MASK) >>
4129 SBI_SSCDIVINTPHASE_DIVSEL_SHIFT;
4130 phaseinc = (temp & SBI_SSCDIVINTPHASE_INCVAL_MASK) >>
4131 SBI_SSCDIVINTPHASE_INCVAL_SHIFT;
4132
4133 temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
4134 auxdiv = (temp & SBI_SSCAUXDIV_FINALDIV2SEL_MASK) >>
4135 SBI_SSCAUXDIV_FINALDIV2SEL_SHIFT;
4136
4137 mutex_unlock(&dev_priv->sb_lock);
4138
4139 desired_divisor = (divsel + 2) * iclk_pi_range + phaseinc;
4140
4141 return DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
4142 desired_divisor << auxdiv);
4143}
4144
4108static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, 4145static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc,
4109 enum pipe pch_transcoder) 4146 enum pipe pch_transcoder)
4110{ 4147{