To clean up hotplug support we add a new enum to intel_encoder:
enum hpd_pin. It allows the encoder to request a hpd line but leave
the details which IRQ is responsible on which chipset generation
to i915_irq.c.
This way requesting hotplug support will become really simple on
the encoder/connector level.

Signed-off-by: Egbert Eich <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h   |   13 +++++++++++++
 drivers/gpu/drm/i915/intel_crt.c  |    2 ++
 drivers/gpu/drm/i915/intel_dp.c   |    4 ++++
 drivers/gpu/drm/i915/intel_drv.h  |    1 +
 drivers/gpu/drm/i915/intel_hdmi.c |    4 ++++
 drivers/gpu/drm/i915/intel_sdvo.c |    3 +++
 6 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index e95337c..316747a 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -86,6 +86,19 @@ enum port {
 };
 #define port_name(p) ((p) + 'A')
 
+enum hpd_pin {
+       HPD_NONE = 0,
+       HPD_PORT_A = HPD_NONE, /* PORT_A is internal */
+       HPD_TV = HPD_NONE,     /* TV is known to be unreliable */
+       HPD_CRT,
+       HPD_SDVO_B,
+       HPD_SDVO_C,
+       HPD_PORT_B,
+       HPD_PORT_C,
+       HPD_PORT_D,
+       HPD_NUM_PINS
+};
+
 #define I915_GEM_GPU_DOMAINS \
        (I915_GEM_DOMAIN_RENDER | \
         I915_GEM_DOMAIN_SAMPLER | \
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index cfc9687..de43cab 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -777,6 +777,8 @@ void intel_crt_init(struct drm_device *dev)
 
        crt->base.disable = intel_disable_crt;
        crt->base.enable = intel_enable_crt;
+       if (I915_HAS_HOTPLUG(dev))
+               crt->base.hpd_pin = HPD_CRT;
        if (HAS_DDI(dev))
                crt->base.get_hw_state = intel_ddi_get_hw_state;
        else
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 7b8bfe8..549933a 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2835,18 +2835,22 @@ intel_dp_init_connector(struct intel_digital_port 
*intel_dig_port,
        /* Set up the DDC bus. */
        switch (port) {
        case PORT_A:
+               intel_encoder->hpd_pin = HPD_PORT_A;
                name = "DPDDC-A";
                break;
        case PORT_B:
                dev_priv->hotplug_supported_mask |= PORTB_HOTPLUG_INT_STATUS;
+               intel_encoder->hpd_pin = HPD_PORT_B;
                name = "DPDDC-B";
                break;
        case PORT_C:
                dev_priv->hotplug_supported_mask |= PORTC_HOTPLUG_INT_STATUS;
+               intel_encoder->hpd_pin = HPD_PORT_C;
                name = "DPDDC-C";
                break;
        case PORT_D:
                dev_priv->hotplug_supported_mask |= PORTD_HOTPLUG_INT_STATUS;
+               intel_encoder->hpd_pin = HPD_PORT_D;
                name = "DPDDC-D";
                break;
        default:
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 005a91f..c9003bd 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -168,6 +168,7 @@ struct intel_encoder {
         * it is connected to in the pipe parameter. */
        bool (*get_hw_state)(struct intel_encoder *, enum pipe *pipe);
        int crtc_mask;
+       enum hpd_pin hpd_pin;
 };
 
 struct intel_panel {
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 5a6138c..8cd6bc1 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1022,17 +1022,21 @@ void intel_hdmi_init_connector(struct 
intel_digital_port *intel_dig_port,
        switch (port) {
        case PORT_B:
                intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
+               intel_encoder->hpd_pin = HPD_PORT_B;
                dev_priv->hotplug_supported_mask |= PORTB_HOTPLUG_INT_STATUS;
                break;
        case PORT_C:
                intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
+               intel_encoder->hpd_pin = HPD_PORT_C;
                dev_priv->hotplug_supported_mask |= PORTC_HOTPLUG_INT_STATUS;
                break;
        case PORT_D:
                intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
+               intel_encoder->hpd_pin = HPD_PORT_D;
                dev_priv->hotplug_supported_mask |= PORTD_HOTPLUG_INT_STATUS;
                break;
        case PORT_A:
+               intel_encoder->hpd_pin = HPD_PORT_A;
                /* Internal port only for eDP. */
        default:
                BUG();
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c 
b/drivers/gpu/drm/i915/intel_sdvo.c
index f01063a..cf57705 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2780,6 +2780,9 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t 
sdvo_reg, bool is_sdvob)
                        SDVOB_HOTPLUG_INT_STATUS_I915 : 
SDVOC_HOTPLUG_INT_STATUS_I915;
        }
 
+       if (intel_sdvo->hotplug_active)
+               intel_encoder->hpd_pin = HPD_SDVO_B ? HPD_SDVO_B : HPD_SDVO_C;
+
        drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs);
 
        intel_encoder->disable = intel_disable_sdvo;
-- 
1.7.7

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

Reply via email to