rk fb: fix disp size err when switch hdmi resolution if disp_mode is ONE_DUAL
authorzwl <zwl@rockchips.com>
Mon, 25 Aug 2014 08:05:36 +0000 (16:05 +0800)
committerzwl <zwl@rockchips.com>
Mon, 25 Aug 2014 14:34:12 +0000 (22:34 +0800)
drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/lcdc/rk312x_lcdc.h
drivers/video/rockchip/rk_fb.c

index be9973b3cbf06ad1a3f64d934eee867366a825ff..4819c9c1d3304e1a50a4e89aca67ad9e9d29369c 100755 (executable)
@@ -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);
index 8422303fb2b583040174f9d14449f17d44f23c81..8bd3226d88cc4038c999a6605d727dc62e17565a 100755 (executable)
@@ -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;
index 882c378aede305fd96ad9feef52a1466b4b8760d..32d252d1b5b7a81e217631f1d71a5d581ed97b64 100755 (executable)
@@ -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 =