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