From: Zheng Yang Date: Fri, 24 Jul 2015 08:30:44 +0000 (+0800) Subject: hdmi:use 30bit lcdc interface when output 10bit mode. X-Git-Tag: firefly_0821_release~3879 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f5118000d9554862b2b37bd220a2f8b1b47cea73;p=firefly-linux-kernel-4.4.55.git hdmi:use 30bit lcdc interface when output 10bit mode. Signed-off-by: Zheng Yang --- diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c b/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c index bd2a20f069c0..0b411b321c51 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi-core.c @@ -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) diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c b/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c index 63a5cfb0052a..9f6bf9ef3205 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi-lcdc.c @@ -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); diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmi.h b/drivers/video/rockchip/hdmi/rockchip-hdmi.h index 861ca15f4e9b..c9ddfda57eff 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmi.h +++ b/drivers/video/rockchip/hdmi/rockchip-hdmi.h @@ -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; };