|
|
@@ -5001,24 +5001,23 @@ static void cherryview_set_cdclk(struct drm_device *dev, int cdclk)
|
|
|
WARN_ON(dev_priv->display.get_display_clock_speed(dev) != dev_priv->vlv_cdclk_freq);
|
|
|
|
|
|
switch (cdclk) {
|
|
|
- case 400000:
|
|
|
- cmd = 3;
|
|
|
- break;
|
|
|
case 333333:
|
|
|
case 320000:
|
|
|
- cmd = 2;
|
|
|
- break;
|
|
|
case 266667:
|
|
|
- cmd = 1;
|
|
|
- break;
|
|
|
case 200000:
|
|
|
- cmd = 0;
|
|
|
break;
|
|
|
default:
|
|
|
MISSING_CASE(cdclk);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Specs are full of misinformation, but testing on actual
|
|
|
+ * hardware has shown that we just need to write the desired
|
|
|
+ * CCK divider into the Punit register.
|
|
|
+ */
|
|
|
+ cmd = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
|
|
|
+
|
|
|
mutex_lock(&dev_priv->rps.hw_lock);
|
|
|
val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
|
|
|
val &= ~DSPFREQGUAR_MASK_CHV;
|
|
|
@@ -5040,10 +5039,6 @@ static int valleyview_calc_cdclk(struct drm_i915_private *dev_priv,
|
|
|
int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ? 333333 : 320000;
|
|
|
int limit = IS_CHERRYVIEW(dev_priv) ? 95 : 90;
|
|
|
|
|
|
- /* FIXME: Punit isn't quite ready yet */
|
|
|
- if (IS_CHERRYVIEW(dev_priv->dev))
|
|
|
- return 400000;
|
|
|
-
|
|
|
/*
|
|
|
* Really only a few cases to deal with, as only 4 CDclks are supported:
|
|
|
* 200MHz
|
|
|
@@ -5719,10 +5714,6 @@ static int valleyview_get_display_clock_speed(struct drm_device *dev)
|
|
|
u32 val;
|
|
|
int divider;
|
|
|
|
|
|
- /* FIXME: Punit isn't quite ready yet */
|
|
|
- if (IS_CHERRYVIEW(dev))
|
|
|
- return 400000;
|
|
|
-
|
|
|
if (dev_priv->hpll_freq == 0)
|
|
|
dev_priv->hpll_freq = valleyview_get_vco(dev_priv);
|
|
|
|