hdmi:use 30bit lcdc interface when output 10bit mode.
authorZheng Yang <zhengyang@rock-chips.com>
Fri, 24 Jul 2015 08:30:44 +0000 (16:30 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Fri, 24 Jul 2015 08:30:44 +0000 (16:30 +0800)
Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
drivers/video/rockchip/hdmi/rockchip-hdmi-core.c
drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c
drivers/video/rockchip/hdmi/rockchip-hdmi.h

index bd2a20f069c082dec19bb5e656216aaa756a38f2..0b411b321c513862997654653382576318e5fca0 100644 (file)
@@ -78,31 +78,31 @@ static inline void hdmi_wq_set_audio(struct hdmi *hdmi)
 
 static void hdmi_wq_set_video(struct hdmi *hdmi)
 {
-       struct hdmi_video       video;
+       struct hdmi_video *video = &(hdmi->video);
        int     deepcolor;
 
        DBG("%s\n", __func__);
 
-       video.sink_hdmi = hdmi->edid.sink_hdmi;
-       video.format_3d = hdmi->mode_3d;
-       video.colorimetry = hdmi->colorimetry;
+       video->sink_hdmi = hdmi->edid.sink_hdmi;
+       video->format_3d = hdmi->mode_3d;
+       video->colorimetry = hdmi->colorimetry;
        /* For DVI, output RGB */
        if (hdmi->edid.sink_hdmi == 0) {
-               video.color_output = HDMI_COLOR_RGB_0_255;
+               video->color_output = HDMI_COLOR_RGB_0_255;
        } else {
                if (hdmi->colormode == HDMI_COLOR_AUTO) {
                        if (hdmi->edid.ycbcr444)
-                               video.color_output = HDMI_COLOR_YCBCR444;
+                               video->color_output = HDMI_COLOR_YCBCR444;
                        else if (hdmi->edid.ycbcr422)
-                               video.color_output = HDMI_COLOR_YCBCR422;
+                               video->color_output = HDMI_COLOR_YCBCR422;
                        else
-                               video.color_output = HDMI_COLOR_RGB_16_235;
+                               video->color_output = HDMI_COLOR_RGB_16_235;
                } else {
-                       video.color_output = hdmi->colormode;
+                       video->color_output = hdmi->colormode;
                }
        }
        if (hdmi->vic & HDMI_VIDEO_YUV420) {
-               video.color_output = HDMI_COLOR_YCBCR420;
+               video->color_output = HDMI_COLOR_YCBCR420;
                deepcolor = hdmi->edid.deepcolor_420;
        } else {
                deepcolor = hdmi->edid.deepcolor;
@@ -111,25 +111,24 @@ static void hdmi_wq_set_video(struct hdmi *hdmi)
            (deepcolor & HDMI_DEEP_COLOR_30BITS)) {
                if (hdmi->colordepth == HDMI_DEPP_COLOR_AUTO ||
                    hdmi->colordepth == 10)
-                       video.color_output_depth = 10;
+                       video->color_output_depth = 10;
        } else {
-               video.color_output_depth = 8;
+               video->color_output_depth = 8;
        }
 
-       pr_info("hdmi output corlor mode is %d\n", video.color_output);
-       video.color_input = HDMI_COLOR_RGB_0_255;
+       pr_info("hdmi output corlor mode is %d\n", video->color_output);
+       video->color_input = HDMI_COLOR_RGB_0_255;
        if (hdmi->property->feature & SUPPORT_YCBCR_INPUT) {
-               if (video.color_output == HDMI_COLOR_YCBCR444 ||
-                   video.color_output == HDMI_COLOR_YCBCR422)
-                       video.color_input = HDMI_COLOR_YCBCR444;
-               else if (video.color_output == HDMI_COLOR_YCBCR420)
-                       video.color_input = HDMI_COLOR_YCBCR420;
+               if (video->color_output == HDMI_COLOR_YCBCR444 ||
+                   video->color_output == HDMI_COLOR_YCBCR422)
+                       video->color_input = HDMI_COLOR_YCBCR444;
+               else if (video->color_output == HDMI_COLOR_YCBCR420)
+                       video->color_input = HDMI_COLOR_YCBCR420;
        }
-       hdmi->colormode_input = video.color_input;
        hdmi_set_lcdc(hdmi);
-       video.vic = hdmi->vic & HDMI_VIC_MASK;
+       video->vic = hdmi->vic & HDMI_VIC_MASK;
        if (hdmi->ops->setvideo)
-               hdmi->ops->setvideo(hdmi, &video);
+               hdmi->ops->setvideo(hdmi, video);
 }
 
 static void hdmi_wq_parse_edid(struct hdmi *hdmi)
index 63a5cfb0052af3ca5ed351df5ce99e16da34d3ba..9f6bf9ef320596d6645b2fd9061ee6365e0f6ae4 100644 (file)
@@ -54,14 +54,21 @@ static int hdmi_set_info(struct rk_screen *screen, struct hdmi *hdmi)
 
        /* screen type & face */
        screen->type = SCREEN_HDMI;
-       if (hdmi->colormode_input == HDMI_COLOR_RGB_0_255)
+       if (hdmi->video.color_input == HDMI_COLOR_RGB_0_255)
                screen->color_mode = COLOR_RGB;
        else
                screen->color_mode = COLOR_YCBCR;
-       if (hdmi->vic & HDMI_VIDEO_YUV420)
-               screen->face = OUT_YUV_420;
-       else
-               screen->face = hdmi_mode[i].interface;
+       if (hdmi->vic & HDMI_VIDEO_YUV420) {
+               if (hdmi->video.color_output_depth == 10)
+                       screen->face = OUT_YUV_420_10BIT;
+               else
+                       screen->face = OUT_YUV_420;
+       } else {
+               if (hdmi->video.color_output_depth == 10)
+                       screen->face = OUT_P101010;
+               else
+                       screen->face = hdmi_mode[i].interface;
+       }
        screen->pixelrepeat = hdmi_mode[i].pixelrepeat - 1;
        mode = (struct fb_videomode *)&(hdmi_mode[i].mode);
 
index 861ca15f4e9bb4e58c97bed67bd54b54169fdd13..c9ddfda57eff54a859f70121fcb3b567ebec3906 100644 (file)
@@ -398,7 +398,6 @@ struct hdmi {
                           0 is unmute*/
        int colordepth;                 /* Output color depth*/
        int colormode;                  /* Output color mode*/
-       int colormode_input;            /* Input color mode*/
        int colorimetry;                /* Output colorimetry */
        struct hdmi_edid edid;          /* EDID information*/
        int enable;                     /* Enable flag*/
@@ -406,7 +405,7 @@ struct hdmi {
        int vic;                        /* HDMI output video information code*/
        int mode_3d;                    /* HDMI output video 3d mode*/
        struct hdmi_audio audio;        /* HDMI output audio information.*/
-
+       struct hdmi_video video;        /* HDMI output video information.*/
        int xscale;
        int yscale;
 };