Handle encoder and connector init failures in g4x_hdmi_init(). This is
similar to g4x_dp_init().

Cc: Sergey Senozhatsky <senozhat...@chromium.org>
Cc: Ville Syrjala <ville.syrj...@linux.intel.com>
Reported-and-tested-by: Sergey Senozhatsky <senozhat...@chromium.org>
Closes: 
https://lore.kernel.org/r/20241031105145.2140590-1-senozhat...@chromium.org
Reviewed-by: Sergey Senozhatsky <senozhat...@chromium.org>
Signed-off-by: Jani Nikula <jani.nik...@intel.com>
---
 drivers/gpu/drm/i915/display/g4x_hdmi.c | 35 ++++++++++++++++---------
 drivers/gpu/drm/i915/display/g4x_hdmi.h |  5 ++--
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c 
b/drivers/gpu/drm/i915/display/g4x_hdmi.c
index d1a7d0d57c6b..bc6362a68fcc 100644
--- a/drivers/gpu/drm/i915/display/g4x_hdmi.c
+++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c
@@ -682,7 +682,7 @@ static bool assert_hdmi_port_valid(struct drm_i915_private 
*i915, enum port port
                         "Platform does not support HDMI %c\n", 
port_name(port));
 }
 
-void g4x_hdmi_init(struct drm_i915_private *dev_priv,
+bool g4x_hdmi_init(struct drm_i915_private *dev_priv,
                   i915_reg_t hdmi_reg, enum port port)
 {
        struct intel_display *display = &dev_priv->display;
@@ -692,10 +692,10 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
        struct intel_connector *intel_connector;
 
        if (!assert_port_valid(dev_priv, port))
-               return;
+               return false;
 
        if (!assert_hdmi_port_valid(dev_priv, port))
-               return;
+               return false;
 
        devdata = intel_bios_encoder_data_lookup(display, port);
 
@@ -706,15 +706,13 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
 
        dig_port = kzalloc(sizeof(*dig_port), GFP_KERNEL);
        if (!dig_port)
-               return;
+               return false;
 
        dig_port->aux_ch = AUX_CH_NONE;
 
        intel_connector = intel_connector_alloc();
-       if (!intel_connector) {
-               kfree(dig_port);
-               return;
-       }
+       if (!intel_connector)
+               goto err_connector_alloc;
 
        intel_encoder = &dig_port->base;
 
@@ -722,9 +720,10 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
 
        mutex_init(&dig_port->hdcp_mutex);
 
-       drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
-                        &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
-                        "HDMI %c", port_name(port));
+       if (drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
+                            &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
+                            "HDMI %c", port_name(port)))
+               goto err_encoder_init;
 
        intel_encoder->hotplug = intel_hdmi_hotplug;
        intel_encoder->compute_config = g4x_hdmi_compute_config;
@@ -787,5 +786,17 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
 
        intel_infoframe_init(dig_port);
 
-       intel_hdmi_init_connector(dig_port, intel_connector);
+       if (!intel_hdmi_init_connector(dig_port, intel_connector))
+               goto err_init_connector;
+
+       return true;
+
+err_init_connector:
+       drm_encoder_cleanup(&intel_encoder->base);
+err_encoder_init:
+       kfree(intel_connector);
+err_connector_alloc:
+       kfree(dig_port);
+
+       return false;
 }
diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.h 
b/drivers/gpu/drm/i915/display/g4x_hdmi.h
index 817f55c7a3a1..a52e8986ec7a 100644
--- a/drivers/gpu/drm/i915/display/g4x_hdmi.h
+++ b/drivers/gpu/drm/i915/display/g4x_hdmi.h
@@ -16,14 +16,15 @@ struct drm_connector;
 struct drm_i915_private;
 
 #ifdef I915
-void g4x_hdmi_init(struct drm_i915_private *dev_priv,
+bool g4x_hdmi_init(struct drm_i915_private *dev_priv,
                   i915_reg_t hdmi_reg, enum port port);
 int g4x_hdmi_connector_atomic_check(struct drm_connector *connector,
                                    struct drm_atomic_state *state);
 #else
-static inline void g4x_hdmi_init(struct drm_i915_private *dev_priv,
+static inline bool g4x_hdmi_init(struct drm_i915_private *dev_priv,
                                 i915_reg_t hdmi_reg, int port)
 {
+       return false;
 }
 static inline int g4x_hdmi_connector_atomic_check(struct drm_connector 
*connector,
                                                  struct drm_atomic_state 
*state)
-- 
2.39.5

Reply via email to