Adds the framework that allows encoder/connector drivers to create
a new interface pixel mapping passed to imx_drm_panel_format(). The
crtc driver will then pass this pointer on to ipu_dc_init_sync() which
sets up the new mapping in the DC.

Signed-off-by: Steve Longerbeam <steve_longerbeam at mentor.com>
---
 drivers/staging/imx-drm/imx-drm-core.c     |   19 ++++++++++++++-----
 drivers/staging/imx-drm/imx-drm.h          |   12 +++++++++---
 drivers/staging/imx-drm/imx-hdmi.c         |    3 +--
 drivers/staging/imx-drm/imx-ldb.c          |    2 +-
 drivers/staging/imx-drm/imx-tve.c          |    5 ++---
 drivers/staging/imx-drm/ipuv3-crtc.c       |   11 ++++++++---
 drivers/staging/imx-drm/ipuv3-plane.c      |    2 +-
 drivers/staging/imx-drm/parallel-display.c |    2 +-
 8 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/drivers/staging/imx-drm/imx-drm-core.c 
b/drivers/staging/imx-drm/imx-drm-core.c
index 4c85fd3..b31d291 100644
--- a/drivers/staging/imx-drm/imx-drm-core.c
+++ b/drivers/staging/imx-drm/imx-drm-core.c
@@ -136,7 +136,9 @@ static struct imx_drm_crtc *imx_drm_find_crtc_by_id(struct 
drm_device *drm,
 }

 int imx_drm_panel_format_pins(struct drm_encoder *encoder,
-               u32 interface_pix_fmt, int hsync_pin, int vsync_pin)
+                             u32 interface_pix_fmt,
+                             struct ipu_dc_if_map *interface_pix_map,
+                             int hsync_pin, int vsync_pin)
 {
        struct imx_drm_crtc_helper_funcs *helper;
        struct imx_drm_crtc *imx_crtc;
@@ -148,15 +150,22 @@ int imx_drm_panel_format_pins(struct drm_encoder *encoder,
        helper = &imx_crtc->imx_drm_helper_funcs;
        if (helper->set_interface_pix_fmt)
                return helper->set_interface_pix_fmt(encoder->crtc,
-                               encoder->encoder_type, interface_pix_fmt,
-                               hsync_pin, vsync_pin);
+                                                    encoder->encoder_type,
+                                                    interface_pix_fmt,
+                                                    interface_pix_map,
+                                                    hsync_pin, vsync_pin);
        return 0;
 }
 EXPORT_SYMBOL_GPL(imx_drm_panel_format_pins);

-int imx_drm_panel_format(struct drm_encoder *encoder, u32 interface_pix_fmt)
+int imx_drm_panel_format(struct drm_encoder *encoder,
+                        u32 interface_pix_fmt,
+                        struct ipu_dc_if_map *interface_pix_map)
 {
-       return imx_drm_panel_format_pins(encoder, interface_pix_fmt, 2, 3);
+       return imx_drm_panel_format_pins(encoder,
+                                        interface_pix_fmt,
+                                        interface_pix_map,
+                                        2, 3);
 }
 EXPORT_SYMBOL_GPL(imx_drm_panel_format);

diff --git a/drivers/staging/imx-drm/imx-drm.h 
b/drivers/staging/imx-drm/imx-drm.h
index 0bb4735..24b889a 100644
--- a/drivers/staging/imx-drm/imx-drm.h
+++ b/drivers/staging/imx-drm/imx-drm.h
@@ -1,6 +1,8 @@
 #ifndef _IMX_DRM_H_
 #define _IMX_DRM_H_

+#include <video/imx-ipu-v3.h>
+
 struct device_node;
 struct drm_crtc;
 struct drm_connector;
@@ -20,7 +22,8 @@ struct imx_drm_crtc_helper_funcs {
        int (*enable_vblank)(struct drm_crtc *crtc, int pipe);
        void (*disable_vblank)(struct drm_crtc *crtc, int pipe);
        int (*set_interface_pix_fmt)(struct drm_crtc *crtc, u32 encoder_type,
-                       u32 pix_fmt, int hsync_pin, int vsync_pin);
+                                    u32 pix_fmt, struct ipu_dc_if_map *pix_map,
+                                    int hsync_pin, int vsync_pin);
        int (*gamma_set)(struct drm_crtc *crtc, bool enable, u32 *m, u32 *b);
        const struct drm_crtc_helper_funcs *crtc_helper_funcs;
        const struct drm_crtc_funcs *crtc_funcs;
@@ -41,9 +44,12 @@ void imx_drm_mode_config_init(struct drm_device *drm);
 struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb);

 int imx_drm_panel_format_pins(struct drm_encoder *encoder,
-               u32 interface_pix_fmt, int hsync_pin, int vsync_pin);
+                             u32 interface_pix_fmt,
+                             struct ipu_dc_if_map *interface_pix_map,
+                             int hsync_pin, int vsync_pin);
 int imx_drm_panel_format(struct drm_encoder *encoder,
-               u32 interface_pix_fmt);
+                        u32 interface_pix_fmt,
+                        struct ipu_dc_if_map *interface_pix_map);

 int imx_drm_encoder_get_mux_id(struct device_node *node,
                struct drm_encoder *encoder);
diff --git a/drivers/staging/imx-drm/imx-hdmi.c 
b/drivers/staging/imx-drm/imx-hdmi.c
index db3906f..4ef1c0a 100644
--- a/drivers/staging/imx-drm/imx-hdmi.c
+++ b/drivers/staging/imx-drm/imx-hdmi.c
@@ -27,7 +27,6 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_encoder_slave.h>
-#include <video/imx-ipu-v3.h>

 #include "imx-hdmi.h"
 #include "imx-drm.h"
@@ -1455,7 +1454,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_panel_format(encoder, V4L2_PIX_FMT_RGB24);
+       imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24, NULL);
 }

 static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
diff --git a/drivers/staging/imx-drm/imx-ldb.c 
b/drivers/staging/imx-drm/imx-ldb.c
index 6c16cf2..53d9d82 100644
--- a/drivers/staging/imx-drm/imx-ldb.c
+++ b/drivers/staging/imx-drm/imx-ldb.c
@@ -293,7 +293,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder 
*encoder)
                pixel_fmt = V4L2_PIX_FMT_RGB24;
        }

-       imx_drm_panel_format(encoder, pixel_fmt);
+       imx_drm_panel_format(encoder, pixel_fmt, NULL);
 }

 static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
diff --git a/drivers/staging/imx-drm/imx-tve.c 
b/drivers/staging/imx-drm/imx-tve.c
index 42c651b..49feb91 100644
--- a/drivers/staging/imx-drm/imx-tve.c
+++ b/drivers/staging/imx-drm/imx-tve.c
@@ -30,7 +30,6 @@
 #include <drm/drmP.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_crtc_helper.h>
-#include <video/imx-ipu-v3.h>

 #include "imx-drm.h"

@@ -302,11 +301,11 @@ static void imx_tve_encoder_prepare(struct drm_encoder 
*encoder)

        switch (tve->mode) {
        case TVE_MODE_VGA:
-               imx_drm_panel_format_pins(encoder, IPU_PIX_FMT_GBR24,
+               imx_drm_panel_format_pins(encoder, IPU_PIX_FMT_GBR24, NULL,
                                tve->hsync_pin, tve->vsync_pin);
                break;
        case TVE_MODE_TVOUT:
-               imx_drm_panel_format(encoder, V4L2_PIX_FMT_YUV444);
+               imx_drm_panel_format(encoder, V4L2_PIX_FMT_YUV444, NULL);
                break;
        }
 }
diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c 
b/drivers/staging/imx-drm/ipuv3-crtc.c
index 8d7c998..bd158d6 100644
--- a/drivers/staging/imx-drm/ipuv3-crtc.c
+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
@@ -31,7 +31,6 @@
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/imx_drm.h>

-#include <video/imx-ipu-v3.h>
 #include "imx-drm.h"
 #include "ipuv3-plane.h"

@@ -93,6 +92,8 @@ struct ipu_crtc {
        int                     enabled;

        u32                     interface_pix_fmt;
+       struct ipu_dc_if_map    *interface_pix_map;
+
        unsigned long           di_clkflags;
        int                     di_hsync_pin;
        int                     di_vsync_pin;
@@ -272,6 +273,7 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
        struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
        int ret;
        struct ipu_di_signal_cfg sig_cfg = {};
+       struct ipu_dc_if_map *out_pixel_map;
        u32 out_pixel_fmt;

        dev_dbg(ipu_crtc->dev, "%s: mode->hdisplay: %d\n", __func__,
@@ -280,6 +282,7 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
                        mode->vdisplay);

        out_pixel_fmt = ipu_crtc->interface_pix_fmt;
+       out_pixel_map = ipu_crtc->interface_pix_map;

        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
                sig_cfg.interlaced = 1;
@@ -309,7 +312,7 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
        sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin;

        ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, sig_cfg.interlaced,
-                       out_pixel_fmt, NULL, mode->hdisplay);
+                       out_pixel_fmt, out_pixel_map, mode->hdisplay);
        if (ret) {
                dev_err(ipu_crtc->dev,
                                "initializing display controller failed with 
%d\n",
@@ -382,11 +385,13 @@ static void ipu_disable_vblank(struct drm_crtc *crtc, int 
pipe)
 }

 static int ipu_set_interface_pix_fmt(struct drm_crtc *crtc, u32 encoder_type,
-               u32 pixfmt, int hsync_pin, int vsync_pin)
+                                    u32 pixfmt, struct ipu_dc_if_map *pixmap,
+                                    int hsync_pin, int vsync_pin)
 {
        struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);

        ipu_crtc->interface_pix_fmt = pixfmt;
+       ipu_crtc->interface_pix_map = pixmap;
        ipu_crtc->di_hsync_pin = hsync_pin;
        ipu_crtc->di_vsync_pin = vsync_pin;

diff --git a/drivers/staging/imx-drm/ipuv3-plane.c 
b/drivers/staging/imx-drm/ipuv3-plane.c
index 2912aa6..61d47e9 100644
--- a/drivers/staging/imx-drm/ipuv3-plane.c
+++ b/drivers/staging/imx-drm/ipuv3-plane.c
@@ -17,7 +17,7 @@
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>

-#include "video/imx-ipu-v3.h"
+#include "imx-drm.h"
 #include "ipuv3-plane.h"

 #define to_ipu_plane(x)        container_of(x, struct ipu_plane, base)
diff --git a/drivers/staging/imx-drm/parallel-display.c 
b/drivers/staging/imx-drm/parallel-display.c
index 49f8308..667a9b3 100644
--- a/drivers/staging/imx-drm/parallel-display.c
+++ b/drivers/staging/imx-drm/parallel-display.c
@@ -123,7 +123,7 @@ static void imx_pd_encoder_prepare(struct drm_encoder 
*encoder)
 {
        struct imx_parallel_display *imxpd = enc_to_imxpd(encoder);

-       imx_drm_panel_format(encoder, imxpd->interface_pix_fmt);
+       imx_drm_panel_format(encoder, imxpd->interface_pix_fmt, NULL);
 }

 static void imx_pd_encoder_commit(struct drm_encoder *encoder)
-- 
1.7.9.5

Reply via email to