Factor out PHY poweron and poweroff sequences from sun6i_dsi_encoder_enable
and sun6i_dsi_encoder_disable.This leaves nothing to be be done in
sun6i_dsi_encoder_disable, so get rid of that. Also remove
drm_panel_<prepare/enable/disable/unprepare> as these would be invoked the
modeset helpers.

Signed-off-by: Brandon Cheo Fusi <[email protected]>
---
 drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 64 ++++++++++++--------------
 drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h |  4 ++
 2 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c 
b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
index 760ff05ea..4dc92109e 100644
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
@@ -713,7 +713,7 @@ static int sun6i_dsi_start(struct sun6i_dsi *dsi,
        return 0;
 }
 
-static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder)
+void sun6i_dsi_phy_power_on(const struct drm_encoder *encoder)
 {
        struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
        struct sun6i_dsi *dsi = encoder_to_sun6i_dsi(encoder);
@@ -768,43 +768,12 @@ static void sun6i_dsi_encoder_enable(struct drm_encoder 
*encoder)
        phy_set_mode(dsi->dphy, PHY_MODE_MIPI_DPHY);
        phy_configure(dsi->dphy, &opts);
        phy_power_on(dsi->dphy);
-
-       if (dsi->panel)
-               drm_panel_prepare(dsi->panel);
-
-       /*
-        * FIXME: This should be moved after the switch to HS mode.
-        *
-        * Unfortunately, once in HS mode, it seems like we're not
-        * able to send DCS commands anymore, which would prevent any
-        * panel to send any DCS command as part as their enable
-        * method, which is quite common.
-        *
-        * I haven't seen any artifact due to that sub-optimal
-        * ordering on the panels I've tested it with, so I guess this
-        * will do for now, until that IP is better understood.
-        */
-       if (dsi->panel)
-               drm_panel_enable(dsi->panel);
-
-       sun6i_dsi_start(dsi, DSI_START_HSC);
-
-       udelay(1000);
-
-       sun6i_dsi_start(dsi, DSI_START_HSD);
 }
 
-static void sun6i_dsi_encoder_disable(struct drm_encoder *encoder)
+void sun6i_dsi_phy_power_off(const struct drm_encoder *encoder)
 {
        struct sun6i_dsi *dsi = encoder_to_sun6i_dsi(encoder);
 
-       DRM_DEBUG_DRIVER("Disabling DSI output\n");
-
-       if (dsi->panel) {
-               drm_panel_disable(dsi->panel);
-               drm_panel_unprepare(dsi->panel);
-       }
-
        phy_power_off(dsi->dphy);
        phy_exit(dsi->dphy);
 
@@ -813,6 +782,34 @@ static void sun6i_dsi_encoder_disable(struct drm_encoder 
*encoder)
        regulator_disable(dsi->regulator);
 }
 
+static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder, struct 
drm_atomic_state *old_state)
+{
+       struct sun6i_dsi *dsi = encoder_to_sun6i_dsi(encoder);
+
+       DRM_DEBUG_DRIVER("Enabling DSI output\n");
+
+       sun6i_dsi_start(dsi, DSI_START_HSC);
+
+       udelay(1000);
+
+       sun6i_dsi_start(dsi, DSI_START_HSD);
+
+       /*
+        * NOTE
+        *
+        * Unfortunately, once in HS mode, it seems like we're not
+        * able to send DCS commands anymore, which would prevent any
+        * panel to send any DCS command as part as their enable
+        * method, which is quite common.
+        *
+        * So maybe panels/bridges should send any init DCS commands in their
+        * prepare/pre_enable methods? This should work as the DSI PHY is active
+        * before those hooks are called.
+        *
+        * This will do for now, until that IP is better understood.
+        */
+}
+
 static int sun6i_dsi_get_modes(struct drm_connector *connector)
 {
        struct sun6i_dsi *dsi = connector_to_sun6i_dsi(connector);
@@ -843,7 +840,6 @@ static const struct drm_connector_funcs 
sun6i_dsi_connector_funcs = {
 };
 
 static const struct drm_encoder_helper_funcs sun6i_dsi_enc_helper_funcs = {
-       .disable        = sun6i_dsi_encoder_disable,
        .enable         = sun6i_dsi_encoder_enable,
 };
 
diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h 
b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h
index f1ddefe0f..a0b541f48 100644
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h
@@ -40,6 +40,10 @@ struct sun6i_dsi {
        const struct sun6i_dsi_variant *variant;
 };
 
+void sun6i_dsi_phy_power_on(const struct drm_encoder *encoder);
+
+void sun6i_dsi_phy_power_off(const struct drm_encoder *encoder);
+
 static inline struct sun6i_dsi *host_to_sun6i_dsi(struct mipi_dsi_host *host)
 {
        return container_of(host, struct sun6i_dsi, host);
-- 
2.30.2

Reply via email to