if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
                min_cdclk = max(2 * 96000, min_cdclk);
 
+       if (min_cdclk > dev_priv->max_cdclk_freq) {
+               DRM_DEBUG_KMS("required cdclk (%d kHz) exceeds max (%d kHz)\n",
+                             min_cdclk, dev_priv->max_cdclk_freq);
+               return -EINVAL;
+       }
+
        return min_cdclk;
 }
 
        struct drm_i915_private *dev_priv = to_i915(state->dev);
        struct intel_crtc *crtc;
        struct intel_crtc_state *crtc_state;
-       int min_cdclk = 0, i;
+       int min_cdclk, i;
        enum pipe pipe;
 
        memcpy(intel_state->min_cdclk, dev_priv->min_cdclk,
               sizeof(intel_state->min_cdclk));
 
-       for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i)
-               intel_state->min_cdclk[i] =
-                       intel_crtc_compute_min_cdclk(crtc_state);
+       for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
+               min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
+               if (min_cdclk < 0)
+                       return min_cdclk;
+
+               intel_state->min_cdclk[i] = min_cdclk;
+       }
 
+       min_cdclk = 0;
        for_each_pipe(dev_priv, pipe)
                min_cdclk = max(intel_state->min_cdclk[pipe], min_cdclk);
 
 static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->dev);
-       int min_cdclk = intel_compute_min_cdclk(state);
-       struct intel_atomic_state *intel_state =
-               to_intel_atomic_state(state);
-       int cdclk;
+       struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
+       int min_cdclk, cdclk;
 
-       cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
+       min_cdclk = intel_compute_min_cdclk(state);
+       if (min_cdclk < 0)
+               return min_cdclk;
 
-       if (cdclk > dev_priv->max_cdclk_freq) {
-               DRM_DEBUG_KMS("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
-                             cdclk, dev_priv->max_cdclk_freq);
-               return -EINVAL;
-       }
+       cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
 
        intel_state->cdclk.logical.cdclk = cdclk;
 
 
 static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
 {
-       struct drm_i915_private *dev_priv = to_i915(state->dev);
        struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
-       int min_cdclk = intel_compute_min_cdclk(state);
-       int cdclk;
+       int min_cdclk, cdclk;
+
+       min_cdclk = intel_compute_min_cdclk(state);
+       if (min_cdclk < 0)
+               return min_cdclk;
 
        /*
         * FIXME should also account for plane ratio
         */
        cdclk = bdw_calc_cdclk(min_cdclk);
 
-       if (cdclk > dev_priv->max_cdclk_freq) {
-               DRM_DEBUG_KMS("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
-                             cdclk, dev_priv->max_cdclk_freq);
-               return -EINVAL;
-       }
-
        intel_state->cdclk.logical.cdclk = cdclk;
 
        if (!intel_state->active_crtcs) {
 
 static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
 {
-       struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
        struct drm_i915_private *dev_priv = to_i915(state->dev);
-       int min_cdclk = intel_compute_min_cdclk(state);
-       int cdclk, vco;
+       struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
+       int min_cdclk, cdclk, vco;
+
+       min_cdclk = intel_compute_min_cdclk(state);
+       if (min_cdclk < 0)
+               return min_cdclk;
 
        vco = intel_state->cdclk.logical.vco;
        if (!vco)
         */
        cdclk = skl_calc_cdclk(min_cdclk, vco);
 
-       if (cdclk > dev_priv->max_cdclk_freq) {
-               DRM_DEBUG_KMS("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
-                             cdclk, dev_priv->max_cdclk_freq);
-               return -EINVAL;
-       }
-
        intel_state->cdclk.logical.vco = vco;
        intel_state->cdclk.logical.cdclk = cdclk;
 
 static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->dev);
-       int min_cdclk = intel_compute_min_cdclk(state);
-       struct intel_atomic_state *intel_state =
-               to_intel_atomic_state(state);
-       int cdclk, vco;
+       struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
+       int min_cdclk, cdclk, vco;
+
+       min_cdclk = intel_compute_min_cdclk(state);
+       if (min_cdclk < 0)
+               return min_cdclk;
 
        if (IS_GEMINILAKE(dev_priv)) {
                cdclk = glk_calc_cdclk(min_cdclk);
                vco = bxt_de_pll_vco(dev_priv, cdclk);
        }
 
-       if (cdclk > dev_priv->max_cdclk_freq) {
-               DRM_DEBUG_KMS("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
-                             cdclk, dev_priv->max_cdclk_freq);
-               return -EINVAL;
-       }
-
        intel_state->cdclk.logical.vco = vco;
        intel_state->cdclk.logical.cdclk = cdclk;
 
 static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->dev);
-       struct intel_atomic_state *intel_state =
-               to_intel_atomic_state(state);
-       int min_cdclk = intel_compute_min_cdclk(state);
-       int cdclk, vco;
+       struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
+       int min_cdclk, cdclk, vco;
+
+       min_cdclk = intel_compute_min_cdclk(state);
+       if (min_cdclk < 0)
+               return min_cdclk;
 
        cdclk = cnl_calc_cdclk(min_cdclk);
        vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
 
-       if (cdclk > dev_priv->max_cdclk_freq) {
-               DRM_DEBUG_KMS("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
-                             cdclk, dev_priv->max_cdclk_freq);
-               return -EINVAL;
-       }
-
        intel_state->cdclk.logical.vco = vco;
        intel_state->cdclk.logical.cdclk = cdclk;