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

Commit 0c1dab89 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/sdvo: Always fallback to querying the shared DDC line



On a few devices, like the Mac Mini, the CRT DDC pins are shared between
the analog connector and the digital connector. In this scenario, rely
on the EDID to determine if a digital panel is connected to the digital
connector.

Reported-and-tested-by: default avatarTino Keitel <tino.keitel@tikei.de>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent bcf50e27
Loading
Loading
Loading
Loading
+6 −45
Original line number Diff line number Diff line
@@ -1296,55 +1296,14 @@ intel_sdvo_get_edid(struct drm_connector *connector)
	return drm_get_edid(connector, &sdvo->ddc);
}

static struct drm_connector *
intel_find_analog_connector(struct drm_device *dev)
{
	struct drm_connector *connector;
	struct intel_sdvo *encoder;

	list_for_each_entry(encoder,
			    &dev->mode_config.encoder_list,
			    base.base.head) {
		if (encoder->base.type == INTEL_OUTPUT_ANALOG) {
			list_for_each_entry(connector,
					    &dev->mode_config.connector_list,
					    head) {
				if (&encoder->base ==
				    intel_attached_encoder(connector))
					return connector;
			}
		}
	}

	return NULL;
}

static int
intel_analog_is_connected(struct drm_device *dev)
{
	struct drm_connector *analog_connector;

	analog_connector = intel_find_analog_connector(dev);
	if (!analog_connector)
		return false;

	if (analog_connector->funcs->detect(analog_connector, false) ==
			connector_status_disconnected)
		return false;

	return true;
}

/* Mac mini hack -- use the same DDC as the analog connector */
static struct edid *
intel_sdvo_get_analog_edid(struct drm_connector *connector)
{
	struct drm_i915_private *dev_priv = connector->dev->dev_private;

	if (!intel_analog_is_connected(connector->dev))
		return NULL;

	return drm_get_edid(connector, &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
	return drm_get_edid(connector,
			    &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
}

enum drm_connector_status
@@ -1475,8 +1434,10 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
		edid = intel_sdvo_get_analog_edid(connector);

	if (edid != NULL) {
		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
			drm_mode_connector_update_edid_property(connector, edid);
			drm_add_edid_modes(connector, edid);
		}
		connector->display_info.raw_edid = NULL;
		kfree(edid);
	}