diff options
Diffstat (limited to 'drivers/gpu/drm/meson/meson_venc_cvbs.c')
| -rw-r--r-- | drivers/gpu/drm/meson/meson_venc_cvbs.c | 48 | 
1 files changed, 27 insertions, 21 deletions
diff --git a/drivers/gpu/drm/meson/meson_venc_cvbs.c b/drivers/gpu/drm/meson/meson_venc_cvbs.c index 9ab27aecfcf3..1bd6b6d15ffb 100644 --- a/drivers/gpu/drm/meson/meson_venc_cvbs.c +++ b/drivers/gpu/drm/meson/meson_venc_cvbs.c @@ -64,6 +64,25 @@ struct meson_cvbs_mode meson_cvbs_modes[MESON_CVBS_MODES_COUNT] = {  	},  }; +static const struct meson_cvbs_mode * +meson_cvbs_get_mode(const struct drm_display_mode *req_mode) +{ +	int i; + +	for (i = 0; i < MESON_CVBS_MODES_COUNT; ++i) { +		struct meson_cvbs_mode *meson_mode = &meson_cvbs_modes[i]; + +		if (drm_mode_match(req_mode, &meson_mode->mode, +				   DRM_MODE_MATCH_TIMINGS | +				   DRM_MODE_MATCH_CLOCK | +				   DRM_MODE_MATCH_FLAGS | +				   DRM_MODE_MATCH_3D_FLAGS)) +			return meson_mode; +	} + +	return NULL; +} +  /* Connector */  static void meson_cvbs_connector_destroy(struct drm_connector *connector) @@ -136,14 +155,8 @@ static int meson_venc_cvbs_encoder_atomic_check(struct drm_encoder *encoder,  					struct drm_crtc_state *crtc_state,  					struct drm_connector_state *conn_state)  { -	int i; - -	for (i = 0; i < MESON_CVBS_MODES_COUNT; ++i) { -		struct meson_cvbs_mode *meson_mode = &meson_cvbs_modes[i]; - -		if (drm_mode_equal(&crtc_state->mode, &meson_mode->mode)) -			return 0; -	} +	if (meson_cvbs_get_mode(&crtc_state->mode)) +		return 0;  	return -EINVAL;  } @@ -191,24 +204,17 @@ static void meson_venc_cvbs_encoder_mode_set(struct drm_encoder *encoder,  				   struct drm_display_mode *mode,  				   struct drm_display_mode *adjusted_mode)  { +	const struct meson_cvbs_mode *meson_mode = meson_cvbs_get_mode(mode);  	struct meson_venc_cvbs *meson_venc_cvbs =  					encoder_to_meson_venc_cvbs(encoder);  	struct meson_drm *priv = meson_venc_cvbs->priv; -	int i; -	for (i = 0; i < MESON_CVBS_MODES_COUNT; ++i) { -		struct meson_cvbs_mode *meson_mode = &meson_cvbs_modes[i]; +	if (meson_mode) { +		meson_venci_cvbs_mode_set(priv, meson_mode->enci); -		if (drm_mode_equal(mode, &meson_mode->mode)) { -			meson_venci_cvbs_mode_set(priv, -						  meson_mode->enci); - -			/* Setup 27MHz vclk2 for ENCI and VDAC */ -			meson_vclk_setup(priv, MESON_VCLK_TARGET_CVBS, -					 MESON_VCLK_CVBS, MESON_VCLK_CVBS, -					 MESON_VCLK_CVBS, true); -			break; -		} +		/* Setup 27MHz vclk2 for ENCI and VDAC */ +		meson_vclk_setup(priv, MESON_VCLK_TARGET_CVBS, MESON_VCLK_CVBS, +				 MESON_VCLK_CVBS, MESON_VCLK_CVBS, true);  	}  }  |