From c6cb47e2a02c3b2da4aa6b1dbd403ec09740ad41 Mon Sep 17 00:00:00 2001 From: zyw Date: Fri, 31 Dec 2010 13:07:55 +0800 Subject: [PATCH] fix bug in open and close fb1 --- drivers/video/display/screen/lcd_hsd100pxn.c | 4 ++-- drivers/video/rk29_fb.c | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/drivers/video/display/screen/lcd_hsd100pxn.c b/drivers/video/display/screen/lcd_hsd100pxn.c index 2cd047ede2bb..f20ab6f3c68a 100755 --- a/drivers/video/display/screen/lcd_hsd100pxn.c +++ b/drivers/video/display/screen/lcd_hsd100pxn.c @@ -13,9 +13,9 @@ #if defined(CONFIG_MACH_RK29SDK) #define OUT_FACE OUT_D888_P666 #elif defined(CONFIG_MACH_RK29_AIGO) -#define OUT_FACE OUT_D888_P666 //OUT_P888 +#define OUT_FACE OUT_D888_P666 //OUT_P888 #endif -#define OUT_CLK 65000000 +#define OUT_CLK 58500000 // 65000000 #define LCDC_ACLK 312000000 //29 lcdc axi DMA ƵÂÊ /* Timing */ diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index f3fc1e44addd..de9416318a5f 100644 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -1533,11 +1533,11 @@ static int fb1_set_par(struct fb_info *info) smem_len = fix->line_length * yvir + cblen + crlen; map_size = PAGE_ALIGN(smem_len); - fix->smem_start = y_addr; + // fix->smem_start = y_addr; fix->smem_len = smem_len; - fix->mmio_start = uv_addr; + // fix->mmio_start = uv_addr; - par->addr_seted = ((-1==(int)y_addr) || (0==(int)y_addr) || (win0_en==0)) ? 0 : 1; + // par->addr_seted = ((-1==(int)y_addr) || (0==(int)y_addr) || (win0_en==0)) ? 0 : 1; fbprintk("buffer alloced by user fix->smem_start = %8x, fix->smem_len = %8x, fix->mmio_start = %8x \n", (u32)fix->smem_start, (u32)fix->smem_len, (u32)fix->mmio_start); par->format = format; @@ -1554,8 +1554,9 @@ static int fb1_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) { struct win0_par *par = info->par; // enable win0 after the win0 addr is seted - par->par_seted = 1; + win0_pan(info); + par->par_seted = 1; return 0; } @@ -1592,7 +1593,8 @@ int fb1_release(struct fb_info *info, int user) par->refcount--; inf->video_mode = 0; par->par_seted = 0; - + par->addr_seted = 0; + win0_blank(FB_BLANK_POWERDOWN, info); win1_blank(FB_BLANK_POWERDOWN, info); // wait for lcdc stop access memory msleep(50); @@ -1612,6 +1614,7 @@ static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { struct rk29fb_inf *inf = dev_get_drvdata(info->device); struct win0_par *par = info->par; + struct fb_fix_screeninfo *fix0 = &info->fix; void __user *argp = (void __user *)arg; fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); @@ -1645,12 +1648,15 @@ static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) yuv_phy[0] += par->y_offset; yuv_phy[1] += par->c_offset; + fix0->smem_start = yuv_phy[0]; + fix0->mmio_start = yuv_phy[1]; LcdWrReg(inf, WIN0_YRGB_MST, yuv_phy[0]); LcdWrReg(inf, WIN0_CBR_MST, yuv_phy[1]); - LcdWrReg(inf, REG_CFG_DONE, 0x01); // enable win0 after the win0 par is seted + LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(par->par_seted && par->addr_seted)); par->addr_seted = 1; + LcdWrReg(inf, REG_CFG_DONE, 0x01); if(par->par_seted) { unsigned long flags; if (par->mirror.c_offset) { @@ -1661,7 +1667,6 @@ static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) } local_irq_save(flags); - LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(par->par_seted)); par->mirror.y_offset = yuv_phy[0]; par->mirror.c_offset = yuv_phy[1]; local_irq_restore(flags); -- 2.34.1