On Thu, Oct 11, 2012 at 04:27:54PM -0700, Stuart Abercrombie wrote:
> Following a hotplug interrupt the driver uses a successful EDID read to 
> indicate HDMI sink presence.
> 
> This leads to missing HDMI cable unplug events because the DDC lines can 
> remain up, allowing an EDID read to complete, well after the HPD line goes 
> down during unplugging
> 
> Since it is only the disconnect case that suffers from unplug ordering 
> problems with the DDC lines, restrict polling to that.  Otherwise we waste 
> power.

Nope, the real fix is to simply check the status of the hpd line before
trying the edid read. We already have that for g4x class chips, check
g4x_hdmi_connected. We'd need to add similar checks for all other
platforms.
-Daniel

> ---
>  drivers/gpu/drm/drm_crtc_helper.c |    8 ++++++--
>  drivers/gpu/drm/i915/intel_hdmi.c |    2 +-
>  include/drm/drm_crtc.h            |    2 ++
>  3 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c 
> b/drivers/gpu/drm/drm_crtc_helper.c
> index 3252e70..b38ea4f 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> @@ -938,8 +938,12 @@ static void output_poll_execute(struct work_struct *work)
>               if (!connector->polled)
>                       continue;
>  
> -             else if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | 
> DRM_CONNECTOR_POLL_DISCONNECT))
> -                     repoll = true;
> +             if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | 
> DRM_CONNECTOR_POLL_DISCONNECT)) {
> +                     if (connector->polled & 
> DRM_CONNECTOR_POLL_DISCONNECT_ONLY)
> +                             repoll = (connector->status == 
> connector_status_connected);
> +                     else
> +                             repoll = true;
> +             }
>  
>               old_status = connector->status;
>               /* if we are connected and don't want to poll for disconnect
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> b/drivers/gpu/drm/i915/intel_hdmi.c
> index 229897f..246e8f4 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -964,7 +964,7 @@ void intel_hdmi_init(struct drm_device *dev, int 
> sdvox_reg, enum port port)
>  
>       intel_encoder->type = INTEL_OUTPUT_HDMI;
>  
> -     connector->polled = DRM_CONNECTOR_POLL_HPD;
> +     connector->polled = DRM_CONNECTOR_POLL_DISCONNECT | 
> DRM_CONNECTOR_POLL_DISCONNECT_ONLY;
>       connector->interlace_allowed = 1;
>       connector->doublescan_allowed = 0;
>       intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 316ce64..a60abb5 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -503,6 +503,8 @@ enum drm_connector_force {
>  /* can cleanly poll for disconnections without flickering the screen */
>  /* DACs should rarely do this without a lot of testing */
>  #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
> +/* Only poll for disconnections. */
> +#define DRM_CONNECTOR_POLL_DISCONNECT_ONLY (1 << 3)
>  
>  #define MAX_ELD_BYTES        128
>  
> -- 
> 1.7.7.3
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to