Commit 0d4b950e authored by Dominique Martinet's avatar Dominique Martinet Committed by Neil Armstrong
Browse files

drm/bridge: imx8mp-hdmi-tx: allow 0.5% margin with selected clock



This allows the hdmi driver to pick e.g. 64.8MHz instead of 65Mhz when we
cannot output the exact frequency, enabling the imx8mp HDMI output to
support more modes

Tested-by: Adam Ford <aford173@gmail.com> #imx8mp-beacon
Reviewed-by: default avatarFrieder Schrempf <frieder.schrempf@kontron.de>
Tested-by: default avatarFrieder Schrempf <frieder.schrempf@kontron.de>
Signed-off-by: default avatarDominique Martinet <dominique.martinet@atmark-techno.com>
Reviewed-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Link: https://lore.kernel.org/r/20240907-hdmi-tolerance-v2-1-b9d7abd89f5c@codewreck.org


Signed-off-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240907-hdmi-tolerance-v2-1-b9d7abd89f5c@codewreck.org
parent 8fdd9cb4
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ imx8mp_hdmi_mode_valid(struct dw_hdmi *dw_hdmi, void *data,
		       const struct drm_display_mode *mode)
{
	struct imx8mp_hdmi *hdmi = (struct imx8mp_hdmi *)data;
	long round_rate;

	if (mode->clock < 13500)
		return MODE_CLOCK_LOW;
@@ -30,8 +31,14 @@ imx8mp_hdmi_mode_valid(struct dw_hdmi *dw_hdmi, void *data,
	if (mode->clock > 297000)
		return MODE_CLOCK_HIGH;

	if (clk_round_rate(hdmi->pixclk, mode->clock * 1000) !=
	    mode->clock * 1000)
	round_rate = clk_round_rate(hdmi->pixclk, mode->clock * 1000);
	/* imx8mp's pixel clock generator (fsl-samsung-hdmi) cannot generate
	 * all possible frequencies, so allow some tolerance to support more
	 * modes.
	 * Allow 0.5% difference allowed in various standards (VESA, CEA861)
	 * 0.5% = 5/1000 tolerance (mode->clock is 1/1000)
	 */
	if (abs(round_rate - mode->clock * 1000) > mode->clock * 5)
		return MODE_CLOCK_RANGE;

	/* We don't support double-clocked and Interlaced modes */