From 817e27c4f5701ad5086b39e172e8d790c597ccec Mon Sep 17 00:00:00 2001 From: zwl Date: Mon, 25 Aug 2014 16:05:36 +0800 Subject: [PATCH] rk fb: fix disp size err when switch hdmi resolution if disp_mode is ONE_DUAL --- drivers/video/rockchip/lcdc/rk312x_lcdc.c | 21 ++++++++++++++------- drivers/video/rockchip/lcdc/rk312x_lcdc.h | 1 + drivers/video/rockchip/rk_fb.c | 21 +-------------------- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk312x_lcdc.c b/drivers/video/rockchip/lcdc/rk312x_lcdc.c index be9973b3cbf0..4819c9c1d330 100755 --- a/drivers/video/rockchip/lcdc/rk312x_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk312x_lcdc.c @@ -712,7 +712,10 @@ static int rk312x_lcdc_set_scaler(struct rk_lcdc_driver *dev_drv, m_SCALER_EN | m_SCALER_OUT_ZERO | m_SCALER_OUT_EN, v_SCALER_EN(0) | v_SCALER_OUT_ZERO(0) | v_SCALER_OUT_EN(0)); spin_unlock(&lcdc_dev->reg_lock); - clk_disable_unprepare(lcdc_dev->sclk); + if (lcdc_dev->sclk_on) { + clk_disable_unprepare(lcdc_dev->sclk); + lcdc_dev->sclk_on = false; + } dev_dbg(lcdc_dev->dev, "%s: disable\n", __func__); return 0; } @@ -728,12 +731,16 @@ static int rk312x_lcdc_set_scaler(struct rk_lcdc_driver *dev_drv, return -EINVAL; } - clk_prepare_enable(lcdc_dev->sclk); - lcdc_dev->s_pixclock = calc_sclk_freq(src, dst); - pll_freq = calc_sclk_pll_freq(lcdc_dev->s_pixclock); - clk_set_rate(lcdc_dev->pll_sclk, pll_freq); - clk_set_rate(lcdc_dev->sclk, lcdc_dev->s_pixclock); - dev_info(lcdc_dev->dev, "%s:sclk=%d\n", __func__, lcdc_dev->s_pixclock); + if (!lcdc_dev->sclk_on) { + clk_prepare_enable(lcdc_dev->sclk); + lcdc_dev->s_pixclock = calc_sclk_freq(src, dst); + pll_freq = calc_sclk_pll_freq(lcdc_dev->s_pixclock); + clk_set_rate(lcdc_dev->pll_sclk, pll_freq); + clk_set_rate(lcdc_dev->sclk, lcdc_dev->s_pixclock); + lcdc_dev->sclk_on = true; + dev_info(lcdc_dev->dev, "%s:sclk=%d\n", __func__, + lcdc_dev->s_pixclock); + } /* config scale timing */ calc_dsp_frm_vst_hst(src, dst); diff --git a/drivers/video/rockchip/lcdc/rk312x_lcdc.h b/drivers/video/rockchip/lcdc/rk312x_lcdc.h index 8422303fb2b5..8bd3226d88cc 100755 --- a/drivers/video/rockchip/lcdc/rk312x_lcdc.h +++ b/drivers/video/rockchip/lcdc/rk312x_lcdc.h @@ -674,6 +674,7 @@ struct lcdc_device { bool pre_init; bool pwr18; /* if lcdc use 1.8v power supply */ bool clk_on; /* if aclk or hclk is closed ,acess to register is not allowed */ + bool sclk_on; /* if sclk is open or closed */ u8 atv_layer_cnt; /* active layer counter,when atv_layer_cnt = 0,lcdc is disable*/ unsigned int irq; diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 882c378aede3..32d252d1b5b7 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -2768,24 +2768,6 @@ static int rk_fb_set_par(struct fb_info *info) ysize = screen->mode.yres; } - /* this is for device like rk2928/rk312x, - * which have one lcdc but two display outputs - * save win parameter set by android - */ - if (rk_fb->disp_mode != DUAL) { - if (screen->screen_id == 0) { - dev_drv->screen0->xsize = xsize; - dev_drv->screen0->ysize = ysize; - dev_drv->screen0->xpos = xpos; - dev_drv->screen0->ypos = ypos; - } else { - xsize = dev_drv->screen1->xsize; - ysize = dev_drv->screen1->ysize; - xpos = dev_drv->screen1->xpos; - ypos = dev_drv->screen1->ypos; - } - } - fb_data_fmt = rk_fb_data_fmt(data_format, var->bits_per_pixel); pixel_width = rk_fb_pixel_width(fb_data_fmt); vir_width_bit = pixel_width * xvir; @@ -3342,8 +3324,7 @@ int rk_fb_disp_scale(u8 scale_x, u8 scale_y, u8 lcdc_id) screen_x = dev_drv->cur_screen->mode.xres; screen_y = dev_drv->cur_screen->mode.yres; - if (inf->disp_mode != DUAL && - dev_drv->cur_screen->screen_id == 1) { + if (inf->disp_mode != DUAL) { dev_drv->cur_screen->xpos = (screen_x - screen_x * scale_x / 100) >> 1; dev_drv->cur_screen->ypos = -- 2.34.1