if (link->connector_signal == SIGNAL_TYPE_EDP) {
                /*in case it is not on*/
-               link->dc->hwss.edp_power_control(link, true);
+               if (!link->dc->config.edp_no_power_sequencing)
+                       link->dc->hwss.edp_power_control(link, true);
                link->dc->hwss.edp_wait_for_hpd_ready(link, true);
        }
 
        bool same_edid = false;
        enum dc_edid_status edid_status;
        struct dc_context *dc_ctx = link->ctx;
+       struct dc *dc = dc_ctx->dc;
        struct dc_sink *sink = NULL;
        struct dc_sink *prev_sink = NULL;
        struct dpcd_caps prev_dpcd_caps;
 
                        detect_edp_sink_caps(link);
                        read_current_link_settings_on_detect(link);
+
+                       /* Disable power sequence on MIPI panel + converter
+                        */
+                       if (dc->config.enable_mipi_converter_optimization &&
+                               dc_ctx->dce_version == DCN_VERSION_3_01 &&
+                               link->dpcd_caps.sink_dev_id == DP_BRANCH_DEVICE_ID_0022B9 &&
+                               memcmp(&link->dpcd_caps.branch_dev_name, DP_SINK_BRANCH_DEV_NAME_7580,
+                                       sizeof(link->dpcd_caps.branch_dev_name)) == 0)
+                               dc->config.edp_no_power_sequencing = true;
+
                        sink_caps.transaction_type = DDC_TRANSACTION_TYPE_I2C_OVER_AUX;
                        sink_caps.signal = SIGNAL_TYPE_EDP;
                        break;
 
        if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP) {
                /*in case it is not on*/
-               link->dc->hwss.edp_power_control(link, true);
+               if (!link->dc->config.edp_no_power_sequencing)
+                       link->dc->hwss.edp_power_control(link, true);
                link->dc->hwss.edp_wait_for_hpd_ready(link, true);
        }
 
 
        uint32_t wait_time = 0;
        union lane_align_status_updated dpcd_lane_status_updated = {0};
        union lane_status dpcd_lane_status[LANE_COUNT_DP_MAX] = {0};
-       enum link_training_result status = LINK_TRAINING_SUCCESS;
+       enum dc_status status = DC_OK;
+       enum link_training_result result = LINK_TRAINING_SUCCESS;
        union lane_adjust dpcd_lane_adjust[LANE_COUNT_DP_MAX] = {0};
 
        /* Transmit 128b/132b_TPS1 over Main-Link */
                        lt_settings->pattern_for_eq, DPRX);
 
        /* poll for channel EQ done */
-       while (status == LINK_TRAINING_SUCCESS) {
+       while (result == LINK_TRAINING_SUCCESS) {
                dp_wait_for_training_aux_rd_interval(link, aux_rd_interval);
                wait_time += aux_rd_interval;
-               dp_get_lane_status_and_lane_adjust(link, lt_settings, dpcd_lane_status,
+               status = dp_get_lane_status_and_lane_adjust(link, lt_settings, dpcd_lane_status,
                                &dpcd_lane_status_updated, dpcd_lane_adjust, DPRX);
                dp_decide_lane_settings(lt_settings, dpcd_lane_adjust,
                        lt_settings->hw_lane_settings, lt_settings->dpcd_lane_settings);
                dpcd_128b_132b_get_aux_rd_interval(link, &aux_rd_interval);
-               if (dp_is_ch_eq_done(lt_settings->link_settings.lane_count,
+               if (status != DC_OK) {
+                       result = LINK_TRAINING_ABORT;
+               } else if (dp_is_ch_eq_done(lt_settings->link_settings.lane_count,
                                dpcd_lane_status)) {
                        /* pass */
                        break;
                } else if (loop_count >= lt_settings->eq_loop_count_limit) {
-                       status = DP_128b_132b_MAX_LOOP_COUNT_REACHED;
+                       result = DP_128b_132b_MAX_LOOP_COUNT_REACHED;
                } else if (dpcd_lane_status_updated.bits.LT_FAILED_128b_132b) {
-                       status = DP_128b_132b_LT_FAILED;
+                       result = DP_128b_132b_LT_FAILED;
                } else {
                        dp_set_hw_lane_settings(link, link_res, lt_settings, DPRX);
                        dpcd_set_lane_settings(link, lt_settings, DPRX);
        }
 
        /* poll for EQ interlane align done */
-       while (status == LINK_TRAINING_SUCCESS) {
-               if (dpcd_lane_status_updated.bits.EQ_INTERLANE_ALIGN_DONE_128b_132b) {
+       while (result == LINK_TRAINING_SUCCESS) {
+               if (status != DC_OK) {
+                       result = LINK_TRAINING_ABORT;
+               } else if (dpcd_lane_status_updated.bits.EQ_INTERLANE_ALIGN_DONE_128b_132b) {
                        /* pass */
                        break;
                } else if (wait_time >= lt_settings->eq_wait_time_limit) {
-                       status = DP_128b_132b_CHANNEL_EQ_DONE_TIMEOUT;
+                       result = DP_128b_132b_CHANNEL_EQ_DONE_TIMEOUT;
                } else if (dpcd_lane_status_updated.bits.LT_FAILED_128b_132b) {
-                       status = DP_128b_132b_LT_FAILED;
+                       result = DP_128b_132b_LT_FAILED;
                } else {
                        dp_wait_for_training_aux_rd_interval(link,
                                        lt_settings->eq_pattern_time);
                        wait_time += lt_settings->eq_pattern_time;
-                       dp_get_lane_status_and_lane_adjust(link, lt_settings, dpcd_lane_status,
+                       status = dp_get_lane_status_and_lane_adjust(link, lt_settings, dpcd_lane_status,
                                        &dpcd_lane_status_updated, dpcd_lane_adjust, DPRX);
                }
        }
 
-       return status;
+       return result;
 }
 
 static enum link_training_result dp_perform_128b_132b_cds_done_sequence(
                struct link_training_settings *lt_settings)
 {
        /* Assumption: assume hardware has transmitted eq pattern */
-       enum link_training_result status = LINK_TRAINING_SUCCESS;
+       enum dc_status status = DC_OK;
+       enum link_training_result result = LINK_TRAINING_SUCCESS;
        union lane_align_status_updated dpcd_lane_status_updated = {0};
        union lane_status dpcd_lane_status[LANE_COUNT_DP_MAX] = {0};
        union lane_adjust dpcd_lane_adjust[LANE_COUNT_DP_MAX] = { { {0} } };
        dpcd_set_training_pattern(link, lt_settings->pattern_for_cds);
 
        /* poll for CDS interlane align done and symbol lock */
-       while (status == LINK_TRAINING_SUCCESS) {
+       while (result  == LINK_TRAINING_SUCCESS) {
                dp_wait_for_training_aux_rd_interval(link,
                                lt_settings->cds_pattern_time);
                wait_time += lt_settings->cds_pattern_time;
-               dp_get_lane_status_and_lane_adjust(link, lt_settings, dpcd_lane_status,
+               status = dp_get_lane_status_and_lane_adjust(link, lt_settings, dpcd_lane_status,
                                                &dpcd_lane_status_updated, dpcd_lane_adjust, DPRX);
-               if (dp_is_symbol_locked(lt_settings->link_settings.lane_count, dpcd_lane_status) &&
+               if (status != DC_OK) {
+                       result = LINK_TRAINING_ABORT;
+               } else if (dp_is_symbol_locked(lt_settings->link_settings.lane_count, dpcd_lane_status) &&
                                dpcd_lane_status_updated.bits.CDS_INTERLANE_ALIGN_DONE_128b_132b) {
                        /* pass */
                        break;
                } else if (dpcd_lane_status_updated.bits.LT_FAILED_128b_132b) {
-                       status = DP_128b_132b_LT_FAILED;
+                       result = DP_128b_132b_LT_FAILED;
                } else if (wait_time >= lt_settings->cds_wait_time_limit) {
-                       status = DP_128b_132b_CDS_DONE_TIMEOUT;
+                       result = DP_128b_132b_CDS_DONE_TIMEOUT;
                }
        }
 
-       return status;
+       return result;
 }
 
 static enum link_training_result dp_perform_8b_10b_link_training(
        unsigned int i;
 
        if (link->connector_signal == SIGNAL_TYPE_EDP) {
-               link->dc->hwss.edp_power_control(link, true);
+               if (!link->dc->config.edp_no_power_sequencing)
+                       link->dc->hwss.edp_power_control(link, true);
                link->dc->hwss.edp_wait_for_hpd_ready(link, true);
        }
 
                        link->dc->hwss.edp_backlight_control(link, false);
                if (link_hwss->ext.disable_dp_link_output)
                        link_hwss->ext.disable_dp_link_output(link, link_res, signal);
-               link->dc->hwss.edp_power_control(link, false);
+               if (!link->dc->config.edp_no_power_sequencing)
+                       link->dc->hwss.edp_power_control(link, false);
        } else {
                if (dmcu != NULL && dmcu->funcs->lock_phy)
                        dmcu->funcs->lock_phy(dmcu);
 
                         * has changed or they enter protection state and hang.
                         */
                        msleep(60);
-               } else if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP)
-                       edp_receiver_ready_T9(link);
+               } else if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP) {
+                       if (!link->dc->config.edp_no_power_sequencing) {
+                               /*
+                                * Sometimes, DP receiver chip power-controlled externally by an
+                                * Embedded Controller could be treated and used as eDP,
+                                * if it drives mobile display. In this case,
+                                * we shouldn't be doing power-sequencing, hence we can skip
+                                * waiting for T9-ready.
+                                */
+                               edp_receiver_ready_T9(link);
+                       }
+               }
        }
 
 }
                        build_audio_output(context, pipe_ctx, &audio_output);
 
                        if (dc->res_pool->dccg && dc->res_pool->dccg->funcs->set_audio_dtbclk_dto) {
-                               /* disable audio DTBCLK DTO */
-                               dc->res_pool->dccg->funcs->set_audio_dtbclk_dto(
-                                       dc->res_pool->dccg, 0);
+                               struct dtbclk_dto_params dto_params = {0};
 
                                pipe_ctx->stream_res.audio->funcs->wall_dto_setup(
                                                pipe_ctx->stream_res.audio,
                                                pipe_ctx->stream->signal,
                                                &audio_output.crtc_info,
                                                &audio_output.pll_info);
+
+                               dc->res_pool->dccg->funcs->set_audio_dtbclk_dto(
+                                       dc->res_pool->dccg,
+                                       &dto_params);
+
                        } else
                                pipe_ctx->stream_res.audio->funcs->wall_dto_setup(
                                        pipe_ctx->stream_res.audio,