uint32_t val = 0x0;
        const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
 
-       if (dev_priv->psr.link_standby) {
+       if (dev_priv->psr.link_standby)
                val |= EDP_PSR_LINK_STANDBY;
+
+       if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) {
+               /* It doesn't mean we shouldn't send TPS patters, so let's
+                  send the minimal TP1 possible and skip TP2. */
+               val |= EDP_PSR_TP1_TIME_100us;
                val |= EDP_PSR_TP2_TP3_TIME_0us;
-               val |= EDP_PSR_TP1_TIME_0us;
                val |= EDP_PSR_SKIP_AUX_EXIT;
+               /* Sink should be able to train with the 5 or 6 idle patterns */
+               idle_frames += 4;
        }
 
        I915_WRITE(EDP_PSR_CTL(dev), val |
        /* First we check VBT, but we must respect sink and source
         * known restrictions */
        dev_priv->psr.link_standby = dev_priv->vbt.psr.full_link;
-       if ((intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) ||
-           (IS_BROADWELL(dev) && intel_dig_port->port != PORT_A))
+       if (IS_BROADWELL(dev) && intel_dig_port->port != PORT_A)
                dev_priv->psr.link_standby = true;
 
        dev_priv->psr.busy_frontbuffer_bits = 0;