pm_iir |= vlv_wa_c0_ei(dev_priv, pm_iir);
 
        adj = dev_priv->rps.last_adj;
+       new_delay = dev_priv->rps.cur_freq;
        if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) {
                if (adj > 0)
                        adj *= 2;
-               else {
-                       /* CHV needs even encode values */
-                       adj = IS_CHERRYVIEW(dev_priv->dev) ? 2 : 1;
-               }
-               new_delay = dev_priv->rps.cur_freq + adj;
-
+               else /* CHV needs even encode values */
+                       adj = IS_CHERRYVIEW(dev_priv) ? 2 : 1;
                /*
                 * For better performance, jump directly
                 * to RPe if we're below it.
                 */
-               if (new_delay < dev_priv->rps.efficient_freq)
+               if (new_delay < dev_priv->rps.efficient_freq - adj) {
                        new_delay = dev_priv->rps.efficient_freq;
+                       adj = 0;
+               }
        } else if (pm_iir & GEN6_PM_RP_DOWN_TIMEOUT) {
                if (dev_priv->rps.cur_freq > dev_priv->rps.efficient_freq)
                        new_delay = dev_priv->rps.efficient_freq;
        } else if (pm_iir & GEN6_PM_RP_DOWN_THRESHOLD) {
                if (adj < 0)
                        adj *= 2;
-               else {
-                       /* CHV needs even encode values */
-                       adj = IS_CHERRYVIEW(dev_priv->dev) ? -2 : -1;
-               }
-               new_delay = dev_priv->rps.cur_freq + adj;
+               else /* CHV needs even encode values */
+                       adj = IS_CHERRYVIEW(dev_priv) ? -2 : -1;
        } else { /* unknown event */
-               new_delay = dev_priv->rps.cur_freq;
+               adj = 0;
        }
 
+       dev_priv->rps.last_adj = adj;
+
        /* sysfs frequency interfaces may have snuck in while servicing the
         * interrupt
         */
+       new_delay += adj;
        new_delay = clamp_t(int, new_delay,
                            dev_priv->rps.min_freq_softlimit,
                            dev_priv->rps.max_freq_softlimit);
 
-       dev_priv->rps.last_adj = new_delay - dev_priv->rps.cur_freq;
-
        intel_set_rps(dev_priv->dev, new_delay);
 
        mutex_unlock(&dev_priv->rps.hw_lock);