From 804af56ddedb5b9a9e831e5cbe2311873a8f7e4b Mon Sep 17 00:00:00 2001 From: yxj Date: Fri, 13 Sep 2013 17:59:12 +0800 Subject: [PATCH] =?utf8?q?rk30=E3=80=81rk3066b=E3=80=81rk3188=20lcdc:only?= =?utf8?q?=20resume=20the=20lcdc=20that=20will=20be=20used?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/video/rockchip/lcdc/rk3066b_lcdc.c | 98 ++++++++++------------ drivers/video/rockchip/lcdc/rk30_lcdc.c | 84 ++++++++++--------- drivers/video/rockchip/lcdc/rk3188_lcdc.c | 88 ++++++++++--------- 3 files changed, 140 insertions(+), 130 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk3066b_lcdc.c b/drivers/video/rockchip/lcdc/rk3066b_lcdc.c index 25af8678c63e..fab4ffff504c 100755 --- a/drivers/video/rockchip/lcdc/rk3066b_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3066b_lcdc.c @@ -45,15 +45,17 @@ module_param(dbg_thresd, int, S_IRUGO|S_IWUSR); static int rk3066b_lcdc_clk_enable(struct rk3066b_lcdc_device *lcdc_dev) { + if(!lcdc_dev->clk_on) + { + clk_enable(lcdc_dev->hclk); + clk_enable(lcdc_dev->dclk); + clk_enable(lcdc_dev->aclk); + clk_enable(lcdc_dev->pd); - clk_enable(lcdc_dev->hclk); - clk_enable(lcdc_dev->dclk); - clk_enable(lcdc_dev->aclk); - clk_enable(lcdc_dev->pd); - - spin_lock(&lcdc_dev->reg_lock); - lcdc_dev->clk_on = 1; - spin_unlock(&lcdc_dev->reg_lock); + spin_lock(&lcdc_dev->reg_lock); + lcdc_dev->clk_on = 1; + spin_unlock(&lcdc_dev->reg_lock); + } printk("rk3066b lcdc%d clk enable...\n",lcdc_dev->id); return 0; @@ -61,14 +63,17 @@ static int rk3066b_lcdc_clk_enable(struct rk3066b_lcdc_device *lcdc_dev) static int rk3066b_lcdc_clk_disable(struct rk3066b_lcdc_device *lcdc_dev) { - spin_lock(&lcdc_dev->reg_lock); - lcdc_dev->clk_on = 0; - spin_unlock(&lcdc_dev->reg_lock); - mdelay(25); - clk_disable(lcdc_dev->dclk); - clk_disable(lcdc_dev->hclk); - clk_disable(lcdc_dev->aclk); - clk_disable(lcdc_dev->pd); + if(lcdc_dev->clk_on) + { + spin_lock(&lcdc_dev->reg_lock); + lcdc_dev->clk_on = 0; + spin_unlock(&lcdc_dev->reg_lock); + mdelay(25); + clk_disable(lcdc_dev->dclk); + clk_disable(lcdc_dev->hclk); + clk_disable(lcdc_dev->aclk); + clk_disable(lcdc_dev->pd); + } printk("rk3066b lcdc%d clk disable...\n",lcdc_dev->id); return 0; @@ -438,9 +443,10 @@ static int rk3066b_lcdc_blank(struct rk_lcdc_device_driver*lcdc_drv,int layer_id break; } LCDC_REG_CFG_DONE(); - printk(KERN_INFO "%s>>>>>%d\n",__func__, blank_mode); } spin_unlock(&lcdc_dev->reg_lock); + + dev_info(lcdc_drv->dev,"blank mode:%d\n",blank_mode); return 0; } @@ -1069,12 +1075,7 @@ int rk3066b_lcdc_early_suspend(struct rk_lcdc_device_driver *dev_drv) return 0; } - - mdelay(30); - clk_disable(lcdc_dev->dclk); - clk_disable(lcdc_dev->hclk); - clk_disable(lcdc_dev->aclk); - clk_disable(lcdc_dev->pd); + rk3066b_lcdc_clk_disable(lcdc_dev); return 0; } @@ -1090,47 +1091,40 @@ int rk3066b_lcdc_early_resume(struct rk_lcdc_device_driver *dev_drv) if(dev_drv->screen_ctr_info->io_enable) //power on dev_drv->screen_ctr_info->io_enable(); - if(!lcdc_dev->clk_on) + if(lcdc_dev->atv_layer_cnt) //only resume the lcdc that need to use { - clk_enable(lcdc_dev->pd); - clk_enable(lcdc_dev->hclk); - clk_enable(lcdc_dev->dclk); - clk_enable(lcdc_dev->aclk); - } - mdelay(5); - memcpy((u8*)lcdc_dev->preg, (u8*)&lcdc_dev->regbak, 0x24); //resume reg ,skip INT_STATUS reg - memcpy(((u8*)lcdc_dev->preg) + 0x28,((u8*)&lcdc_dev->regbak) + 0x28, 0x74); - - spin_lock(&lcdc_dev->reg_lock); + + rk3066b_lcdc_clk_enable(lcdc_dev); + mdelay(5); + memcpy((u8*)lcdc_dev->preg, (u8*)&lcdc_dev->regbak, 0x24); //resume reg ,skip INT_STATUS reg + memcpy(((u8*)lcdc_dev->preg) + 0x28,((u8*)&lcdc_dev->regbak) + 0x28, 0x74); - if(dev_drv->cur_screen->dsp_lut) //resume dsp lut - { - LcdMskReg(lcdc_dev,SYS_CFG,m_DSIP_LUT_CTL,v_DSIP_LUT_CTL(0)); - LCDC_REG_CFG_DONE(); + spin_lock(&lcdc_dev->reg_lock); - mdelay(25); //wait for dsp lut disabled - for(i=0;i<256;i++) + if(dev_drv->cur_screen->dsp_lut) //resume dsp lut { - v = dev_drv->cur_screen->dsp_lut[i]; - c = lcdc_dev->dsp_lut_addr_base+i; - writel_relaxed(v,c); + LcdMskReg(lcdc_dev,SYS_CFG,m_DSIP_LUT_CTL,v_DSIP_LUT_CTL(0)); + LCDC_REG_CFG_DONE(); + + mdelay(25); //wait for dsp lut disabled + for(i=0;i<256;i++) + { + v = dev_drv->cur_screen->dsp_lut[i]; + c = lcdc_dev->dsp_lut_addr_base+i; + writel_relaxed(v,c); + } + LcdMskReg(lcdc_dev,SYS_CFG,m_DSIP_LUT_CTL,v_DSIP_LUT_CTL(1));//enable dsp lut } - LcdMskReg(lcdc_dev,SYS_CFG,m_DSIP_LUT_CTL,v_DSIP_LUT_CTL(1));//enable dsp lut - } - if(lcdc_dev->atv_layer_cnt) - { LcdMskReg(lcdc_dev, SYS_CFG,m_LCDC_STANDBY,v_LCDC_STANDBY(0)); LcdMskReg(lcdc_dev, INT_STATUS, m_SCANNING_CLEAR | m_FRM_STARTCLEAR | m_HOR_STARTCLEAR | m_SCANNING_MASK | m_HOR_STARTMASK | m_FRM_STARTMASK , v_SCANNING_CLEAR(1) | v_FRM_STARTCLEAR(1) | v_HOR_STARTCLEAR(1) | v_SCANNING_MASK(0) | v_FRM_STARTMASK(0) | v_HOR_STARTMASK(1)); LCDC_REG_CFG_DONE(); - } - lcdc_dev->clk_on = 1; - spin_unlock(&lcdc_dev->reg_lock); + + spin_unlock(&lcdc_dev->reg_lock); - if(!lcdc_dev->atv_layer_cnt) - rk3066b_lcdc_clk_disable(lcdc_dev); + } if(dev_drv->screen0->standby) dev_drv->screen0->standby(0); //screen wake up diff --git a/drivers/video/rockchip/lcdc/rk30_lcdc.c b/drivers/video/rockchip/lcdc/rk30_lcdc.c index 3b23b55ed091..3823861ddc00 100755 --- a/drivers/video/rockchip/lcdc/rk30_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk30_lcdc.c @@ -41,29 +41,35 @@ module_param(dbg_thresd, int, S_IRUGO|S_IWUSR); static int rk30_lcdc_clk_enable(struct rk30_lcdc_device *lcdc_dev) { + if(!lcdc_dev->clk_on) + { + clk_enable(lcdc_dev->pd); + clk_enable(lcdc_dev->hclk); + clk_enable(lcdc_dev->dclk); + clk_enable(lcdc_dev->aclk); - clk_enable(lcdc_dev->pd); - clk_enable(lcdc_dev->hclk); - clk_enable(lcdc_dev->dclk); - clk_enable(lcdc_dev->aclk); - - spin_lock(&lcdc_dev->reg_lock); - lcdc_dev->clk_on = 1; - spin_unlock(&lcdc_dev->reg_lock); + spin_lock(&lcdc_dev->reg_lock); + lcdc_dev->clk_on = 1; + spin_unlock(&lcdc_dev->reg_lock); + } printk("rk30 lcdc%d clk enable...\n",lcdc_dev->id); + return 0; } static int rk30_lcdc_clk_disable(struct rk30_lcdc_device *lcdc_dev) { - spin_lock(&lcdc_dev->reg_lock); - lcdc_dev->clk_on = 0; - spin_unlock(&lcdc_dev->reg_lock); - mdelay(30); - clk_disable(lcdc_dev->dclk); - clk_disable(lcdc_dev->hclk); - clk_disable(lcdc_dev->aclk); - clk_disable(lcdc_dev->pd); + if(lcdc_dev->clk_on) + { + spin_lock(&lcdc_dev->reg_lock); + lcdc_dev->clk_on = 0; + spin_unlock(&lcdc_dev->reg_lock); + mdelay(30); + clk_disable(lcdc_dev->dclk); + clk_disable(lcdc_dev->hclk); + clk_disable(lcdc_dev->aclk); + clk_disable(lcdc_dev->pd); + } printk("rk30 lcdc%d clk disable...\n",lcdc_dev->id); return 0; } @@ -424,8 +430,6 @@ static int rk30_lcdc_blank(struct rk_lcdc_device_driver*lcdc_drv,int layer_id,in { struct rk30_lcdc_device * lcdc_dev = container_of(lcdc_drv,struct rk30_lcdc_device ,driver); - printk(KERN_INFO "%s>>>>>%d\n",__func__, blank_mode); - spin_lock(&lcdc_dev->reg_lock); if(likely(lcdc_dev->clk_on)) { @@ -445,6 +449,8 @@ static int rk30_lcdc_blank(struct rk_lcdc_device_driver*lcdc_drv,int layer_id,in } spin_unlock(&lcdc_dev->reg_lock); + dev_info(lcdc_drv->dev,"blank mode:%d\n",blank_mode); + return 0; } @@ -1402,36 +1408,34 @@ int rk30_lcdc_early_resume(struct rk_lcdc_device_driver *dev_drv) if(dev_drv->screen_ctr_info->io_enable) //power on dev_drv->screen_ctr_info->io_enable(); - if(!lcdc_dev->clk_on) + if(lcdc_dev->atv_layer_cnt) { rk30_lcdc_clk_enable(lcdc_dev); - } - memcpy((u8*)lcdc_dev->regs, (u8*)lcdc_dev->regsbak, 0xc4); //resume reg + + memcpy((u8*)lcdc_dev->regs, (u8*)lcdc_dev->regsbak, 0xc4); //resume reg - spin_lock(&lcdc_dev->reg_lock); - if(dev_drv->cur_screen->dsp_lut) //resume dsp lut - { - lcdc_msk_reg(lcdc_dev,SYS_CTRL1,m_DSP_LUT_RAM_EN,v_DSP_LUT_RAM_EN(0)); - lcdc_cfg_done(lcdc_dev); - mdelay(25); - for(i=0;i<256;i++) + spin_lock(&lcdc_dev->reg_lock); + if(dev_drv->cur_screen->dsp_lut) //resume dsp lut { - v = dev_drv->cur_screen->dsp_lut[i]; - c = lcdc_dev->dsp_lut_addr_base+i; - writel_relaxed(v,c); - + lcdc_msk_reg(lcdc_dev,SYS_CTRL1,m_DSP_LUT_RAM_EN,v_DSP_LUT_RAM_EN(0)); + lcdc_cfg_done(lcdc_dev); + mdelay(25); + for(i=0;i<256;i++) + { + v = dev_drv->cur_screen->dsp_lut[i]; + c = lcdc_dev->dsp_lut_addr_base+i; + writel_relaxed(v,c); + + } + lcdc_msk_reg(lcdc_dev,SYS_CTRL1,m_DSP_LUT_RAM_EN,v_DSP_LUT_RAM_EN(1)); } - lcdc_msk_reg(lcdc_dev,SYS_CTRL1,m_DSP_LUT_RAM_EN,v_DSP_LUT_RAM_EN(1)); - } - if(lcdc_dev->atv_layer_cnt) - { + lcdc_msk_reg(lcdc_dev, SYS_CTRL0,m_LCDC_STANDBY,v_LCDC_STANDBY(0)); lcdc_cfg_done(lcdc_dev); - } - spin_unlock(&lcdc_dev->reg_lock); + + spin_unlock(&lcdc_dev->reg_lock); - if(!lcdc_dev->atv_layer_cnt) - rk30_lcdc_clk_disable(lcdc_dev); + } if(dev_drv->screen0->standby) dev_drv->screen0->standby(0); //screen wake up diff --git a/drivers/video/rockchip/lcdc/rk3188_lcdc.c b/drivers/video/rockchip/lcdc/rk3188_lcdc.c index b907416f1e7e..29bd5156ccf8 100755 --- a/drivers/video/rockchip/lcdc/rk3188_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3188_lcdc.c @@ -47,14 +47,18 @@ static int rk3188_load_screen(struct rk_lcdc_device_driver *dev_drv, bool initsc static int rk3188_lcdc_clk_enable(struct rk3188_lcdc_device *lcdc_dev) { - clk_enable(lcdc_dev->hclk); - clk_enable(lcdc_dev->dclk); - clk_enable(lcdc_dev->aclk); - clk_enable(lcdc_dev->pd); + if(!lcdc_dev->clk_on) + { + clk_enable(lcdc_dev->hclk); + clk_enable(lcdc_dev->dclk); + clk_enable(lcdc_dev->aclk); + clk_enable(lcdc_dev->pd); + spin_lock(&lcdc_dev->reg_lock); + lcdc_dev->clk_on = 1; + spin_unlock(&lcdc_dev->reg_lock); + } - spin_lock(&lcdc_dev->reg_lock); - lcdc_dev->clk_on = 1; - spin_unlock(&lcdc_dev->reg_lock); + printk("rk3188 lcdc%d clk enable...\n",lcdc_dev->id); return 0; @@ -62,14 +66,18 @@ static int rk3188_lcdc_clk_enable(struct rk3188_lcdc_device *lcdc_dev) static int rk3188_lcdc_clk_disable(struct rk3188_lcdc_device *lcdc_dev) { - spin_lock(&lcdc_dev->reg_lock); - lcdc_dev->clk_on = 0; - spin_unlock(&lcdc_dev->reg_lock); - mdelay(25); - clk_disable(lcdc_dev->dclk); - clk_disable(lcdc_dev->hclk); - clk_disable(lcdc_dev->aclk); - clk_disable(lcdc_dev->pd); + if(lcdc_dev->clk_on) + { + spin_lock(&lcdc_dev->reg_lock); + lcdc_dev->clk_on = 0; + spin_unlock(&lcdc_dev->reg_lock); + mdelay(25); + clk_disable(lcdc_dev->dclk); + clk_disable(lcdc_dev->hclk); + clk_disable(lcdc_dev->aclk); + clk_disable(lcdc_dev->pd); + } + printk("rk3188 lcdc%d clk disable...\n",lcdc_dev->id); return 0; @@ -100,6 +108,7 @@ static void rk3188_lcdc_reg_dump(struct rk3188_lcdc_device *lcdc_dev) } } + static void rk3188_lcdc_read_reg_defalut_cfg(struct rk3188_lcdc_device *lcdc_dev) { int reg=0; @@ -280,6 +289,7 @@ static int rk3188_lcdc_reg_update(struct rk_lcdc_device_driver *dev_drv) return 0; } + static int rk3188_lcdc_reg_resume(struct rk3188_lcdc_device *lcdc_dev) { memcpy((u8*)lcdc_dev->regs, (u8*)lcdc_dev->regsbak, 0x84); @@ -435,7 +445,7 @@ static int rk3188_lcdc_init(struct rk_lcdc_device_driver *dev_drv) return -EINVAL; } if (IS_ERR(lcdc_dev->pd) || (IS_ERR(lcdc_dev->aclk)) ||(IS_ERR(lcdc_dev->dclk)) || (IS_ERR(lcdc_dev->hclk))) - { + { printk(KERN_ERR "failed to get lcdc%d clk source\n",lcdc_dev->id); } if(!support_uboot_display()) @@ -990,10 +1000,12 @@ static int rk3188_lcdc_blank(struct rk_lcdc_device_driver *dev_drv, break; } lcdc_cfg_done(lcdc_dev); - dev_info(dev_drv->dev,"blank mode:%d\n",blank_mode); + } spin_unlock(&lcdc_dev->reg_lock); + dev_info(dev_drv->dev,"blank mode:%d\n",blank_mode); + return 0; } @@ -1068,37 +1080,37 @@ static int rk3188_lcdc_early_resume(struct rk_lcdc_device_driver *dev_drv) if(dev_drv->screen_ctr_info->io_enable) //power on dev_drv->screen_ctr_info->io_enable(); - if(!lcdc_dev->clk_on) + + if(lcdc_dev->atv_layer_cnt) //only resume the lcdc that need to use { rk3188_lcdc_clk_enable(lcdc_dev); - } - rk3188_lcdc_reg_resume(lcdc_dev); //resume reg + + rk3188_lcdc_reg_resume(lcdc_dev); //resume reg - spin_lock(&lcdc_dev->reg_lock); - if(dev_drv->cur_screen->dsp_lut) //resume dsp lut - { - lcdc_msk_reg(lcdc_dev,SYS_CTRL,m_DSP_LUT_EN,v_DSP_LUT_EN(0)); - lcdc_cfg_done(lcdc_dev); - mdelay(25); - for(i=0;i<256;i++) + spin_lock(&lcdc_dev->reg_lock); + if(dev_drv->cur_screen->dsp_lut) //resume dsp lut { - v = dev_drv->cur_screen->dsp_lut[i]; - c = lcdc_dev->dsp_lut_addr_base+i; - writel_relaxed(v,c); + lcdc_msk_reg(lcdc_dev,SYS_CTRL,m_DSP_LUT_EN,v_DSP_LUT_EN(0)); + lcdc_cfg_done(lcdc_dev); + mdelay(25); + for(i=0;i<256;i++) + { + v = dev_drv->cur_screen->dsp_lut[i]; + c = lcdc_dev->dsp_lut_addr_base+i; + writel_relaxed(v,c); + } + lcdc_msk_reg(lcdc_dev,SYS_CTRL,m_DSP_LUT_EN,v_DSP_LUT_EN(1)); } - lcdc_msk_reg(lcdc_dev,SYS_CTRL,m_DSP_LUT_EN,v_DSP_LUT_EN(1)); - } - - if(lcdc_dev->atv_layer_cnt) - { + + lcdc_msk_reg(lcdc_dev,DSP_CTRL1,m_DSP_OUT_ZERO ,v_DSP_OUT_ZERO(0)); lcdc_msk_reg(lcdc_dev, SYS_CTRL,m_LCDC_STANDBY,v_LCDC_STANDBY(0)); lcdc_cfg_done(lcdc_dev); + + spin_unlock(&lcdc_dev->reg_lock); } - spin_unlock(&lcdc_dev->reg_lock); - if(!lcdc_dev->atv_layer_cnt) - rk3188_lcdc_clk_disable(lcdc_dev); + if(dev_drv->screen0->standby) dev_drv->screen0->standby(0); //screen wake up -- 2.34.1