From 2b0721d911714a3f4c18eaecbb12e6ab70e98a39 Mon Sep 17 00:00:00 2001
From: Zheng Yang <zhengyang@rock-chips.com>
Date: Sat, 12 Jul 2014 14:27:59 +0800
Subject: [PATCH] rk3036 tv encoder is ok.

---
 arch/arm/configs/rk3036_defconfig             |  2 ++
 drivers/video/rockchip/lcdc/rk3036_lcdc.c     |  8 ++---
 .../video/rockchip/tve/rk3036/rk3036_tve.c    | 36 ++++++++++++-------
 3 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/arch/arm/configs/rk3036_defconfig b/arch/arm/configs/rk3036_defconfig
index d9a48044e96f..88873604fc64 100644
--- a/arch/arm/configs/rk3036_defconfig
+++ b/arch/arm/configs/rk3036_defconfig
@@ -360,6 +360,8 @@ CONFIG_RK32_LVDS=y
 CONFIG_DP_ANX6345=y
 CONFIG_RK32_DP=y
 CONFIG_RK_HDMI=y
+CONFIG_RK_TVENCODER=y
+CONFIG_RK3036_TV_ENCODER=y
 CONFIG_ROCKCHIP_RGA2=y
 CONFIG_LOGO=y
 # CONFIG_LOGO_LINUX_MONO is not set
diff --git a/drivers/video/rockchip/lcdc/rk3036_lcdc.c b/drivers/video/rockchip/lcdc/rk3036_lcdc.c
index 2be4bd4f7a51..2562ac175699 100644
--- a/drivers/video/rockchip/lcdc/rk3036_lcdc.c
+++ b/drivers/video/rockchip/lcdc/rk3036_lcdc.c
@@ -473,8 +473,8 @@ static int rk3036_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
 			lcdc_writel(lcdc_dev,DSP_VACT_ST_END_F1,v_VAEP(2 * (screen->mode.vsync_len + upper_margin) + y_res + lower_margin + 1)|
 				    v_VASP(2 * (screen->mode.vsync_len + upper_margin) + y_res/2 + lower_margin + 1));
 				    
-			lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_INTERLACE_DSP_EN | m_WIN1_INTERLACE_EN | m_WIN0_YRGB_DEFLICK_EN | m_WIN0_CBR_DEFLICK_EN, 
-				v_INTERLACE_DSP_EN(1) | v_WIN1_INTERLACE_EN(1) | v_WIN0_YRGB_DEFLICK_EN(1) | v_WIN0_CBR_DEFLICK_EN(1) );
+			lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_INTERLACE_DSP_EN | m_WIN1_DIFF_DCLK_EN | m_WIN0_YRGB_DEFLICK_EN | m_WIN0_CBR_DEFLICK_EN, 
+				v_INTERLACE_DSP_EN(1) | v_WIN1_DIFF_DCLK_EN(1) | v_WIN0_YRGB_DEFLICK_EN(1) | v_WIN0_CBR_DEFLICK_EN(1) );
 		} else {
 			val = v_VSYNC(screen->mode.vsync_len) | 
 			      v_VERPRD(screen->mode.vsync_len + upper_margin + 
@@ -485,8 +485,8 @@ static int rk3036_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
 			    v_VASP(screen->mode.vsync_len + screen->mode.upper_margin);
 			lcdc_writel(lcdc_dev, DSP_VACT_ST_END, val);
 			
-			lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_INTERLACE_DSP_EN | m_WIN1_INTERLACE_EN | m_WIN0_YRGB_DEFLICK_EN | m_WIN0_CBR_DEFLICK_EN, 
-				v_INTERLACE_DSP_EN(0) | v_WIN1_INTERLACE_EN(0) | v_WIN0_YRGB_DEFLICK_EN(0) | v_WIN0_CBR_DEFLICK_EN(0) );
+			lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_INTERLACE_DSP_EN | m_WIN1_DIFF_DCLK_EN | m_WIN0_YRGB_DEFLICK_EN | m_WIN0_CBR_DEFLICK_EN, 
+				v_INTERLACE_DSP_EN(0) | v_WIN1_DIFF_DCLK_EN(0) | v_WIN0_YRGB_DEFLICK_EN(0) | v_WIN0_CBR_DEFLICK_EN(0) );
 		}		
 		
 	}
diff --git a/drivers/video/rockchip/tve/rk3036/rk3036_tve.c b/drivers/video/rockchip/tve/rk3036/rk3036_tve.c
index 5ea55fbdede5..46d4a1f31270 100644
--- a/drivers/video/rockchip/tve/rk3036/rk3036_tve.c
+++ b/drivers/video/rockchip/tve/rk3036/rk3036_tve.c
@@ -21,7 +21,7 @@
 #include <linux/rockchip/iomap.h>
 #include "rk3036_tve.h"
 
-#define DEBUG
+//#define DEBUG
 #ifdef DEBUG
 #define TVEDBG(format, ...) \
 		printk(KERN_INFO "RK3036 TVE: " format "\n", ## __VA_ARGS__)
@@ -31,14 +31,14 @@
 
 static const struct fb_videomode rk3036_cvbs_mode [] = {
 	/*	name		refresh	xres	yres	pixclock	h_bp	h_fp	v_bp	v_fp	h_pw	v_pw	polariry	PorI		flag*/
-	{	"NTSC",		60,	720,	576,	27000000,	57,	19,	19,	0,	62,	3,	0,	FB_VMODE_INTERLACED,	0},
-	{	"PAL",		50,	720,	480,	27000000,	69,	12,	19,	2,	63,	3,	0,	FB_VMODE_INTERLACED,	0},
+	{	"NTSC",		60,	720,	480,	27000000,	57,	19,	19,	0,	62,	3,	0,	FB_VMODE_INTERLACED,	0},
+	{	"PAL",		50,	720,	576,	27000000,	69,	12,	19,	2,	63,	3,	0,	FB_VMODE_INTERLACED,	0},
 };
 
 static struct rk3036_tve *rk3036_tve = NULL;
 
-#define tve_writel(offset, v)	writel_relaxed(v, rk3036_tve->regbase + offset);
-#define tve_readl(offset, v)	readl_relaxed(v, rk3036_tve->regbase + offset);
+#define tve_writel(offset, v)	writel_relaxed(v, rk3036_tve->regbase + offset)
+#define tve_readl(offset)	readl_relaxed(rk3036_tve->regbase + offset)
 
 static void dac_enable(bool enable)
 {
@@ -58,6 +58,7 @@ static void dac_enable(bool enable)
 
 static void tve_set_mode (int mode)
 {
+	int i;
 	TVEDBG("%s mode %d\n", __FUNCTION__, mode);
 	
 	tve_writel(TV_RESET, v_RESET(1));
@@ -66,7 +67,7 @@ static void tve_set_mode (int mode)
 	
 	tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) | 
 			v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) | 
-			v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(0) );
+			v_LUMA_FILTER_UPSAMPLE(0) | v_CSC_PATH(0) );
 	tve_writel(TV_LUMA_FILTER0, 0x02ff0000);
 	tve_writel(TV_LUMA_FILTER1, 0xF40202fd);
 	tve_writel(TV_LUMA_FILTER2, 0xF332d919);
@@ -99,6 +100,15 @@ static void tve_set_mode (int mode)
 		tve_writel(TV_ACT_ST,	0x001500F6);
 		tve_writel(TV_ACT_TIMING, 0x2694011D);
 	}
+	
+	#ifdef DEBUG
+		for(i = 0; i < (0x100/4); i++) {
+			printk("0x%08x ", tve_readl(i * 4));
+			if( (i + 1) % 4 == 0)
+				printk("\n");
+		}
+		
+	#endif
 }
 
 static int tve_switch_fb(const struct fb_videomode *modedb, int enable)
@@ -119,17 +129,17 @@ static int tve_switch_fb(const struct fb_videomode *modedb, int enable)
 	screen->mode = *modedb;
 	
 	/* Pin polarity */
-	if(FB_SYNC_HOR_HIGH_ACT & modedb->sync)
+//	if(FB_SYNC_HOR_HIGH_ACT & modedb->sync)
 		screen->pin_hsync = 1;
-	else
-		screen->pin_hsync = 0;
-	if(FB_SYNC_VERT_HIGH_ACT & modedb->sync)
+//	else
+//		screen->pin_hsync = 0;
+//	if(FB_SYNC_VERT_HIGH_ACT & modedb->sync)
 		screen->pin_vsync = 1;
-	else
-		screen->pin_vsync = 0;
+//	else
+//		screen->pin_vsync = 0;
 		
 	screen->pin_den = 0;
-	screen->pin_dclk = 1;
+	screen->pin_dclk = 0;
 	screen->pixelrepeat = 1;
 	
 	/* Swap rule */
-- 
2.34.1