struct mtk_phy_timing phy_timing;
        int refcount;
        bool enabled;
+       bool lanes_ready;
        u32 irq_data;
        wait_queue_head_t irq_wait_queue;
        const struct mtk_dsi_driver_data *driver_data;
        mtk_dsi_reset_engine(dsi);
        mtk_dsi_phy_timconfig(dsi);
 
-       mtk_dsi_rxtx_control(dsi);
-       usleep_range(30, 100);
-       mtk_dsi_reset_dphy(dsi);
        mtk_dsi_ps_control_vact(dsi);
        mtk_dsi_set_vm_cmd(dsi);
        mtk_dsi_config_vdo_timing(dsi);
        mtk_dsi_set_interrupt_enable(dsi);
 
-       mtk_dsi_clk_ulp_mode_leave(dsi);
-       mtk_dsi_lane0_ulp_mode_leave(dsi);
-       mtk_dsi_clk_hs_mode(dsi, 0);
-
        return 0;
 err_disable_engine_clk:
        clk_disable_unprepare(dsi->engine_clk);
        clk_disable_unprepare(dsi->digital_clk);
 
        phy_power_off(dsi->phy);
+
+       dsi->lanes_ready = false;
+}
+
+static void mtk_dsi_lane_ready(struct mtk_dsi *dsi)
+{
+       if (!dsi->lanes_ready) {
+               dsi->lanes_ready = true;
+               mtk_dsi_rxtx_control(dsi);
+               usleep_range(30, 100);
+               mtk_dsi_reset_dphy(dsi);
+               mtk_dsi_clk_ulp_mode_leave(dsi);
+               mtk_dsi_lane0_ulp_mode_leave(dsi);
+               mtk_dsi_clk_hs_mode(dsi, 0);
+               msleep(20);
+               /* The reaction time after pulling up the mipi signal for dsi_rx */
+       }
 }
 
 static void mtk_output_dsi_enable(struct mtk_dsi *dsi)
        if (dsi->enabled)
                return;
 
+       mtk_dsi_lane_ready(dsi);
        mtk_dsi_set_mode(dsi);
        mtk_dsi_clk_hs_mode(dsi, 1);
 
        if (MTK_DSI_HOST_IS_READ(msg->type))
                irq_flag |= LPRX_RD_RDY_INT_FLAG;
 
+       mtk_dsi_lane_ready(dsi);
+
        ret = mtk_dsi_host_send_cmd(dsi, msg, irq_flag);
        if (ret)
                goto restore_dsi_mode;