From: Lin He <[email protected]>

If there's no VGA output, this encoder modeset won't be called, which
will cause displaying data from GPU being cut off. It's actually a
common display config for DP and VGA, so move the vdac encoder modeset
to driver load stage.

Fixes: 5294967f4ae4 ("drm/hisilicon/hibmc: Add support for VDAC")
Signed-off-by: Lin He <[email protected]>
Signed-off-by: Yongbang Shi <[email protected]>
---
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c   | 14 ++++++++++++
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c  | 22 -------------------
 2 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 289304500ab0..c7ce44a5370b 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -214,6 +214,18 @@ void hibmc_set_current_gate(struct hibmc_drm_private 
*priv, unsigned int gate)
        writel(gate, mmio + gate_reg);
 }
 
+static void hibmc_display_ctrl(struct hibmc_drm_private *priv)
+{
+       u32 reg;
+
+       reg = readl(priv->mmio + HIBMC_DISPLAY_CONTROL_HISILE);
+       reg |= HIBMC_DISPLAY_CONTROL_FPVDDEN(1);
+       reg |= HIBMC_DISPLAY_CONTROL_PANELDATE(1);
+       reg |= HIBMC_DISPLAY_CONTROL_FPEN(1);
+       reg |= HIBMC_DISPLAY_CONTROL_VBIASEN(1);
+       writel(reg, priv->mmio + HIBMC_DISPLAY_CONTROL_HISILE);
+}
+
 static void hibmc_hw_config(struct hibmc_drm_private *priv)
 {
        u32 reg;
@@ -245,6 +257,8 @@ static void hibmc_hw_config(struct hibmc_drm_private *priv)
        reg |= HIBMC_MSCCTL_LOCALMEM_RESET(1);
 
        writel(reg, priv->mmio + HIBMC_MISC_CTRL);
+
+       hibmc_display_ctrl(priv);
 }
 
 static int hibmc_hw_map(struct hibmc_drm_private *priv)
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c 
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
index 502494cba541..b02e9753112b 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
@@ -85,26 +85,6 @@ static const struct drm_connector_funcs 
hibmc_connector_funcs = {
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
-static void hibmc_encoder_mode_set(struct drm_encoder *encoder,
-                                  struct drm_display_mode *mode,
-                                  struct drm_display_mode *adj_mode)
-{
-       u32 reg;
-       struct drm_device *dev = encoder->dev;
-       struct hibmc_drm_private *priv = to_hibmc_drm_private(dev);
-
-       reg = readl(priv->mmio + HIBMC_DISPLAY_CONTROL_HISILE);
-       reg |= HIBMC_DISPLAY_CONTROL_FPVDDEN(1);
-       reg |= HIBMC_DISPLAY_CONTROL_PANELDATE(1);
-       reg |= HIBMC_DISPLAY_CONTROL_FPEN(1);
-       reg |= HIBMC_DISPLAY_CONTROL_VBIASEN(1);
-       writel(reg, priv->mmio + HIBMC_DISPLAY_CONTROL_HISILE);
-}
-
-static const struct drm_encoder_helper_funcs hibmc_encoder_helper_funcs = {
-       .mode_set = hibmc_encoder_mode_set,
-};
-
 int hibmc_vdac_init(struct hibmc_drm_private *priv)
 {
        struct drm_device *dev = &priv->dev;
@@ -127,8 +107,6 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
                goto err;
        }
 
-       drm_encoder_helper_add(encoder, &hibmc_encoder_helper_funcs);
-
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &hibmc_connector_funcs,
                                          DRM_MODE_CONNECTOR_VGA,
-- 
2.33.0

Reply via email to