return DC_ERROR_UNEXPECTED;
        }
 
+       if (dc->hwseq->funcs.PLAT_58856_wa && (!dc_is_dp_signal(stream->signal)))
+               dc->hwseq->funcs.PLAT_58856_wa(context, pipe_ctx);
+
        pipe_ctx->stream_res.tg->funcs->program_timing(
                        pipe_ctx->stream_res.tg,
                        &stream->timing,
 
                        true);
 }
 
+/* If user hotplug a HDMI monitor while in monitor off,
+ * OS will do a mode set (with output timing) but keep output off.
+ * In this case DAL will ask vbios to power up the pll in the PHY.
+ * If user unplug the monitor (while we are on monitor off) or
+ * system attempt to enter modern standby (which we will disable PLL),
+ * PHY will hang on the next mode set attempt.
+ * if enable PLL follow by disable PLL (without executing lane enable/disable),
+ * RDPCS_PHY_DP_MPLLB_STATE remains 1,
+ * which indicate that PLL disable attempt actually didn\92t go through.
+ * As a workaround, insert PHY lane enable/disable before PLL disable.
+ */
+void dcn21_PLAT_58856_wa(struct dc_state *context, struct pipe_ctx *pipe_ctx)
+{
+       if (!pipe_ctx->stream->dpms_off)
+               return;
+
+       pipe_ctx->stream->dpms_off = false;
+       core_link_enable_stream(context, pipe_ctx);
+       core_link_disable_stream(pipe_ctx);
+       pipe_ctx->stream->dpms_off = true;
+}
+
 
        .dccg_init = dcn20_dccg_init,
        .set_blend_lut = dcn20_set_blend_lut,
        .set_shaper_3dlut = dcn20_set_shaper_3dlut,
+       .PLAT_58856_wa = dcn21_PLAT_58856_wa,
 };
 
 void dcn21_hw_sequencer_construct(struct dc *dc)
 
                        const struct dc_plane_state *plane_state);
        bool (*set_shaper_3dlut)(struct pipe_ctx *pipe_ctx,
                        const struct dc_plane_state *plane_state);
+       void (*PLAT_58856_wa)(struct dc_state *context,
+                       struct pipe_ctx *pipe_ctx);
 };
 
 struct dce_hwseq {