drm/sun4i: validate modes for HDMI
When I connected my cubieboard running 4.15-rc1 to my 4k display I got no
picture. Some digging found that there is no check against the upper
pixelclock limit of the HDMI output, so X selects a 4kp60 format at 594
MHz, which obviously won't work.
The patch below adds a check for the upper bound of what this hardware can
do, and it checks if the requested tmds clock can be obtained.
It also allows for the +/- 0.5% pixel clock variation that the HDMI spec permits.
That code is based on commit 22d0be2a55
("drm: arcpgu: Allow some clock
deviation in crtc->mode_valid() callback") from Jose Abreu for drm/arc.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Thanks-to: Jose Abreu <Jose.Abreu@synopsys.com>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Link: https://patchwork.freedesktop.org/patch/msgid/162854cb-c7bd-d9ce-9fa0-9a6cd89c621b@xs4all.nl
This commit is contained in:
parent
bd36d3bab2
commit
caea4f3848
|
@ -208,8 +208,27 @@ static int sun4i_hdmi_get_modes(struct drm_connector *connector)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sun4i_hdmi_mode_valid(struct drm_connector *connector,
|
||||||
|
struct drm_display_mode *mode)
|
||||||
|
{
|
||||||
|
struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
|
||||||
|
long rate = mode->clock * 1000;
|
||||||
|
long diff = rate / 200; /* +-0.5% allowed by HDMI spec */
|
||||||
|
long rounded_rate;
|
||||||
|
|
||||||
|
/* 165 MHz is the typical max pixelclock frequency for HDMI <= 1.2 */
|
||||||
|
if (rate > 165000000)
|
||||||
|
return MODE_CLOCK_HIGH;
|
||||||
|
rounded_rate = clk_round_rate(hdmi->tmds_clk, rate);
|
||||||
|
if (max(rounded_rate, rate) - min(rounded_rate, rate) < diff &&
|
||||||
|
rounded_rate > 0)
|
||||||
|
return MODE_OK;
|
||||||
|
return MODE_NOCLOCK;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct drm_connector_helper_funcs sun4i_hdmi_connector_helper_funcs = {
|
static const struct drm_connector_helper_funcs sun4i_hdmi_connector_helper_funcs = {
|
||||||
.get_modes = sun4i_hdmi_get_modes,
|
.get_modes = sun4i_hdmi_get_modes,
|
||||||
|
.mode_valid = sun4i_hdmi_mode_valid,
|
||||||
};
|
};
|
||||||
|
|
||||||
static enum drm_connector_status
|
static enum drm_connector_status
|
||||||
|
|
Loading…
Reference in New Issue