.get_timing = dw_mipi_dsi_phy_get_timing,
 };
 
-static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi,
-                                       int mux)
+static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)
 {
-       if (dsi->cdata->lcdsel_grf_reg)
-               regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
-                       mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
-
        if (dsi->cdata->lanecfg1_grf_reg)
                regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg1_grf_reg,
                                              dsi->cdata->lanecfg1);
                                              dsi->cdata->enable);
 }
 
+static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,
+                                           int mux)
+{
+       regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
+               mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
+}
+
 static int
 dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder,
                                 struct drm_crtc_state *crtc_state,
                return;
        }
 
-       dw_mipi_dsi_rockchip_config(dsi, mux);
+       dw_mipi_dsi_rockchip_set_lcdsel(dsi, mux);
        if (dsi->slave)
-               dw_mipi_dsi_rockchip_config(dsi->slave, mux);
+               dw_mipi_dsi_rockchip_set_lcdsel(dsi->slave, mux);
 
        clk_disable_unprepare(dsi->grf_clk);
 }
                return ret;
        }
 
+       /*
+        * With the GRF clock running, write lane and dual-mode configurations
+        * that won't change immediately. If we waited until enable() to do
+        * this, things like panel preparation would not be able to send
+        * commands over DSI.
+        */
+       ret = clk_prepare_enable(dsi->grf_clk);
+       if (ret) {
+               DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
+               return ret;
+       }
+
+       dw_mipi_dsi_rockchip_config(dsi);
+       if (dsi->slave)
+               dw_mipi_dsi_rockchip_config(dsi->slave);
+
+       clk_disable_unprepare(dsi->grf_clk);
+
        ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
        if (ret) {
                DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");