rk3036 hdmi: fix hdmi display error when TV power down and power up
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / rk_hdmi_lcdc.c
index cb61763ac68cc0c508668999ad2417299b0fed42..f41a73a19fabebf9060cf998fc55229fd58f667b 100755 (executable)
 struct hdmi *m_hdmi_drv;
 
 static const struct fb_videomode hdmi_mode[] = {
-       /*      name            refresh xres    yres    pixclock        h_bp    h_fp    v_bp    v_fp    h_pw    v_pw                    polariry                        PorI    flag(used for vic) */
+       /*      name            refresh xres    yres    pixclock                h_bp    h_fp    v_bp    v_fp    h_pw    v_pw                    polariry                        PorI    flag(used for vic) */
 /*
        {"640x480p@60Hz",       60,     640,    480,    25175000,       48,     16,     33,     10,     96,     2,                      0,                              0,      1 },
-       {"720x480i@60Hz",       60,     720,    480,    27000000,       114,    38,     15,     4,      124,    3,                      0,                              1,      6 },
-       {"720x576i@50Hz",       50,     720,    576,    27000000,       138,    24,     19,     2,      126,    3,                      0,                              1,      21},
 */
+       {"720x480i@60Hz",       60,     720,    480,    27000000,       57,     19,   15,     4,        62,     3,                      0,                              1,      6 },
+       {"720x576i@50Hz",       50,     720,    576,    27000000,       69,     12,     19,     2,      63,     3,                      0,                              1,      21},
        {"720x480p@60Hz",       60,     720,    480,    27000000,       60,     16,     30,     9,      62,     6,                      0,                              0,      2 },
        {"720x576p@50Hz",       50,     720,    576,    27000000,       68,     12,     39,     5,      64,     5,                      0,                              0,      17},
 /*
@@ -31,9 +31,9 @@ static const struct fb_videomode hdmi_mode[] = {
        {"1920x1080p@25Hz",     25,     1920,   1080,   74250000,       148,    528,    36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      33},
        {"1920x1080p@30Hz",     30,     1920,   1080,   74250000,       148,    88,     36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      34},
        {"1920x1080i@50Hz_2",   50,     1920,   1080,   72000000,       184,    32,     57,     23,     168,    5,      FB_SYNC_HOR_HIGH_ACT,                           1,      39},
+*/
        {"1920x1080i@50Hz",     50,     1920,   1080,   74250000,       148,    528,    15,     2,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   1,      20},
        {"1920x1080i@60Hz",     60,     1920,   1080,   74250000,       148,    88,     15,     2,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   1,      5 },
-*/
        {"1920x1080p@50Hz",     50,     1920,   1080,   148500000,      148,    528,    36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      31},
        {"1920x1080p@60Hz",     60,     1920,   1080,   148500000,      148,    88,     36,     4,      44,     5,      FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,   0,      16},
 /*
@@ -106,6 +106,7 @@ int hdmi_set_info(struct rk_screen *screen, unsigned int vic)
        /* screen type & face */
        screen->type = OUT_TYPE;
        screen->face = OUT_FACE;
+       screen->color_mode = COLOR_YCBCR;
 
        /* Screen size */
        screen->mode.xres = hdmi_mode[i].xres;
@@ -121,10 +122,14 @@ int hdmi_set_info(struct rk_screen *screen, unsigned int vic)
        screen->mode.upper_margin = hdmi_mode[i].upper_margin;
        screen->mode.lower_margin = hdmi_mode[i].lower_margin;
        screen->mode.vsync_len = hdmi_mode[i].vsync_len;
+       screen->mode.vmode = hdmi_mode[i].vmode;
        screen->hdmi_resolution = hdmi_mode[i].flag;
+       if ((screen->hdmi_resolution == HDMI_720X480I_60HZ_VIC) ||
+               (screen->hdmi_resolution == HDMI_720X576I_50HZ_VIC))
+               screen->pixelrepeat = 1;
 
        /* Pin polarity */
-#if defined(CONFIG_HDMI_RK616) && !defined(CONFIG_ARCH_RK3026) && !defined(SOC_CONFIG_RK3036)
+#if defined(CONFIG_HDMI_RK616) && !defined(CONFIG_ARCH_RK3026)
        screen->pin_hsync = 0;
        screen->pin_vsync = 0;
 #else
@@ -439,10 +444,11 @@ int hdmi_videomode_to_vic(struct fb_videomode *vmode)
                    vmode->lower_margin == hdmi_mode[i].lower_margin &&
                    vmode->hsync_len == hdmi_mode[i].hsync_len &&
                    vmode->vsync_len == hdmi_mode[i].vsync_len) {
-                       if ((vmode->vmode == FB_VMODE_NONINTERLACED
+                       /*if ((vmode->vmode == FB_VMODE_NONINTERLACED
                             && vmode->yres == hdmi_mode[i].yres)
                            || (vmode->vmode == FB_VMODE_INTERLACED
-                               && vmode->yres == hdmi_mode[i].yres / 2)) {
+                               && vmode->yres == hdmi_mode[i].yres / 2))*/
+                       {
                                vic = hdmi_mode[i].flag;
                                break;
                        }
@@ -564,10 +570,24 @@ int hdmi_switch_fb(struct hdmi *hdmi, int vic)
  */
 int hdmi_init_video_para(struct hdmi *hdmi_drv, struct hdmi_video_para *video)
 {
+       struct rk_lcdc_driver *lcdc_drv = NULL;
+
+       if (unlikely(hdmi_drv == NULL))
+               return -1;
+
+       lcdc_drv = hdmi_drv->lcdc;
+       if (unlikely(lcdc_drv == NULL))
+               return -1;
+
        memset(video, 0, sizeof(struct hdmi_video_para));
+
        video->vic = hdmi_drv->vic;
        video->input_mode = VIDEO_INPUT_RGB_YCBCR_444;
-       video->input_color = VIDEO_INPUT_COLOR_RGB;
+       if (lcdc_drv->output_color == COLOR_RGB)
+               video->input_color = VIDEO_INPUT_COLOR_RGB;
+       else
+               video->input_color = VIDEO_INPUT_COLOR_YCBCR444;
+
        video->output_mode = hdmi_drv->edid.sink_hdmi;
        video->format_3d = 0;   /* TODO modify according to EDID if need */
        video->pixel_repet = 0;