summaryrefslogtreecommitdiff
path: root/drivers/video/mxc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/mxc')
-rw-r--r--drivers/video/mxc/mxc_ipuv3_fb.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/drivers/video/mxc/mxc_ipuv3_fb.c b/drivers/video/mxc/mxc_ipuv3_fb.c
index 4b2a19df0abb..ad21ef8f0534 100644
--- a/drivers/video/mxc/mxc_ipuv3_fb.c
+++ b/drivers/video/mxc/mxc_ipuv3_fb.c
@@ -93,6 +93,8 @@ struct mxcfb_info {
struct fb_info *ovfbi;
struct mxc_dispdrv_handle *dispdrv;
+
+ struct fb_var_screeninfo cur_var;
};
struct mxcfb_alloc_list {
@@ -301,6 +303,25 @@ static int _setup_disp_channel2(struct fb_info *fbi)
return retval;
}
+static bool mxcfb_need_to_set_par(struct fb_info *fbi)
+{
+ struct mxcfb_info *mxc_fbi = fbi->par;
+
+ if ((fbi->var.activate & FB_ACTIVATE_FORCE) &&
+ (fbi->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)
+ return true;
+
+ /*
+ * Ignore xoffset and yoffset update,
+ * because pan display handles this case.
+ */
+ mxc_fbi->cur_var.xoffset = fbi->var.xoffset;
+ mxc_fbi->cur_var.yoffset = fbi->var.yoffset;
+
+ return !!memcmp(&mxc_fbi->cur_var, &fbi->var,
+ sizeof(struct fb_var_screeninfo));
+}
+
/*
* Set framebuffer parameters and change the operating mode.
*
@@ -313,6 +334,9 @@ static int mxcfb_set_par(struct fb_info *fbi)
ipu_di_signal_cfg_t sig_cfg;
struct mxcfb_info *mxc_fbi = (struct mxcfb_info *)fbi->par;
+ if (!mxcfb_need_to_set_par(fbi))
+ return 0;
+
dev_dbg(fbi->device, "Reconfiguring framebuffer\n");
ipu_clear_irq(mxc_fbi->ipu, mxc_fbi->ipu_ch_irq);
@@ -459,6 +483,8 @@ static int mxcfb_set_par(struct fb_info *fbi)
}
}
+ mxc_fbi->cur_var = fbi->var;
+
return retval;
}
@@ -879,6 +905,8 @@ static int mxcfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
} else
mxc_fbi->alpha_chan_en = false;
+ fbi->var.activate = (fbi->var.activate & ~FB_ACTIVATE_MASK) |
+ FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
mxcfb_set_par(fbi);
la.alpha_phy_addr0 = mxc_fbi->alpha_phy_addr0;
@@ -1212,6 +1240,8 @@ static int mxcfb_blank(int blank, struct fb_info *info)
ipu_uninit_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch);
break;
case FB_BLANK_UNBLANK:
+ info->var.activate = (info->var.activate & ~FB_ACTIVATE_MASK) |
+ FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
ret = mxcfb_set_par(info);
break;
}
@@ -1240,9 +1270,6 @@ mxcfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
int fb_stride;
int i;
- if (info->var.yoffset == var->yoffset)
- return 0; /* No change, do nothing */
-
/* no pan display during fb blank */
if (mxc_fbi->ipu_ch == MEM_FG_SYNC) {
struct mxcfb_info *bg_mxcfbi = NULL;