Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe16d949 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Move the lvds OpRegion lid detection code to panel and reuse for eDP



Share the lid detection code for the all panels for consistent behaviour
and a single place to add the eventual quirks for crap hardware.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent 47a05eca
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -1522,9 +1522,13 @@ ironlake_dp_detect(struct intel_dp *intel_dp)
{
	enum drm_connector_status status;

	/* Can't disconnect eDP */
	if (is_edp(intel_dp))
		return connector_status_connected;
	/* Can't disconnect eDP, but you can close the lid... */
	if (is_edp(intel_dp)) {
		status = intel_panel_detect(intel_dp->base.base.dev);
		if (status == connector_status_unknown)
			status = connector_status_connected;
		return status;
	}

	status = connector_status_disconnected;
	if (intel_dp_aux_native_read(intel_dp,
+1 −0
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ extern void intel_panel_set_backlight(struct drm_device *dev, u32 level);
extern void intel_panel_setup_backlight(struct drm_device *dev);
extern void intel_panel_enable_backlight(struct drm_device *dev);
extern void intel_panel_disable_backlight(struct drm_device *dev);
extern enum drm_connector_status intel_panel_detect(struct drm_device *dev);

extern void intel_crtc_load_lut(struct drm_crtc *crtc);
extern void intel_encoder_prepare (struct drm_encoder *encoder);
+3 −6
Original line number Diff line number Diff line
@@ -473,14 +473,11 @@ static enum drm_connector_status
intel_lvds_detect(struct drm_connector *connector, bool force)
{
	struct drm_device *dev = connector->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	enum drm_connector_status status = connector_status_connected;

	/* Assume that the BIOS does not lie through the OpRegion... */
	if (dev_priv->opregion.lid_state)
		return ioread32(dev_priv->opregion.lid_state) & 0x1 ?
			connector_status_connected :
			connector_status_disconnected;
	status = intel_panel_detect(dev);
	if (status != connector_status_unknown)
		return status;

	/* ACPI lid methods were generally unreliable in this generation, so
	 * don't even bother.
+14 −0
Original line number Diff line number Diff line
@@ -281,3 +281,17 @@ void intel_panel_setup_backlight(struct drm_device *dev)
	dev_priv->backlight_level = intel_panel_get_backlight(dev);
	dev_priv->backlight_enabled = dev_priv->backlight_level != 0;
}

enum drm_connector_status
intel_panel_detect(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

	/* Assume that the BIOS does not lie through the OpRegion... */
	if (dev_priv->opregion.lid_state)
		return ioread32(dev_priv->opregion.lid_state) & 0x1 ?
			connector_status_connected :
			connector_status_disconnected;

	return connector_status_unknown;
}