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

Commit 6ed0f796 authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/i915: use staged outuput config in tv->mode_fixup



The "is this encoder cloned" check will be reused by the lvds encoder,
hence exract it.

v2: Be a bit more careful about that we need to check the new, staged
ouput configuration in the check_non_cloned helper ...

v3: Kill the double negation with s/!non_cloned/is_cloned/, suggested
by Jesse Barnes.

Reviewed-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 7758a113
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -6563,6 +6563,28 @@ static struct drm_crtc_helper_funcs intel_helper_funcs = {
	.disable = intel_crtc_disable,
};

bool intel_encoder_check_is_cloned(struct intel_encoder *encoder)
{
	struct intel_encoder *other_encoder;
	struct drm_crtc *crtc = &encoder->new_crtc->base;

	if (WARN_ON(!crtc))
		return false;

	list_for_each_entry(other_encoder,
			    &crtc->dev->mode_config.encoder_list,
			    base.head) {

		if (&other_encoder->new_crtc->base != crtc ||
		    encoder == other_encoder)
			continue;
		else
			return true;
	}

	return false;
}

static bool intel_encoder_crtc_ok(struct drm_encoder *encoder,
				  struct drm_crtc *crtc)
{
+1 −0
Original line number Diff line number Diff line
@@ -454,6 +454,7 @@ extern void intel_crtc_update_dpms(struct drm_crtc *crtc);
extern void intel_encoder_disable(struct drm_encoder *encoder);
extern void intel_encoder_destroy(struct drm_encoder *encoder);
extern void intel_encoder_dpms(struct intel_encoder *encoder, int mode);
extern bool intel_encoder_check_is_cloned(struct intel_encoder *encoder);
extern void intel_connector_dpms(struct drm_connector *, int mode);
extern bool intel_connector_get_hw_state(struct intel_connector *connector);
extern void intel_connector_check_state(struct intel_connector *);
+2 −5
Original line number Diff line number Diff line
@@ -910,16 +910,13 @@ intel_tv_mode_fixup(struct drm_encoder *encoder,
		    const struct drm_display_mode *mode,
		    struct drm_display_mode *adjusted_mode)
{
	struct drm_device *dev = encoder->dev;
	struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
	const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
	struct intel_encoder *other_encoder;

	if (!tv_mode)
		return false;

	for_each_encoder_on_crtc(dev, encoder->crtc, other_encoder)
		if (&other_encoder->base != encoder)
	if (intel_encoder_check_is_cloned(&intel_tv->base))
		return false;

	adjusted_mode->clock = tv_mode->clock;