diff options
Diffstat (limited to 'drivers/gpu/drm/meson/meson_venc.c')
| -rw-r--r-- | drivers/gpu/drm/meson/meson_venc.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c index 514245e69b38..be76f3d64bf2 100644 --- a/drivers/gpu/drm/meson/meson_venc.c +++ b/drivers/gpu/drm/meson/meson_venc.c @@ -71,6 +71,7 @@   */  /* HHI Registers */ +#define HHI_GCLK_MPEG2		0x148 /* 0x52 offset in data sheet */  #define HHI_VDAC_CNTL0		0x2F4 /* 0xbd offset in data sheet */  #define HHI_VDAC_CNTL1		0x2F8 /* 0xbe offset in data sheet */  #define HHI_HDMI_PHY_CNTL0	0x3a0 /* 0xe8 offset in data sheet */ @@ -714,6 +715,7 @@ struct meson_hdmi_venc_vic_mode {  	{ 5, &meson_hdmi_encp_mode_1080i60 },  	{ 20, &meson_hdmi_encp_mode_1080i50 },  	{ 32, &meson_hdmi_encp_mode_1080p24 }, +	{ 33, &meson_hdmi_encp_mode_1080p50 },  	{ 34, &meson_hdmi_encp_mode_1080p30 },  	{ 31, &meson_hdmi_encp_mode_1080p50 },  	{ 16, &meson_hdmi_encp_mode_1080p60 }, @@ -854,6 +856,13 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic,  	unsigned int sof_lines;  	unsigned int vsync_lines; +	/* Use VENCI for 480i and 576i and double HDMI pixels */ +	if (mode->flags & DRM_MODE_FLAG_DBLCLK) { +		hdmi_repeat = true; +		use_enci = true; +		venc_hdmi_latency = 1; +	} +  	if (meson_venc_hdmi_supported_vic(vic)) {  		vmode = meson_venc_hdmi_get_vic_vmode(vic);  		if (!vmode) { @@ -865,13 +874,7 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic,  	} else {  		meson_venc_hdmi_get_dmt_vmode(mode, &vmode_dmt);  		vmode = &vmode_dmt; -	} - -	/* Use VENCI for 480i and 576i and double HDMI pixels */ -	if (mode->flags & DRM_MODE_FLAG_DBLCLK) { -		hdmi_repeat = true; -		use_enci = true; -		venc_hdmi_latency = 1; +		use_enci = false;  	}  	/* Repeat VENC pixels for 480/576i/p, 720p50/60 and 1080p50/60 */ @@ -1529,10 +1532,12 @@ unsigned int meson_venci_get_field(struct meson_drm *priv)  void meson_venc_enable_vsync(struct meson_drm *priv)  {  	writel_relaxed(2, priv->io_base + _REG(VENC_INTCTRL)); +	regmap_update_bits(priv->hhi, HHI_GCLK_MPEG2, BIT(25), BIT(25));  }  void meson_venc_disable_vsync(struct meson_drm *priv)  { +	regmap_update_bits(priv->hhi, HHI_GCLK_MPEG2, BIT(25), 0);  	writel_relaxed(0, priv->io_base + _REG(VENC_INTCTRL));  }  |