[PATCH] staging: imx-drm: Fix pixel clock polarity

Philipp Zabel p.zabel at pengutronix.de
Fri Jun 26 03:27:03 PDT 2015


Hi David,

Am Freitag, den 26.06.2015, 09:51 +0200 schrieb David Jander:
> clk_pol should almost always be 1 (active-high pixel clock). When using the
> LDB, it must be 1 and for externally connected displays it should most
> probably also be 1. Original Freescale code sets this bit always, except
> when the FB_SYNC_CLK_LAT_FALL flag is set, which is a proprietary extension
> from Freescale that is not normally set.
> 
> Signed-off-by: David Jander <david at protonic.nl>
> ---
>  drivers/gpu/drm/imx/ipuv3-crtc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
> index 7425fcc..97799ff 100644
> --- a/drivers/gpu/drm/imx/ipuv3-crtc.c
> +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
> @@ -173,7 +173,7 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
>  		sig_cfg.clkflags = 0;
>  
>  	sig_cfg.enable_pol = 1;
> -	sig_cfg.clk_pol = 0;
> +	sig_cfg.clk_pol = 1;
>  	sig_cfg.bus_format = ipu_crtc->bus_format;
>  	sig_cfg.v_to_h_sync = 0;
>  	sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin;

have a look at 85de9d17c485 ("imx-drm: match ipu_di_signal_cfg's clk_pol
with its description."), which inverts the meaning of clk_pol.
In the freescale code I see in drivers/video/mxc/mxc_ipuv3_fb.c:

                memset(&sig_cfg, 0, sizeof(sig_cfg));
		/* ... */
                if (!(fbi->var.sync & FB_SYNC_CLK_LAT_FALL))
                        sig_cfg.clk_pol = true;

And in drivers/mxc/ipu3/ipu_disp.c:

        if (!sig.clk_pol)
                di_gen |= DI_GEN_POLARITY_DISP_CLK;
        ipu_di_write(ipu, disp, di_gen, DI_GENERAL);

So if FB_SYNC_CLK_LAT_FALL is not set, clk_pol defaults to true, but
this causes the POLARITY_DISP_CLK bit in DI_GENERAL to be cleared (which
is documented as active low). We do the same, just the other way around.
drivers/gpu/drm/imx/ipuv3-crtc.c:

        sig_cfg.clk_pol = 0;

And in drivers/gpu/ipu-v3/ipu-di.c:

        if (sig->clk_pol)
                di_gen |= DI_GEN_POLARITY_DISP_CLK;
        ipu_di_write(di, di_gen, DI_GENERAL);

At least with the HDMI output I have verified that the picture is
currently correct but gets shifted by a pixel with your patch.

regards
Philipp



More information about the dri-devel mailing list