imx-drm: simplify setup of panel format
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 3 Nov 2013 15:52:16 +0000 (15:52 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 24 Feb 2014 12:04:08 +0000 (12:04 +0000)
The encoder format passed into imx_drm_crtc_panel_format*() is the
encoder format used for DRM in most cases; the HDMI encoder sets
this to none, but this is incorrect, it should be TMDS.

Since this is the case, we can pass the drm_encoder structure
directly into this function and use the supplied fields there to
configure the CRTC.

Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/staging/imx-drm/imx-drm-core.c
drivers/staging/imx-drm/imx-drm.h
drivers/staging/imx-drm/imx-hdmi.c
drivers/staging/imx-drm/imx-ldb.c
drivers/staging/imx-drm/imx-tve.c
drivers/staging/imx-drm/ipuv3-crtc.c
drivers/staging/imx-drm/parallel-display.c

index 7f14ed0400729cd8f0ccf3ad306014052d6ebb66..d9786eca3a3646d07538d8e2bdbc6ce217f167cc 100644 (file)
@@ -111,32 +111,30 @@ struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
        return NULL;
 }
 
-int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
+int imx_drm_panel_format_pins(struct drm_encoder *encoder,
                u32 interface_pix_fmt, int hsync_pin, int vsync_pin)
 {
        struct imx_drm_crtc_helper_funcs *helper;
        struct imx_drm_crtc *imx_crtc;
 
-       imx_crtc = imx_drm_find_crtc(crtc);
+       imx_crtc = imx_drm_find_crtc(encoder->crtc);
        if (!imx_crtc)
                return -EINVAL;
 
        helper = &imx_crtc->imx_drm_helper_funcs;
        if (helper->set_interface_pix_fmt)
-               return helper->set_interface_pix_fmt(crtc,
-                               encoder_type, interface_pix_fmt,
+               return helper->set_interface_pix_fmt(encoder->crtc,
+                               encoder->encoder_type, interface_pix_fmt,
                                hsync_pin, vsync_pin);
        return 0;
 }
-EXPORT_SYMBOL_GPL(imx_drm_crtc_panel_format_pins);
+EXPORT_SYMBOL_GPL(imx_drm_panel_format_pins);
 
-int imx_drm_crtc_panel_format(struct drm_crtc *crtc, u32 encoder_type,
-               u32 interface_pix_fmt)
+int imx_drm_panel_format(struct drm_encoder *encoder, u32 interface_pix_fmt)
 {
-       return imx_drm_crtc_panel_format_pins(crtc, encoder_type,
-                                             interface_pix_fmt, 2, 3);
+       return imx_drm_panel_format_pins(encoder, interface_pix_fmt, 2, 3);
 }
-EXPORT_SYMBOL_GPL(imx_drm_crtc_panel_format);
+EXPORT_SYMBOL_GPL(imx_drm_panel_format);
 
 int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc)
 {
index 4eb594ce9cff89af70bcb76d3b5d7e2cea30728a..e3ca0c6b6a39f112ec7179ead484cc25bd00e5fd 100644 (file)
@@ -56,9 +56,9 @@ struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb);
 
 struct drm_device *imx_drm_device_get(void);
 void imx_drm_device_put(void);
-int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
+int imx_drm_panel_format_pins(struct drm_encoder *encoder,
                u32 interface_pix_fmt, int hsync_pin, int vsync_pin);
-int imx_drm_crtc_panel_format(struct drm_crtc *crtc, u32 encoder_type,
+int imx_drm_panel_format(struct drm_encoder *encoder,
                u32 interface_pix_fmt);
 void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper);
 
index 4b690459f3bb033c0778ef8f639dc3e0d7ef2555..50475e606849a797947e17cd05809c06a072005f 100644 (file)
@@ -1453,8 +1453,7 @@ static void imx_hdmi_encoder_prepare(struct drm_encoder *encoder)
        struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
 
        imx_hdmi_poweroff(hdmi);
-       imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE,
-                                 V4L2_PIX_FMT_RGB24);
+       imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24);
 }
 
 static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
index c6ec1e9e95cc89b16f3277b4f6c8a0cecf159a23..dd29a4aad376a30a1d4e1cc55198b1fe11329577 100644 (file)
@@ -200,8 +200,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder)
                pixel_fmt = V4L2_PIX_FMT_RGB24;
        }
 
-       imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_LVDS,
-                       pixel_fmt);
+       imx_drm_panel_format(encoder, pixel_fmt);
 }
 
 static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
index 2d4e0973a02aa16695e8040a306d16c9d25c67a8..77131e5770f33e9023e64af0670321cee882b2d6 100644 (file)
@@ -310,13 +310,11 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder)
 
        switch (tve->mode) {
        case TVE_MODE_VGA:
-               imx_drm_crtc_panel_format_pins(encoder->crtc,
-                               DRM_MODE_ENCODER_DAC, IPU_PIX_FMT_GBR24,
+               imx_drm_panel_format_pins(encoder, IPU_PIX_FMT_GBR24,
                                tve->hsync_pin, tve->vsync_pin);
                break;
        case TVE_MODE_TVOUT:
-               imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_TVDAC,
-                                         V4L2_PIX_FMT_YUV444);
+               imx_drm_panel_format(encoder, V4L2_PIX_FMT_YUV444);
                break;
        }
 }
@@ -510,12 +508,16 @@ static int tve_clk_init(struct imx_tve *tve, void __iomem *base)
 
 static int imx_tve_register(struct imx_tve *tve)
 {
+       int encoder_type;
        int ret;
 
+       encoder_type = tve->mode == TVE_MODE_VGA ?
+                               DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC;
+
        tve->connector.funcs = &imx_tve_connector_funcs;
        tve->encoder.funcs = &imx_tve_encoder_funcs;
 
-       tve->encoder.encoder_type = DRM_MODE_ENCODER_NONE;
+       tve->encoder.encoder_type = encoder_type;
        tve->connector.connector_type = DRM_MODE_CONNECTOR_VGA;
 
        drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs);
index 22be104fbda97526980481011ad5250121b52948..08e0a3b2917462ce8c6847585e84364dbc5cc5c2 100644 (file)
@@ -284,6 +284,7 @@ static int ipu_set_interface_pix_fmt(struct drm_crtc *crtc, u32 encoder_type,
                ipu_crtc->di_clkflags = IPU_DI_CLKMODE_SYNC |
                        IPU_DI_CLKMODE_EXT;
                break;
+       case DRM_MODE_ENCODER_TMDS:
        case DRM_MODE_ENCODER_NONE:
                ipu_crtc->di_clkflags = 0;
                break;
index 18a3e8aae22a9a75c7f452b5344b86f35a9c1d50..12bcf4f58bdf22999bc9354cbb4eeb09ed6f19ce 100644 (file)
@@ -108,8 +108,7 @@ static void imx_pd_encoder_prepare(struct drm_encoder *encoder)
 {
        struct imx_parallel_display *imxpd = enc_to_imxpd(encoder);
 
-       imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE,
-                       imxpd->interface_pix_fmt);
+       imx_drm_panel_format(encoder, imxpd->interface_pix_fmt);
 }
 
 static void imx_pd_encoder_commit(struct drm_encoder *encoder)