From: yxj Date: Tue, 10 Apr 2012 09:04:05 +0000 (+0800) Subject: rk30 fb: implement open ,close ,blank more properly X-Git-Tag: firefly_0821_release~9420 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b09103b072616aa4e869eef4d1a979c5bbed3f83;p=firefly-linux-kernel-4.4.55.git rk30 fb: implement open ,close ,blank more properly --- diff --git a/drivers/video/rockchip/chips/rk30_lcdc.c b/drivers/video/rockchip/chips/rk30_lcdc.c index 241377b28c3c..6c77d9d91e8d 100644 --- a/drivers/video/rockchip/chips/rk30_lcdc.c +++ b/drivers/video/rockchip/chips/rk30_lcdc.c @@ -28,10 +28,8 @@ #include #include #include -#include #include #include -#include #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, diff --git a/drivers/video/rockchip/chips/rk30_lcdc.h b/drivers/video/rockchip/chips/rk30_lcdc.h index 6a181d574811..3b9cf1a6ac07 100644 --- a/drivers/video/rockchip/chips/rk30_lcdc.h +++ b/drivers/video/rockchip/chips/rk30_lcdc.h @@ -1,6 +1,8 @@ #ifndef RK30_LCDC_H_ #define RK30_LCDC_H_ +#include + #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; diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index e7f4c26f5686..40b6ba5a0bae 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -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; diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index 73d7b62c1c36..feca19fc7a15 100644 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -16,7 +16,9 @@ #ifndef __ARCH_ARM_MACH_RK30_FB_H #define __ARCH_ARM_MACH_RK30_FB_H +#include #include +#include #include #include #include @@ -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);