rk30 fb: implement open ,close ,blank more properly
authoryxj <yxj@rock-chips.com>
Tue, 10 Apr 2012 09:04:05 +0000 (17:04 +0800)
committeryxj <yxj@rock-chips.com>
Fri, 13 Apr 2012 02:33:54 +0000 (10:33 +0800)
drivers/video/rockchip/chips/rk30_lcdc.c
drivers/video/rockchip/chips/rk30_lcdc.h
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index 241377b28c3c94d5936e9afa25b1e91fe6160a8e..6c77d9d91e8dab17de866c2da1ff9a0d8e13ba5a 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/earlysuspend.h>
-#include <linux/fb.h>
 #include <asm/div64.h>
 #include <asm/uaccess.h>
-#include <linux/rk_fb.h>
 #include "rk30_lcdc.h"
 
 
@@ -192,6 +190,7 @@ static int rk30_load_screen(struct rk_lcdc_device_driver *dev_drv, bool initscre
               v_VERPRD(screen->vsync_len + screen->upper_margin + y_res + lower_margin));
        LcdWrReg(lcdc_dev, DSP_VACT_ST_END,  v_VAEP(screen->vsync_len + screen->upper_margin+y_res)|
               v_VASP(screen->vsync_len + screen->upper_margin));
+       LcdMskReg(lcdc_dev,SYS_CTRL1, m_W1_EN, v_W1_EN(1));  //default,enable win1 for ui display
        // let above to take effect
        LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
                                                         
@@ -236,57 +235,43 @@ static int mcu_refresh(struct rk30_lcdc_device *lcdc_dev)
     return 0;
 }
 
-static int win0_blank(int blank_mode,struct rk30_lcdc_device *lcdc_dev)
+
+
+//enable layer,open:1,enable;0 disable
+static int win0_open(struct rk30_lcdc_device *lcdc_dev,bool open)
 {
-       switch(blank_mode)
-       {
-               case FB_BLANK_UNBLANK:
-                       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W0_EN, v_W0_EN(1));
-                       break;
-               case FB_BLANK_NORMAL:
-                       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W0_EN, v_W0_EN(0));
-                       break;
-               default:
-                       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W0_EN, v_W1_EN(1));
-                       break;
-       }
-       mcu_refresh(lcdc_dev);
-    return 0;
+       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W0_EN, v_W0_EN(open));
+       LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
+       printk(KERN_INFO "lcdc%d win0 %s\n",lcdc_dev->id,open?"open":"closed");
+       return 0;
+}
+static int win1_open(struct rk30_lcdc_device *lcdc_dev,bool open)
+{
+       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W1_EN, v_W1_EN(open));
+       LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
+       printk(KERN_INFO "lcdc%d win1 %s\n",lcdc_dev->id,open?"open":"closed");
+       return 0;
 }
 
-static int win1_blank(int blank_mode, struct rk30_lcdc_device *lcdc_dev)
+
+static int rk30_lcdc_blank(struct rk_lcdc_device_driver*lcdc_drv,int layer_id,int blank_mode)
 {
-       printk(KERN_INFO "%s>>>>>>>>>>mode:%d\n",__func__,blank_mode);
+       struct rk30_lcdc_device * lcdc_dev = container_of(lcdc_drv,struct rk30_lcdc_device ,driver);
+
+       printk(KERN_INFO "%s>>>>>%d\n",__func__, blank_mode);
        switch(blank_mode)
        {
                case FB_BLANK_UNBLANK:
-                       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W1_EN, v_W1_EN(1));
-                       break;
+                       LcdMskReg(lcdc_dev,DSP_CTRL1,m_BLANK_MODE ,v_BLANK_MODE(0));
+                       break;
                case FB_BLANK_NORMAL:
-                       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W1_EN, v_W1_EN(0));
-                       break;
+                       LcdMskReg(lcdc_dev,DSP_CTRL1,m_BLANK_MODE ,v_BLANK_MODE(1));
+                       break;
                default:
-                       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W1_EN, v_W1_EN(0));
-                       break;
-       }
-    
-       //mcu_refresh(inf);
-    return 0;
-}
-static int rk30_lcdc_blank(struct rk_lcdc_device_driver*lcdc_drv,int layer_id,int blank_mode)
-{
-       struct rk30_lcdc_device * lcdc_dev = container_of(lcdc_drv,struct rk30_lcdc_device ,driver);
-       if(layer_id==0)
-       {
-               win0_blank(blank_mode,lcdc_dev);
-       }
-       else if(layer_id==1)
-       {
-               win1_blank(blank_mode,lcdc_dev);
+                       LcdMskReg(lcdc_dev,DSP_CTRL1,m_BLANK_MODE ,v_BLANK_MODE(1));
+                       break;
        }
-
        LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
-       
        return 0;
 }
 
@@ -298,7 +283,8 @@ static  int win0_display(struct rk30_lcdc_device *lcdc_dev,struct layer_par *par
        uv_addr = par->cbr_start + par->c_offset;
        DBG(KERN_INFO "%s:y_addr:0x%x>>uv_addr:0x%x\n",__func__,y_addr,uv_addr);
        LcdWrReg(lcdc_dev, WIN0_YRGB_MST0, y_addr);
-       LcdWrReg(lcdc_dev,WIN0_CBR_MST0,uv_addr);
+       LcdWrReg(lcdc_dev, WIN0_CBR_MST0, uv_addr);
+       LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);  
        return 0;
        
 }
@@ -311,85 +297,86 @@ static  int win1_display(struct rk30_lcdc_device *lcdc_dev,struct layer_par *par
        uv_addr = par->cbr_start + par->c_offset;
        DBG(KERN_INFO "%s>>y_addr:0x%x>>uv_addr:0x%x\n",__func__,y_addr,uv_addr);
        LcdWrReg(lcdc_dev, WIN1_YRGB_MST, y_addr);
-       LcdWrReg(lcdc_dev,WIN1_CBR_MST,uv_addr);
-       
+       LcdWrReg(lcdc_dev, WIN1_CBR_MST, uv_addr);
+       LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01); 
        return 0;
 }
 
 static  int win0_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
        struct layer_par *par )
 {
-    u32 xact, yact, xvir, yvir, xpos, ypos;
-    u32 ScaleYrgbX = 0x1000;
-    u32 ScaleYrgbY = 0x1000;
-    u32 ScaleCbrX = 0x1000;
-    u32 ScaleCbrY = 0x1000;
-    
-    xact = par->xact;                      //active (origin) picture window width/height               
-    yact = par->yact;
-    xvir = par->xvir;                     // virtual resolution                
-    yvir = par->yvir;
-    xpos = par->xpos+screen->left_margin + screen->hsync_len;
-    ypos = par->ypos+screen->upper_margin + screen->vsync_len;
+       u32 xact, yact, xvir, yvir, xpos, ypos;
+       u32 ScaleYrgbX = 0x1000;
+       u32 ScaleYrgbY = 0x1000;
+       u32 ScaleCbrX = 0x1000;
+       u32 ScaleCbrY = 0x1000;
+
+       xact = par->xact;                           //active (origin) picture window width/height               
+       yact = par->yact;
+       xvir = par->xvir;                          // virtual resolution                
+       yvir = par->yvir;
+       xpos = par->xpos+screen->left_margin + screen->hsync_len;
+       ypos = par->ypos+screen->upper_margin + screen->vsync_len;
    
        
-    ScaleYrgbX = CalScale(xact, par->xsize); //both RGB and yuv need this two factor
-    ScaleYrgbY = CalScale(yact, par->ysize);
-    switch (par->format)
-    {
-       case YUV422:// yuv422
-            ScaleCbrX = CalScale((xact/2), par->xsize);
-            ScaleCbrY = CalScale(yact, par->ysize);
-                   break;
-       case YUV420: // yuv420
-           ScaleCbrX = CalScale(xact/2, par->xsize);
-           ScaleCbrY = CalScale(yact/2, par->ysize);
-           break;
-       case YUV444:// yuv444
-           ScaleCbrX = CalScale(xact, par->xsize);
-           ScaleCbrY = CalScale(yact, par->ysize);
-           break;
-       default:
-           break;
-    }
-
-    DBG("%s>>format:%d>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d>>xvir:%d>>yvir:%d>>ypos:%d>>\n",
+       ScaleYrgbX = CalScale(xact, par->xsize); //both RGB and yuv need this two factor
+       ScaleYrgbY = CalScale(yact, par->ysize);
+       switch (par->format)
+       {
+               case YUV422:// yuv422
+                       ScaleCbrX = CalScale((xact/2), par->xsize);
+                       ScaleCbrY = CalScale(yact, par->ysize);
+                       break;
+               case YUV420: // yuv420
+                       ScaleCbrX = CalScale(xact/2, par->xsize);
+                       ScaleCbrY = CalScale(yact/2, par->ysize);
+                       break;
+               case YUV444:// yuv444
+                       ScaleCbrX = CalScale(xact, par->xsize);
+                       ScaleCbrY = CalScale(yact, par->ysize);
+                       break;
+               default:
+                  break;
+       }
+
+       DBG("%s>>format:%d>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d>>xvir:%d>>yvir:%d>>ypos:%d>>\n",
                __func__,par->format,xact,yact,par->xsize,par->ysize,xvir,yvir,ypos);
-    LcdMskReg(lcdc_dev,SYS_CTRL1, m_W0_FORMAT , v_W0_FORMAT(par->format));             //(inf->video_mode==0)
-    LcdWrReg(lcdc_dev, WIN0_ACT_INFO,v_ACT_WIDTH(xact) | v_ACT_HEIGHT(yact));
-    LcdWrReg(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(xpos) | v_DSP_STY(ypos));
-    LcdWrReg(lcdc_dev, WIN0_DSP_INFO, v_DSP_WIDTH(par->xsize)| v_DSP_HEIGHT(par->ysize));
-    LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(ScaleYrgbX) | v_Y_SCL_FACTOR(ScaleYrgbY));
-    LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_CBR,v_X_SCL_FACTOR(ScaleCbrX)| v_Y_SCL_FACTOR(ScaleCbrY));
-    switch(par->format) 
-    {
-        case ARGB888:
-            LcdWrReg(lcdc_dev, WIN0_VIR,v_ARGB888_VIRWIDTH(xvir));
-            LcdMskReg(lcdc_dev,SYS_CTRL1,m_W0_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
-            break;
-        case RGB888:  //rgb888
-            LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB888_VIRWIDTH(xvir));
-            LcdMskReg(lcdc_dev,SYS_CTRL1,m_W0_RGB_RB_SWAP,v_W0_RGB_RB_SWAP(1));
-            break;
-        case RGB565:  //rgb565
-            LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB565_VIRWIDTH(xvir));
-            break;
-        case YUV422:
-        case YUV420:   
-            LcdWrReg(lcdc_dev, WIN0_VIR,v_YUV_VIRWIDTH(xvir));
-            break;
-        default:
-            LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB888_VIRWIDTH(xvir));
-            break;
-    }
-       
+       LcdMskReg(lcdc_dev, SYS_CTRL1, m_W0_FORMAT, v_W0_FORMAT(par->format));          //(inf->video_mode==0)
+       LcdWrReg(lcdc_dev, WIN0_ACT_INFO,v_ACT_WIDTH(xact) | v_ACT_HEIGHT(yact));
+       LcdWrReg(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(xpos) | v_DSP_STY(ypos));
+       LcdWrReg(lcdc_dev, WIN0_DSP_INFO, v_DSP_WIDTH(par->xsize)| v_DSP_HEIGHT(par->ysize));
+       LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(ScaleYrgbX) | v_Y_SCL_FACTOR(ScaleYrgbY));
+       LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_CBR,v_X_SCL_FACTOR(ScaleCbrX)| v_Y_SCL_FACTOR(ScaleCbrY));
+       switch(par->format) 
+       {
+               case ARGB888:
+                       LcdWrReg(lcdc_dev, WIN0_VIR,v_ARGB888_VIRWIDTH(xvir));
+                       LcdMskReg(lcdc_dev,SYS_CTRL1,m_W0_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
+                       break;
+               case RGB888:  //rgb888
+                       LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB888_VIRWIDTH(xvir));
+                       LcdMskReg(lcdc_dev,SYS_CTRL1,m_W0_RGB_RB_SWAP,v_W0_RGB_RB_SWAP(1));
+                       break;
+               case RGB565:  //rgb565
+                       LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB565_VIRWIDTH(xvir));
+                       break;
+               case YUV422:
+               case YUV420:   
+                       LcdWrReg(lcdc_dev, WIN0_VIR,v_YUV_VIRWIDTH(xvir));
+                       break;
+               default:
+                       LcdWrReg(lcdc_dev, WIN0_VIR,v_RGB888_VIRWIDTH(xvir));
+                       break;
+       }
+
+       //LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
+
     return 0;
 
 }
 
 static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
        struct layer_par *par )
-
 {
        u32 xact, yact, xvir, yvir, xpos, ypos;
        u32 ScaleYrgbX = 0x1000;
@@ -411,12 +398,12 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
        switch (par->format)
        {
                case YUV422:// yuv422
-                       ScaleCbrX =     CalScale((xact/2), par->xsize);
+                       ScaleCbrX = CalScale((xact/2), par->xsize);
                        ScaleCbrY = CalScale(yact, par->ysize);
                        break;
                case YUV420: // yuv420
                        ScaleCbrX = CalScale(xact/2, par->xsize);
-                       ScaleCbrY =     CalScale(yact/2, par->ysize);
+                       ScaleCbrY = CalScale(yact/2, par->ysize);
                        break;
                case YUV444:// yuv444
                        ScaleCbrX = CalScale(xact, par->xsize);
@@ -426,39 +413,55 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
                        break;
        }
 
-    LcdWrReg(lcdc_dev, WIN1_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(ScaleYrgbX) | v_Y_SCL_FACTOR(ScaleYrgbY));
-    LcdWrReg(lcdc_dev, WIN1_SCL_FACTOR_CBR,  v_X_SCL_FACTOR(ScaleCbrX) | v_Y_SCL_FACTOR(ScaleCbrY));
-    LcdMskReg(lcdc_dev,SYS_CTRL1, m_W1_EN|m_W1_FORMAT, v_W1_EN(1)|v_W1_FORMAT(par->format));
-    LcdWrReg(lcdc_dev, WIN1_ACT_INFO,v_ACT_WIDTH(xact) | v_ACT_HEIGHT(yact));
-    LcdWrReg(lcdc_dev, WIN1_DSP_ST,v_DSP_STX(xpos) | v_DSP_STY(ypos));
-    LcdWrReg(lcdc_dev, WIN1_DSP_INFO,v_DSP_WIDTH(par->xsize) | v_DSP_HEIGHT(par->ysize));
-     // enable win1 color key and set the color to black(rgb=0)
-    LcdMskReg(lcdc_dev, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR, v_COLORKEY_EN(1) | v_KEYCOLOR(0));
+       LcdWrReg(lcdc_dev, WIN1_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(ScaleYrgbX) | v_Y_SCL_FACTOR(ScaleYrgbY));
+       LcdWrReg(lcdc_dev, WIN1_SCL_FACTOR_CBR,  v_X_SCL_FACTOR(ScaleCbrX) | v_Y_SCL_FACTOR(ScaleCbrY));
+       LcdMskReg(lcdc_dev,SYS_CTRL1, m_W1_FORMAT, v_W1_FORMAT(par->format));
+       LcdWrReg(lcdc_dev, WIN1_ACT_INFO,v_ACT_WIDTH(xact) | v_ACT_HEIGHT(yact));
+       LcdWrReg(lcdc_dev, WIN1_DSP_ST,v_DSP_STX(xpos) | v_DSP_STY(ypos));
+       LcdWrReg(lcdc_dev, WIN1_DSP_INFO,v_DSP_WIDTH(par->xsize) | v_DSP_HEIGHT(par->ysize));
+       // enable win1 color key and set the color to black(rgb=0)
+       LcdMskReg(lcdc_dev, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR,
+               v_COLORKEY_EN(1) | v_KEYCOLOR(0));
        switch(par->format)
-    {
-        case ARGB888:
-            LcdWrReg(lcdc_dev, WIN1_VIR,v_ARGB888_VIRWIDTH(xvir));
-            //LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
-            break;
-        case RGB888:  //rgb888
-            LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB888_VIRWIDTH(xvir));
-           // LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
-            break;
-        case RGB565:  //rgb565
-            LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB565_VIRWIDTH(xvir));
-            break;
-        case YUV422:
-        case YUV420:   
-            LcdWrReg(lcdc_dev, WIN1_VIR,v_YUV_VIRWIDTH(xvir));
-            break;
-        default:
-            LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB888_VIRWIDTH(xvir));
-            break;
-    }
+       {
+               case ARGB888:
+                       LcdWrReg(lcdc_dev, WIN1_VIR,v_ARGB888_VIRWIDTH(xvir));
+                       //LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
+                       break;
+               case RGB888:  //rgb888
+                       LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB888_VIRWIDTH(xvir));
+                       // LcdMskReg(lcdc_dev,SYS_CTRL1,m_W1_RGB_RB_SWAP,v_W1_RGB_RB_SWAP(1));
+                       break;
+               case RGB565:  //rgb565
+                       LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB565_VIRWIDTH(xvir));
+                       break;
+               case YUV422:
+               case YUV420:   
+                       LcdWrReg(lcdc_dev, WIN1_VIR,v_YUV_VIRWIDTH(xvir));
+                       break;
+               default:
+                       LcdWrReg(lcdc_dev, WIN1_VIR,v_RGB888_VIRWIDTH(xvir));
+                       break;
+       }
        
+       //LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01); 
     return 0;
 }
 
+static int rk30_lcdc_open(struct rk_lcdc_device_driver *dev_drv,int layer_id,bool open)
+{
+       struct rk30_lcdc_device *lcdc_dev = container_of(dev_drv,struct rk30_lcdc_device,driver);
+       if(layer_id == 0)
+       {
+               win0_open(lcdc_dev,open);       
+       }
+       else if(layer_id == 1)
+       {
+               win1_open(lcdc_dev,open);
+       }
+
+       return 0;
+}
 static int rk30_lcdc_set_par(struct rk_lcdc_device_driver *dev_drv,int layer_id)
 {
        struct rk30_lcdc_device *lcdc_dev = container_of(dev_drv,struct rk30_lcdc_device,driver);
@@ -510,9 +513,10 @@ int rk30_lcdc_pan_display(struct rk_lcdc_device_driver * dev_drv,int layer_id)
                dev_drv->first_frame = 0;
                LcdMskReg(lcdc_dev,INT_STATUS,m_FRM_START_INT_CLEAR |m_FRM_START_INT_EN ,
                          v_FRM_START_INT_CLEAR(1) | v_FRM_START_INT_EN(1));
+               LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);  // write any value to  REG_CFG_DONE let config become effective
                 
        }
-       LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);  // write any value to  REG_CFG_DONE let config become effective
+       
        spin_lock_irqsave(&dev_drv->cpl_lock,flags);
        init_completion(&dev_drv->frame_done);
        spin_unlock_irqrestore(&dev_drv->cpl_lock,flags);
@@ -594,6 +598,7 @@ static struct rk_lcdc_device_driver lcdc_driver = {
        .name                   = "lcdc",
        .layer_par              = lcdc_layer,
        .num_layer              = ARRAY_SIZE(lcdc_layer),
+       .open                   = rk30_lcdc_open,
        .ioctl                  = rk30_lcdc_ioctl,
        .suspend                = rk30_lcdc_early_suspend,
        .resume                 = rk30_lcdc_early_resume,
index 6a181d5748115589bb398a677c4b6137b84ce111..3b9cf1a6ac079484478be64e59cda226fb502ae5 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef RK30_LCDC_H_
 #define RK30_LCDC_H_
 
+#include<linux/rk_fb.h>
+
 #define LcdReadBit(inf, addr, msk)      ((inf->regbak.addr=inf->preg->addr)&(msk))
 #define LcdWrReg(inf, addr, val)        inf->preg->addr=inf->regbak.addr=(val)
 #define LcdRdReg(inf, addr)             (inf->preg->addr)
@@ -476,9 +478,9 @@ struct rk30_lcdc_device{
        LCDC_REG *preg;         // LCDC reg base address and backup reg 
        LCDC_REG regbak;
 
-       void __iomem *reg_vir_base;  // virtual basic address of lcdc register
-       u32 reg_phy_base;       // physical basic address of lcdc register
-       u32 len;               // physical map length of lcdc register
+       void __iomem *reg_vir_base;     // virtual basic address of lcdc register
+       u32 reg_phy_base;               // physical basic address of lcdc register
+       u32 len;                        // physical map length of lcdc register
 
        unsigned int            irq;
        
index e7f4c26f5686515c012a0c4bc6b6d0ccc4d4273c..40b6ba5a0baede96c2e015ed241f1dc0ce75a0d3 100644 (file)
@@ -107,22 +107,24 @@ struct rk_lcdc_device_driver * rk_get_lcdc_drv(char *name)
 static int rk_fb_open(struct fb_info *info,int user)
 {
     struct rk_lcdc_device_driver * dev_drv = (struct rk_lcdc_device_driver * )info->par;
+    int layer_id;
     CHK_SUSPEND(dev_drv);
+    layer_id = get_fb_layer_id(&info->fix);
+    dev_drv->open(dev_drv,layer_id,1);
     
-
     return 0;
     
 }
 
-static int rk_fb_release(struct fb_info *info,int user)
+static int rk_fb_close(struct fb_info *info,int user)
 {
-    struct rk_fb_inf *inf = dev_get_drvdata(info->device);
-    struct fb_fix_screeninfo *fix = &info->fix;
-    if(!strcmp(fix->id,"fb1")){
-        inf->video_mode = 0;
-    }
-
-    return 0;
+       struct rk_lcdc_device_driver * dev_drv = (struct rk_lcdc_device_driver * )info->par;
+       int layer_id;
+       CHK_SUSPEND(dev_drv);
+       layer_id = get_fb_layer_id(&info->fix);
+       dev_drv->open(dev_drv,layer_id,0);
+       
+       return 0;
 }
 
 static int rk_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
@@ -469,7 +471,7 @@ static int fb_setcolreg(unsigned regno,
 static struct fb_ops fb_ops = {
     .owner          = THIS_MODULE,
     .fb_open        = rk_fb_open,
-    .fb_release     = rk_fb_release,
+    .fb_release     = rk_fb_close,
     .fb_check_var   = rk_fb_check_var,
     .fb_set_par     = rk_fb_set_par,
     .fb_blank       = rk_fb_blank,
@@ -673,7 +675,6 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv)
         /* Start display and show logo on boot */
         fb_set_cmap(&fb_inf->fb[fb_inf->num_fb-2]->cmap, fb_inf->fb[fb_inf->num_fb-2]);
         fb_show_logo(fb_inf->fb[fb_inf->num_fb-2], FB_ROTATE_UR);
-        fb_inf->fb[fb_inf->num_fb-2]->fbops->fb_blank(FB_BLANK_UNBLANK, fb_inf->fb[fb_inf->num_fb-2]);
        fb_inf->fb[fb_inf->num_fb-2]->fbops->fb_pan_display(&(fb_inf->fb[fb_inf->num_fb-2]->var), fb_inf->fb[fb_inf->num_fb-2]);
     }
 #endif
@@ -723,6 +724,7 @@ int init_lcdc_device_driver(struct rk_lcdc_device_driver *def_drv,
        sprintf(dev_drv->name, "lcdc%d",id);
        dev_drv->layer_par = def_drv->layer_par;
        dev_drv->num_layer = def_drv->num_layer;
+       dev_drv->open      = def_drv->open;
        dev_drv->ioctl = def_drv->ioctl;
        dev_drv->blank = def_drv->blank;
        dev_drv->set_par = def_drv->set_par;
index 73d7b62c1c36932b3eba8fe837cbe847b76ad43c..feca19fc7a157f9e6621e01231ba3fe1ea346873 100644 (file)
@@ -16,7 +16,9 @@
 #ifndef __ARCH_ARM_MACH_RK30_FB_H
 #define __ARCH_ARM_MACH_RK30_FB_H
 
+#include <linux/fb.h>
 #include<linux/completion.h>
+#include<linux/spinlock.h>
 #include<asm/atomic.h>
 #include <mach/board.h>
 #include<linux/rk_screen.h>
@@ -160,6 +162,7 @@ typedef enum _TRSP_MODE
 struct layer_par {
     const char *name;
     int id;
+    bool state;        //on or off
     u32        pseudo_pal[16];
     u32 y_offset;       //yuv/rgb offset  -->LCDC_WINx_YRGB_MSTx
     u32 c_offset;     //cb cr offset--->LCDC_WINx_CBR_MSTx
@@ -195,7 +198,8 @@ struct rk_lcdc_device_driver{
        int first_frame ;
 
        atomic_t in_suspend;                    //when enter suspend write or read lcdc register are forbidden
-       
+
+       int (*open)(struct rk_lcdc_device_driver *dev_drv,int layer_id,bool open);
        int (*ioctl)(struct rk_lcdc_device_driver *dev_drv, unsigned int cmd,unsigned long arg,int layer_id);
        int (*suspend)(struct rk_lcdc_device_driver *dev_drv);
        int (*resume)(struct rk_lcdc_device_driver *dev_drv);