@@ -719,12 +719,6 @@ static void dw_mipi_dsi_set_mode(struct dw_mipi_dsi *dsi,
719719 }
720720}
721721
722- static void dw_mipi_dsi_disable (struct dw_mipi_dsi * dsi )
723- {
724- dsi_write (dsi , DSI_PWR_UP , RESET );
725- dsi_write (dsi , DSI_PHY_RSTZ , PHY_RSTZ );
726- }
727-
728722static void dw_mipi_dsi_init (struct dw_mipi_dsi * dsi )
729723{
730724 dsi_write (dsi , DSI_PWR_UP , RESET );
@@ -868,34 +862,46 @@ static void dw_mipi_dsi_encoder_mode_set(struct drm_encoder *encoder,
868862 drm_mode_copy (& dsi -> mode , adjusted_mode );
869863}
870864
871- static void dw_mipi_dsi_encoder_disable (struct drm_encoder * encoder )
865+ static void rockchip_dsi_pre_disable (struct dw_mipi_dsi * dsi )
872866{
873- struct dw_mipi_dsi * dsi = encoder_to_dsi (encoder );
874-
875- drm_panel_disable (dsi -> panel );
876-
877867 if (clk_prepare_enable (dsi -> pclk )) {
878868 dev_err (dsi -> dev , "%s: Failed to enable pclk\n" , __func__ );
879869 return ;
880870 }
881871
882872 dw_mipi_dsi_set_mode (dsi , DW_MIPI_DSI_CMD_MODE );
883- drm_panel_unprepare (dsi -> panel );
884- dw_mipi_dsi_set_mode (dsi , DW_MIPI_DSI_VID_MODE );
873+ }
885874
886- /*
887- * This is necessary to make sure the peripheral will be driven
888- * normally when the display is enabled again later.
889- */
890- msleep (120 );
875+ static void rockchip_dsi_disable (struct dw_mipi_dsi * dsi )
876+ {
877+ /* host */
878+ dsi_write (dsi , DSI_LPCLK_CTRL , 0 );
879+ dsi_write (dsi , DSI_PWR_UP , RESET );
880+
881+ /* phy */
882+ dsi_write (dsi , DSI_PHY_RSTZ , PHY_RSTZ );
883+ if (dsi -> phy )
884+ phy_power_off (dsi -> phy );
891885
892- dw_mipi_dsi_set_mode (dsi , DW_MIPI_DSI_CMD_MODE );
893- dw_mipi_dsi_disable (dsi );
894- phy_power_off (dsi -> phy );
895886 pm_runtime_put (dsi -> dev );
896887 clk_disable_unprepare (dsi -> pclk );
897888}
898889
890+ static void dw_mipi_dsi_encoder_disable (struct drm_encoder * encoder )
891+ {
892+ struct dw_mipi_dsi * dsi = encoder_to_dsi (encoder );
893+
894+ if (dsi -> panel )
895+ drm_panel_disable (dsi -> panel );
896+
897+ rockchip_dsi_pre_disable (dsi );
898+
899+ if (dsi -> panel )
900+ drm_panel_unprepare (dsi -> panel );
901+
902+ rockchip_dsi_disable (dsi );
903+ }
904+
899905static bool dw_mipi_dsi_encoder_mode_fixup (struct drm_encoder * encoder ,
900906 const struct drm_display_mode * mode ,
901907 struct drm_display_mode * adjusted_mode )
0 commit comments