rk30、rk3066b、rk3188 lcdc:only resume the lcdc that will be used
authoryxj <yxj@rock-chips.com>
Fri, 13 Sep 2013 09:59:12 +0000 (17:59 +0800)
committeryxj <yxj@rock-chips.com>
Fri, 27 Sep 2013 09:47:08 +0000 (17:47 +0800)
drivers/video/rockchip/lcdc/rk3066b_lcdc.c
drivers/video/rockchip/lcdc/rk30_lcdc.c
drivers/video/rockchip/lcdc/rk3188_lcdc.c

index 25af8678c63e29f5c02e33b2a0409fcbf42cbd85..fab4ffff504c61f69fb382dfabd404c0ffe491fb 100755 (executable)
@@ -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
index 3b23b55ed09169bd1cc442c19b954564392b0943..3823861ddc00ceda1434ac760b126fabb150ec8d 100755 (executable)
@@ -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
index b907416f1e7e3b6b0ea1278cf0662259d0fc1a68..29bd5156ccf81dc76637e488999f91505bc14a9d 100755 (executable)
@@ -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