Commit 586f49dc authored by Jesse Barnes's avatar Jesse Barnes Committed by Daniel Vetter

drm/i915/vlv: split CCK and DDR freq usage

It's possible that the CCK clock could run at a different rate than the
DDR clock, so use the same method to get CCK as the GMBUS code does when
calculating the new CDclk divider in the VLV display code.
Reported-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 30a970c6
...@@ -3894,24 +3894,17 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc) ...@@ -3894,24 +3894,17 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc)
I915_WRITE(BCLRPAT(crtc->pipe), 0); I915_WRITE(BCLRPAT(crtc->pipe), 0);
} }
static int valleyview_get_vco(struct drm_i915_private *dev_priv) int valleyview_get_vco(struct drm_i915_private *dev_priv)
{ {
int vco; int hpll_freq, vco_freq[] = { 800, 1600, 2000, 2400 };
switch (dev_priv->mem_freq) { /* Obtain SKU information */
default: mutex_lock(&dev_priv->dpio_lock);
case 800: hpll_freq = vlv_cck_read(dev_priv, CCK_FUSE_REG) &
vco = 800; CCK_FUSE_HPLL_FREQ_MASK;
break; mutex_unlock(&dev_priv->dpio_lock);
case 1066:
vco = 1600;
break;
case 1333:
vco = 2000;
break;
}
return vco; return vco_freq[hpll_freq];
} }
/* Adjust CDclk dividers to allow high res or save power if possible */ /* Adjust CDclk dividers to allow high res or save power if possible */
......
...@@ -693,7 +693,7 @@ void i915_disable_vga_mem(struct drm_device *dev); ...@@ -693,7 +693,7 @@ void i915_disable_vga_mem(struct drm_device *dev);
void hsw_enable_ips(struct intel_crtc *crtc); void hsw_enable_ips(struct intel_crtc *crtc);
void hsw_disable_ips(struct intel_crtc *crtc); void hsw_disable_ips(struct intel_crtc *crtc);
void intel_display_set_init_power(struct drm_device *dev, bool enable); void intel_display_set_init_power(struct drm_device *dev, bool enable);
int valleyview_get_vco(struct drm_i915_private *dev_priv);
/* intel_dp.c */ /* intel_dp.c */
void intel_dp_init(struct drm_device *dev, int output_reg, enum port port); void intel_dp_init(struct drm_device *dev, int output_reg, enum port port);
......
...@@ -82,16 +82,11 @@ static int get_disp_clk_div(struct drm_i915_private *dev_priv, ...@@ -82,16 +82,11 @@ static int get_disp_clk_div(struct drm_i915_private *dev_priv,
static void gmbus_set_freq(struct drm_i915_private *dev_priv) static void gmbus_set_freq(struct drm_i915_private *dev_priv)
{ {
int vco_freq[] = { 800, 1600, 2000, 2400 }; int vco, gmbus_freq = 0, cdclk_div;
int gmbus_freq = 0, cdclk_div, hpll_freq;
BUG_ON(!IS_VALLEYVIEW(dev_priv->dev)); BUG_ON(!IS_VALLEYVIEW(dev_priv->dev));
/* Obtain SKU information */ vco = valleyview_get_vco(dev_priv);
mutex_lock(&dev_priv->dpio_lock);
hpll_freq =
vlv_cck_read(dev_priv, CCK_FUSE_REG) & CCK_FUSE_HPLL_FREQ_MASK;
mutex_unlock(&dev_priv->dpio_lock);
/* Get the CDCLK divide ratio */ /* Get the CDCLK divide ratio */
cdclk_div = get_disp_clk_div(dev_priv, CDCLK); cdclk_div = get_disp_clk_div(dev_priv, CDCLK);
...@@ -102,7 +97,7 @@ static void gmbus_set_freq(struct drm_i915_private *dev_priv) ...@@ -102,7 +97,7 @@ static void gmbus_set_freq(struct drm_i915_private *dev_priv)
* in fact 1MHz is the correct frequency. * in fact 1MHz is the correct frequency.
*/ */
if (cdclk_div) if (cdclk_div)
gmbus_freq = (vco_freq[hpll_freq] << 1) / cdclk_div; gmbus_freq = (vco << 1) / cdclk_div;
if (WARN_ON(gmbus_freq == 0)) if (WARN_ON(gmbus_freq == 0))
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment