mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
drm: bridge/dw_hdmi: support DRM_MODE_FLAG_DBLCLK
Change-Id: I66d9456d6bde38fcf17d5cd5f6394517e4308a68 Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
This commit is contained in:
@@ -1057,7 +1057,7 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
|
||||
HDMI_VP_STUFF_PR_STUFFING_MASK, HDMI_VP_STUFF);
|
||||
|
||||
/* Data from pixel repeater block */
|
||||
if (hdmi_data->pix_repet_factor > 1) {
|
||||
if (hdmi_data->pix_repet_factor > 0) {
|
||||
vp_conf = HDMI_VP_CONF_PR_EN_ENABLE |
|
||||
HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER;
|
||||
} else { /* data from packetizer block */
|
||||
@@ -1642,7 +1642,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
|
||||
int hblank, vblank, h_de_hs, v_de_vs, hsync_len, vsync_len;
|
||||
unsigned int hdisplay, vdisplay;
|
||||
|
||||
vmode->mpixelclock = mode->clock * 1000;
|
||||
vmode->mpixelclock = mode->crtc_clock * 1000;
|
||||
if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format))
|
||||
vmode->mpixelclock /= 2;
|
||||
dev_dbg(hdmi->dev, "final pixclk = %d\n", vmode->mpixelclock);
|
||||
@@ -1777,6 +1777,12 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi)
|
||||
hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
|
||||
}
|
||||
|
||||
/* Enable pixel repetition path */
|
||||
if (hdmi->hdmi_data.video_mode.mpixelrepetitioninput) {
|
||||
hdmi->mc_clkdis &= ~HDMI_MC_CLKDIS_PREPCLK_DISABLE;
|
||||
hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
|
||||
}
|
||||
|
||||
/* Enable color space conversion if needed */
|
||||
if (is_color_space_conversion(hdmi))
|
||||
hdmi_writeb(hdmi, HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH,
|
||||
@@ -1862,9 +1868,13 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
else
|
||||
hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_709;
|
||||
|
||||
hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
|
||||
hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
|
||||
hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 1;
|
||||
hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 1;
|
||||
} else {
|
||||
hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
|
||||
hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
|
||||
}
|
||||
/* TOFIX: Get input format from plat data or fallback to RGB888 */
|
||||
if (hdmi->plat_data->get_input_bus_format)
|
||||
hdmi->hdmi_data.enc_in_bus_format =
|
||||
@@ -1894,7 +1904,14 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
else
|
||||
hdmi->hdmi_data.enc_in_encoding = V4L2_YCBCR_ENC_DEFAULT;
|
||||
|
||||
hdmi->hdmi_data.pix_repet_factor = 0;
|
||||
/*
|
||||
* According to the dw-hdmi specification 6.4.2
|
||||
* vp_pr_cd[3:0]:
|
||||
* 0000b: No pixel repetition (pixel sent only once)
|
||||
* 0001b: Pixel sent two times (pixel repeated once)
|
||||
*/
|
||||
hdmi->hdmi_data.pix_repet_factor =
|
||||
(mode->flags & DRM_MODE_FLAG_DBLCLK) ? 1 : 0;
|
||||
hdmi->hdmi_data.hdcp_enable = 0;
|
||||
hdmi->hdmi_data.video_mode.mdataenablepolarity = true;
|
||||
|
||||
@@ -2156,10 +2173,6 @@ dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector = &hdmi->connector;
|
||||
enum drm_mode_status mode_status = MODE_OK;
|
||||
|
||||
/* We don't support double-clocked modes */
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
||||
return MODE_BAD;
|
||||
|
||||
if (hdmi->plat_data->mode_valid)
|
||||
mode_status = hdmi->plat_data->mode_valid(connector, mode);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user