mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 11:33:58 -04:00
drm/i915/hdmi: add error handling in g4x_hdmi_init()
Handle encoder and connector init failures in g4x_hdmi_init(). This is similar to g4x_dp_init(). Cc: Sergey Senozhatsky <senozhatsky@chromium.org> Cc: Ville Syrjala <ville.syrjala@linux.intel.com> Reported-and-tested-by: Sergey Senozhatsky <senozhatsky@chromium.org> Closes: https://lore.kernel.org/r/20241031105145.2140590-1-senozhatsky@chromium.org Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org> Link: https://patchwork.freedesktop.org/patch/msgid/cafae7bf1f9ffb8f6a1d7a508cd2ce7dcf06fef7.1735568047.git.jani.nikula@intel.com Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
@@ -683,7 +683,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;
|
||||
@@ -693,10 +693,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);
|
||||
|
||||
@@ -707,15 +707,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;
|
||||
|
||||
@@ -723,9 +721,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;
|
||||
@@ -788,5 +787,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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user