rk3288 lcdc:fix rk3188 ddr change freq in lcdc vblank
authorhjc <hjc@rock-chips.com>
Tue, 8 Apr 2014 03:45:02 +0000 (11:45 +0800)
committerhjc <hjc@rock-chips.com>
Tue, 8 Apr 2014 03:45:02 +0000 (11:45 +0800)
drivers/video/rockchip/lcdc/rk3288_lcdc.c
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index fc847d8880fc2c8fab67fdcb7b18029ee9ba883d..8956a904ff7963224ea717c68c592bcd8b950927 100755 (executable)
@@ -2894,6 +2894,16 @@ static int rk3288_lcdc_dpi_status(struct rk_lcdc_driver *dev_drv)
        spin_unlock(&lcdc_dev->reg_lock);
        return ovl;
 }
+static rk3288_lcdc_set_irq_to_cpu(struct rk_lcdc_driver * dev_drv,int enable)
+{
+       struct lcdc_device *lcdc_dev =
+                                container_of(dev_drv,struct lcdc_device,driver);
+       if (enable)
+               enable_irq(lcdc_dev->irq);
+       else
+               disable_irq(lcdc_dev->irq);
+       return 0;
+}
 
 int rk3288_lcdc_poll_vblank(struct rk_lcdc_driver *dev_drv)
 {
@@ -2902,7 +2912,7 @@ int rk3288_lcdc_poll_vblank(struct rk_lcdc_driver *dev_drv)
        u32 int_reg;
        int ret;
 
-       if (lcdc_dev->clk_on{
+       if (lcdc_dev->clk_on &&(!dev_drv->suspend_flag)){
                int_reg = lcdc_readl(lcdc_dev, INTR_CTRL0);
                if (int_reg & m_LINE_FLAG_INTR_STS) {
                        lcdc_msk_reg(lcdc_dev, INTR_CTRL0, m_LINE_FLAG_INTR_CLR,
@@ -3115,6 +3125,7 @@ static struct rk_lcdc_drv_ops lcdc_drv_ops = {
        .dump_reg               = rk3288_lcdc_reg_dump,
        .mmu_en                 = rk3288_lcdc_mmu_en,
        .cfg_done               = rk3288_lcdc_config_done,
+       .set_irq_to_cpu         = rk3288_lcdc_set_irq_to_cpu,
 };
 static int rk3288_lcdc_parse_irq(struct lcdc_device *lcdc_dev,unsigned int reg_val)
 {
index 9d9801260705602c787bcc503d00d85f582859a0..95ce871198b36378ff685287c053db60e9591c96 100755 (executable)
@@ -587,12 +587,28 @@ int rk_fb_poll_prmry_screen_vblank(void)
 bool rk_fb_poll_wait_frame_complete(void)
 {
        uint32_t timeout = RK_LF_MAX_TIMEOUT;
-       if (rk_fb_poll_prmry_screen_vblank() == RK_LF_STATUS_NC)
+       struct rk_lcdc_driver *dev_drv = rk_get_prmry_lcdc_drv();
+       
+       if (likely(dev_drv)) {
+               if (dev_drv->ops->set_irq_to_cpu)
+                       dev_drv->ops->set_irq_to_cpu(dev_drv,0);
+       }
+
+       
+       if (rk_fb_poll_prmry_screen_vblank() == RK_LF_STATUS_NC){
+               if(dev_drv->ops->set_irq_to_cpu)
+                        dev_drv->ops->set_irq_to_cpu(dev_drv,1);               
                return false;
+       }       
 
        while (!(rk_fb_poll_prmry_screen_vblank() == RK_LF_STATUS_FR)  &&  --timeout);
        while (!(rk_fb_poll_prmry_screen_vblank() == RK_LF_STATUS_FC)  &&  --timeout);
 
+       if (likely(dev_drv)) {
+                if (dev_drv->ops->set_irq_to_cpu)
+                        dev_drv->ops->set_irq_to_cpu(dev_drv,1);
+        }
+
        return true;
 }
 static int rk_fb_open(struct fb_info *info, int user)
index c1faa919e1a8ccb05541269cf467f390ff330543..da31a7087ced1a8463348973e2354b11141b385a 100755 (executable)
@@ -372,6 +372,7 @@ struct rk_lcdc_drv_ops {
        int (*set_dsp_lut) (struct rk_lcdc_driver * dev_drv, int *lut);
        int (*read_dsp_lut) (struct rk_lcdc_driver * dev_drv, int *lut);
        int (*lcdc_hdmi_process) (struct rk_lcdc_driver * dev_drv, int mode);   //some lcdc need to some process in hdmi mode
+       int (*set_irq_to_cpu)(struct rk_lcdc_driver *dev_drv,int enable);
        int (*poll_vblank) (struct rk_lcdc_driver * dev_drv);
        int (*lcdc_rst) (struct rk_lcdc_driver * dev_drv);
        int (*dpi_open) (struct rk_lcdc_driver * dev_drv, bool open);