{
int size, bpp;
struct mxsfb_layer *ofb = (struct mxsfb_layer*)info->par;
+ struct mxsfb_info *fbi = ofb->fbi;
struct fb_var_screeninfo *var = &ofb->ol_fb->var;
bpp = var->bits_per_pixel;
if (ofb->video_mem_size < size)
return -EINVAL;
+ if (!lock_fb_info(fbi->fb_info))
+ return -EINVAL;
+
+ if (fbi->cur_blank != FB_BLANK_UNBLANK) {
+ clk_enable_pix(fbi);
+ clk_enable_axi(fbi);
+ clk_enable_disp_axi(fbi);
+ }
+
if (ofb->blank_state == FB_BLANK_UNBLANK)
ofb->ops->disable(ofb);
if (ofb->blank_state == FB_BLANK_UNBLANK)
ofb->ops->enable(ofb);
+ if (fbi->cur_blank != FB_BLANK_UNBLANK) {
+ clk_disable_disp_axi(fbi);
+ clk_disable_axi(fbi);
+ clk_disable_pix(fbi);
+ }
+
+ unlock_fb_info(fbi->fb_info);
+
if ((var->activate & FB_ACTIVATE_FORCE) &&
(var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)
var->activate = FB_ACTIVATE_NOW;
static int overlayfb_blank(int blank, struct fb_info *info)
{
struct mxsfb_layer *ofb = (struct mxsfb_layer*)info->par;
+ struct mxsfb_info *fbi = ofb->fbi;
if (ofb->blank_state == blank)
return 0;
+ if (!lock_fb_info(fbi->fb_info))
+ return -EINVAL;
+
+ if (fbi->cur_blank != FB_BLANK_UNBLANK) {
+ clk_enable_pix(fbi);
+ clk_enable_axi(fbi);
+ clk_enable_disp_axi(fbi);
+ }
+
switch (blank) {
case FB_BLANK_POWERDOWN:
case FB_BLANK_VSYNC_SUSPEND:
break;
}
+ if (fbi->cur_blank != FB_BLANK_UNBLANK) {
+ clk_disable_disp_axi(fbi);
+ clk_disable_axi(fbi);
+ clk_disable_pix(fbi);
+ }
+
+ unlock_fb_info(fbi->fb_info);
+
ofb->blank_state = blank;
return 0;
init_completion(&fbi->flip_complete);
+ if (!lock_fb_info(fbi->fb_info))
+ return -EINVAL;
+
+ if (fbi->cur_blank != FB_BLANK_UNBLANK) {
+ unlock_fb_info(fbi->fb_info);
+ return -EINVAL;
+ }
+
+ unlock_fb_info(fbi->fb_info);
+
bytes_offset = info->fix.line_length * var->yoffset;
writel(info->fix.smem_start + bytes_offset,
fbi->base + LCDC_AS_NEXT_BUF);