From: hjc Date: Tue, 8 Apr 2014 03:45:02 +0000 (+0800) Subject: rk3288 lcdc:fix rk3188 ddr change freq in lcdc vblank X-Git-Tag: firefly_0821_release~5606 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=69c59dd382d122523d4b5d075a6aa986e5e94f8f;p=firefly-linux-kernel-4.4.55.git rk3288 lcdc:fix rk3188 ddr change freq in lcdc vblank --- diff --git a/drivers/video/rockchip/lcdc/rk3288_lcdc.c b/drivers/video/rockchip/lcdc/rk3288_lcdc.c index fc847d8880fc..8956a904ff79 100755 --- a/drivers/video/rockchip/lcdc/rk3288_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3288_lcdc.c @@ -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) { diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 9d9801260705..95ce871198b3 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -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) diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index c1faa919e1a8..da31a7087ced 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -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);