From 2ae8a8c95e8aaac9597410253f0cdfeacbb59617 Mon Sep 17 00:00:00 2001 From: yzq Date: Tue, 23 Oct 2012 10:34:26 +0800 Subject: [PATCH] rk fb: update hdmi scale and switch screen func --- drivers/video/rockchip/rk_fb.c | 63 ++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index ce2fcd191be0..476021ffe214 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -399,20 +399,12 @@ static int rk_fb_set_par(struct fb_info *info) ysize = (var->grayscale>>20) & 0xfff; } else //ohterwise full screen display - { - xsize = screen->x_res; - ysize = screen->y_res; - } - -#if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) -#if defined(CONFIG_RK_HDMI) - if(hdmi_get_hotplug() == HDMI_HPD_ACTIVED) { xsize = screen->x_res; ysize = screen->y_res; } -#endif +#if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) if(screen->screen_id == 0) //this is for device like rk2928 ,whic have one lcdc but two display outputs { //save parameter set by android dev_drv->screen0->xsize = xsize; @@ -422,10 +414,10 @@ static int rk_fb_set_par(struct fb_info *info) } else { - dev_drv->screen1->xsize = xsize; - dev_drv->screen1->ysize = ysize; - dev_drv->screen1->xpos = xpos; - dev_drv->screen1->ypos = ypos; + xsize = dev_drv->screen1->xsize; + ysize = dev_drv->screen1->ysize; + xpos = dev_drv->screen1->xpos; + ypos = dev_drv->screen1->ypos; } #endif /* calculate y_offset,c_offset,line_length,cblen and crlen */ @@ -636,6 +628,10 @@ int rk_fb_switch_screen(rk_screen *screen ,int enable ,int lcdc_id) int ret; int i; int layer_id; + +#if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) + rk29_backlight_set(0); +#endif sprintf(name, "lcdc%d",lcdc_id); for(i = 0; i < inf->num_lcdc; i++) //find the driver the display device connected to @@ -738,10 +734,14 @@ int rk_fb_switch_screen(rk_screen *screen ,int enable ,int lcdc_id) if(dev_drv->screen1) //device like rk2928,whic have one lcdc but two outputs { - info->var.nonstd &= 0xff; - info->var.nonstd |= (dev_drv->cur_screen->xpos<<8) + (dev_drv->cur_screen->ypos<<20); - info->var.grayscale &= 0xff; - info->var.grayscale |= (dev_drv->cur_screen->x_res<<8) + (dev_drv->cur_screen->y_res<<20); + // info->var.nonstd &= 0xff; + // info->var.nonstd |= (dev_drv->cur_screen->xpos<<8) + (dev_drv->cur_screen->ypos<<20); + // info->var.grayscale &= 0xff; + // info->var.grayscale |= (dev_drv->cur_screen->x_res<<8) + (dev_drv->cur_screen->y_res<<20); + dev_drv->screen1->xsize = dev_drv->cur_screen->x_res; + dev_drv->screen1->ysize = dev_drv->cur_screen->y_res; + dev_drv->screen1->xpos = 0; + dev_drv->screen1->ypos = 0; } ret = info->fbops->fb_open(info,1); ret = dev_drv->load_screen(dev_drv,1); @@ -760,6 +760,8 @@ int rk_fb_switch_screen(rk_screen *screen ,int enable ,int lcdc_id) #if defined(CONFIG_NO_DUAL_DISP) //close backlight for device whic do not support dual display rk29_backlight_set(!enable); +#elif defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) //close backlight for device whic do not support dual display + rk29_backlight_set(1); #endif return 0; @@ -806,14 +808,25 @@ int rk_fb_disp_scale(u8 scale_x, u8 scale_y,u8 lcdc_id) var = &info->var; screen_x = dev_drv->cur_screen->x_res; screen_y = dev_drv->cur_screen->y_res; - xpos = (screen_x-screen_x*scale_x/100)>>1; - ypos = (screen_y-screen_y*scale_y/100)>>1; - xsize = screen_x*scale_x/100; - ysize = screen_y*scale_y/100; - var->nonstd &= 0xff; - var->nonstd |= (xpos<<8) + (ypos<<20); - var->grayscale &= 0xff; - var->grayscale |= (xsize<<8) + (ysize<<20); + +#if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF) + if(dev_drv->cur_screen->screen_id == 1){ + dev_drv->cur_screen->xpos = (screen_x-screen_x*scale_x/100)>>1; + dev_drv->cur_screen->ypos = (screen_y-screen_y*scale_y/100)>>1; + dev_drv->cur_screen->xsize = screen_x*scale_x/100; + dev_drv->cur_screen->ysize = screen_y*scale_y/100; + }else +#endif + { + xpos = (screen_x-screen_x*scale_x/100)>>1; + ypos = (screen_y-screen_y*scale_y/100)>>1; + xsize = screen_x*scale_x/100; + ysize = screen_y*scale_y/100; + var->nonstd &= 0xff; + var->nonstd |= (xpos<<8) + (ypos<<20); + var->grayscale &= 0xff; + var->grayscale |= (xsize<<8) + (ysize<<20); + } info->fbops->fb_set_par(info); return 0; -- 2.34.1