ics = ipu_drm_fourcc_to_colorspace(fb->format->format);
        switch (ipu_plane->dp_flow) {
        case IPU_DP_FLOW_SYNC_BG:
-               ipu_dp_setup_channel(ipu_plane->dp, ics, IPUV3_COLORSPACE_RGB);
+               ipu_dp_setup_channel(ipu_plane->dp, DRM_COLOR_YCBCR_BT601,
+                                    DRM_COLOR_YCBCR_LIMITED_RANGE, ics,
+                                    IPUV3_COLORSPACE_RGB);
                break;
        case IPU_DP_FLOW_SYNC_FG:
-               ipu_dp_setup_channel(ipu_plane->dp, ics,
-                                       IPUV3_COLORSPACE_UNKNOWN);
+               ipu_dp_setup_channel(ipu_plane->dp, DRM_COLOR_YCBCR_BT601,
+                                    DRM_COLOR_YCBCR_LIMITED_RANGE, ics,
+                                    IPUV3_COLORSPACE_UNKNOWN);
                break;
        }
 
 
 #include <linux/io.h>
 #include <linux/err.h>
 
+#include <drm/drm_color_mgmt.h>
 #include <video/imx-ipu-v3.h>
 #include "ipu-prv.h"
 
 EXPORT_SYMBOL_GPL(ipu_dp_set_window_pos);
 
 static void ipu_dp_csc_init(struct ipu_flow *flow,
+               enum drm_color_encoding ycbcr_enc,
+               enum drm_color_range range,
                enum ipu_color_space in,
                enum ipu_color_space out,
                u32 place)
                                flow->base + DP_CSC_0);
                writel(0x200 | (2 << 14) | (0x200 << 16) | (2 << 30),
                                flow->base + DP_CSC_1);
+       } else if (ycbcr_enc == DRM_COLOR_YCBCR_BT709) {
+               /* Rec.709 limited range */
+               writel(0x095 | (0x000 << 16), flow->base + DP_CSC_A_0);
+               writel(0x0e5 | (0x095 << 16), flow->base + DP_CSC_A_1);
+               writel(0x3e5 | (0x3bc << 16), flow->base + DP_CSC_A_2);
+               writel(0x095 | (0x10e << 16), flow->base + DP_CSC_A_3);
+               writel(0x000 | (0x3e10 << 16) | (1 << 30),
+                               flow->base + DP_CSC_0);
+               writel(0x09a | (1 << 14) | (0x3dbe << 16) | (1 << 30),
+                               flow->base + DP_CSC_1);
        } else {
+               /* BT.601 limited range */
                writel(0x095 | (0x000 << 16), flow->base + DP_CSC_A_0);
                writel(0x0cc | (0x095 << 16), flow->base + DP_CSC_A_1);
                writel(0x3ce | (0x398 << 16), flow->base + DP_CSC_A_2);
 }
 
 int ipu_dp_setup_channel(struct ipu_dp *dp,
+               enum drm_color_encoding ycbcr_enc,
+               enum drm_color_range range,
                enum ipu_color_space in,
                enum ipu_color_space out)
 {
                 * foreground and background are of same colorspace, put
                 * colorspace converter after combining unit.
                 */
-               ipu_dp_csc_init(flow, flow->foreground.in_cs, flow->out_cs,
+               ipu_dp_csc_init(flow, ycbcr_enc, range,
+                               flow->foreground.in_cs, flow->out_cs,
                                DP_COM_CONF_CSC_DEF_BOTH);
        } else {
                if (flow->foreground.in_cs == IPUV3_COLORSPACE_UNKNOWN ||
                         * foreground identical to output, apply color
                         * conversion on background
                         */
-                       ipu_dp_csc_init(flow, flow->background.in_cs,
+                       ipu_dp_csc_init(flow, ycbcr_enc, range,
+                                       flow->background.in_cs,
                                        flow->out_cs, DP_COM_CONF_CSC_DEF_BG);
                else
-                       ipu_dp_csc_init(flow, flow->foreground.in_cs,
+                       ipu_dp_csc_init(flow, ycbcr_enc, range,
+                                       flow->foreground.in_cs,
                                        flow->out_cs, DP_COM_CONF_CSC_DEF_FG);
        }
 
 
 #include <linux/bitmap.h>
 #include <linux/fb.h>
 #include <linux/of.h>
+#include <drm/drm_color_mgmt.h>
 #include <media/v4l2-mediabus.h>
 #include <video/videomode.h>
 
 void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync);
 void ipu_dp_disable(struct ipu_soc *ipu);
 int ipu_dp_setup_channel(struct ipu_dp *dp,
+               enum drm_color_encoding ycbcr_enc, enum drm_color_range range,
                enum ipu_color_space in, enum ipu_color_space out);
 int ipu_dp_set_window_pos(struct ipu_dp *, u16 x_pos, u16 y_pos);
 int ipu_dp_set_global_alpha(struct ipu_dp *dp, bool enable, u8 alpha,