drm/i915/hdmi: Query the live connector status bit for G4x
Similar to g4x_dp_detect() we should probe the PORT_HOTPLUG_STATUS as to whether the connector is active prior to attempting to retrieve the EDID. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
		
					parent
					
						
							
								084b612ecf
							
						
					
				
			
			
				commit
				
					
						8ec22b214d
					
				
			
		
					 1 changed files with 27 additions and 0 deletions
				
			
		| 
						 | 
					@ -452,6 +452,30 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct drm_device *dev = intel_hdmi->base.base.dev;
 | 
				
			||||||
 | 
						struct drm_i915_private *dev_priv = dev->dev_private;
 | 
				
			||||||
 | 
						uint32_t bit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (intel_hdmi->sdvox_reg) {
 | 
				
			||||||
 | 
						case HDMIB:
 | 
				
			||||||
 | 
							bit = HDMIB_HOTPLUG_LIVE_STATUS;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case HDMIC:
 | 
				
			||||||
 | 
							bit = HDMIC_HOTPLUG_LIVE_STATUS;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case HDMID:
 | 
				
			||||||
 | 
							bit = HDMID_HOTPLUG_LIVE_STATUS;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							bit = 0;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return I915_READ(PORT_HOTPLUG_STAT) & bit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static enum drm_connector_status
 | 
					static enum drm_connector_status
 | 
				
			||||||
intel_hdmi_detect(struct drm_connector *connector, bool force)
 | 
					intel_hdmi_detect(struct drm_connector *connector, bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -460,6 +484,9 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
 | 
				
			||||||
	struct edid *edid;
 | 
						struct edid *edid;
 | 
				
			||||||
	enum drm_connector_status status = connector_status_disconnected;
 | 
						enum drm_connector_status status = connector_status_disconnected;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
 | 
				
			||||||
 | 
							return status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	intel_hdmi->has_hdmi_sink = false;
 | 
						intel_hdmi->has_hdmi_sink = false;
 | 
				
			||||||
	intel_hdmi->has_audio = false;
 | 
						intel_hdmi->has_audio = false;
 | 
				
			||||||
	edid = drm_get_edid(connector,
 | 
						edid = drm_get_edid(connector,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue