From: Paulo Zanoni <[email protected]>

We want to split the HDMI connector and encoder initialization because
in the future the DDI code will have its own "encoder init" function,
but it will still call intel_hdmi_init_connector. The DDI encoder will
actually have two connectors attached to it: HDMI and DP.

The best way to look at this patch is to imagine that we're renaming
intel_hdmi_init to intel_hdmi_init_connector and removing the
encoder-specific pieces and placing them into intel_hdmi_init.

Signed-off-by: Paulo Zanoni <[email protected]>
---
 drivers/gpu/drm/i915/intel_hdmi.c | 81 ++++++++++++++++++++++-----------------
 1 file changed, 46 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index bb31a77..5a78deb 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -899,45 +899,24 @@ intel_hdmi_add_properties(struct drm_connector *connector)
        intel_attach_broadcast_rgb_property(connector);
 }
 
-void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
+static void intel_hdmi_init_connector(struct intel_digital_port 
*intel_dig_port,
+                                     struct intel_connector *intel_connector)
 {
+       struct drm_connector *connector = &intel_connector->base;
+       struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
+       struct intel_encoder *intel_encoder = &intel_dig_port->base;
+       struct drm_device *dev = intel_encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_connector *connector;
-       struct intel_encoder *intel_encoder;
-       struct intel_connector *intel_connector;
-       struct intel_digital_port *intel_dig_port;
-       struct intel_hdmi *intel_hdmi;
-
-       intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL);
-       if (!intel_dig_port)
-               return;
-
-       intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
-       if (!intel_connector) {
-               kfree(intel_dig_port);
-               return;
-       }
+       enum port port = intel_dig_port->port;
 
-       intel_hdmi = &intel_dig_port->hdmi;
-       intel_encoder = &intel_dig_port->base;
-       drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
-                        DRM_MODE_ENCODER_TMDS);
-
-       connector = &intel_connector->base;
        drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
                           DRM_MODE_CONNECTOR_HDMIA);
        drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
 
-       intel_encoder->type = INTEL_OUTPUT_HDMI;
-
        connector->polled = DRM_CONNECTOR_POLL_HPD;
        connector->interlace_allowed = 1;
        connector->doublescan_allowed = 0;
-       intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
-
-       intel_encoder->cloneable = false;
 
-       intel_dig_port->port = port;
        switch (port) {
        case PORT_B:
                intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
@@ -957,8 +936,6 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, 
enum port port)
                BUG();
        }
 
-       intel_hdmi->sdvox_reg = sdvox_reg;
-
        if (!HAS_PCH_SPLIT(dev)) {
                intel_hdmi->write_infoframe = g4x_write_infoframe;
                intel_hdmi->set_infoframes = g4x_set_infoframes;
@@ -976,11 +953,6 @@ void intel_hdmi_init(struct drm_device *dev, int 
sdvox_reg, enum port port)
                intel_hdmi->set_infoframes = cpt_set_infoframes;
        }
 
-       if (IS_HASWELL(dev))
-               drm_encoder_helper_add(&intel_encoder->base, 
&intel_hdmi_helper_funcs_hsw);
-       else
-               drm_encoder_helper_add(&intel_encoder->base, 
&intel_hdmi_helper_funcs);
-
        intel_hdmi_add_properties(connector);
 
        intel_connector_attach_encoder(intel_connector, intel_encoder);
@@ -995,3 +967,42 @@ void intel_hdmi_init(struct drm_device *dev, int 
sdvox_reg, enum port port)
                I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
        }
 }
+
+void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
+{
+       struct intel_digital_port *intel_dig_port;
+       struct intel_encoder *intel_encoder;
+       struct drm_encoder *encoder;
+       struct intel_connector *intel_connector;
+
+       intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL);
+       if (!intel_dig_port)
+               return;
+
+       intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
+       if (!intel_connector) {
+               kfree(intel_dig_port);
+               return;
+       }
+
+       intel_encoder = &intel_dig_port->base;
+       encoder = &intel_encoder->base;
+
+       drm_encoder_init(dev, encoder, &intel_hdmi_enc_funcs,
+                        DRM_MODE_ENCODER_TMDS);
+
+       if (IS_HASWELL(dev))
+               drm_encoder_helper_add(encoder, &intel_hdmi_helper_funcs_hsw);
+       else
+               drm_encoder_helper_add(encoder, &intel_hdmi_helper_funcs);
+
+       intel_dig_port->port = port;
+       intel_dig_port->hdmi.sdvox_reg = sdvox_reg;
+       intel_dig_port->dp.output_reg = 0;
+
+       intel_encoder->type = INTEL_OUTPUT_HDMI;
+       intel_encoder->crtc_mask =  (1 << 0) | (1 << 1) | (1 << 2);
+       intel_encoder->cloneable = false;
+
+       intel_hdmi_init_connector(intel_dig_port, intel_connector);
+}
-- 
1.7.11.2

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to