hdmi:rk3036/rk3128: support 3D type Frame packing.
authorZheng Yang <zhengyang@rock-chips.com>
Thu, 30 Jul 2015 08:53:26 +0000 (16:53 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Thu, 30 Jul 2015 08:53:26 +0000 (16:53 +0800)
Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c

index 88d7d32215963c866f52729f5a3f9293046d65bf..fd3b8038b0cd1f892035358dca77e941e8387164 100644 (file)
@@ -608,10 +608,16 @@ static int rockchip_hdmiv1_config_video(struct hdmi *hdmi_drv,
        rockchip_hdmiv1_video_csc(hdmi_drv, vpara);
 
        /* Set ext video timing */
-       if (mode->vmode || mode->pixclock <= 27000000) {
+       if ((mode->vmode || mode->pixclock <= 27000000) &&
+           vpara->format_3d != HDMI_3D_FRAME_PACKING) {
                hdmi_writel(hdmi_dev, VIDEO_TIMING_CTL, 0);
        } else {
-               value = v_EXTERANL_VIDEO(1) | v_INETLACE(mode->vmode);
+               if (vpara->format_3d == HDMI_3D_FRAME_PACKING)
+                       value = v_EXTERANL_VIDEO(1) |
+                               v_INETLACE(0);
+               else
+                       value = v_EXTERANL_VIDEO(1) |
+                               v_INETLACE(mode->vmode);
                if (mode->sync & FB_SYNC_HOR_HIGH_ACT)
                        value |= v_HSYNC_POLARITY(1);
                if (mode->sync & FB_SYNC_VERT_HIGH_ACT)
@@ -640,8 +646,23 @@ static int rockchip_hdmiv1_config_video(struct hdmi *hdmi_drv,
                hdmi_writel(hdmi_dev, VIDEO_EXT_HDURATION_H,
                            (value >> 8) & 0xFF);
 
-               value = mode->upper_margin + mode->yres + mode->lower_margin +
-                   mode->vsync_len;
+               if (vpara->format_3d == HDMI_3D_FRAME_PACKING) {
+                       if (mode->vmode == 0)
+                               value = mode->upper_margin +
+                                       mode->lower_margin +
+                                       mode->vsync_len +
+                                       2 * mode->yres;
+                       else
+                               value = 4 * (mode->upper_margin +
+                                            mode->lower_margin +
+                                            mode->vsync_len) +
+                                       2 * mode->yres + 2;
+               } else {
+                       value = mode->upper_margin +
+                               mode->lower_margin +
+                               mode->vsync_len +
+                               mode->yres;
+               }
                hdmi_writel(hdmi_dev, VIDEO_EXT_VTOTAL_L, value & 0xFF);
                hdmi_writel(hdmi_dev, VIDEO_EXT_VTOTAL_H, (value >> 8) & 0xFF);