|
@@ -698,6 +698,26 @@ static void mx3fb_dma_done(void *arg)
|
|
|
complete(&mx3_fbi->flip_cmpl);
|
|
|
}
|
|
|
|
|
|
+static bool mx3fb_must_set_par(struct fb_info *fbi)
|
|
|
+{
|
|
|
+ struct mx3fb_info *mx3_fbi = fbi->par;
|
|
|
+ struct fb_var_screeninfo old_var = mx3_fbi->cur_var;
|
|
|
+ struct fb_var_screeninfo new_var = fbi->var;
|
|
|
+
|
|
|
+ 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.
|
|
|
+ */
|
|
|
+ old_var.xoffset = new_var.xoffset;
|
|
|
+ old_var.yoffset = new_var.yoffset;
|
|
|
+
|
|
|
+ return !!memcmp(&old_var, &new_var, sizeof(struct fb_var_screeninfo));
|
|
|
+}
|
|
|
+
|
|
|
static int __set_par(struct fb_info *fbi, bool lock)
|
|
|
{
|
|
|
u32 mem_len, cur_xoffset, cur_yoffset;
|
|
@@ -819,7 +839,7 @@ static int mx3fb_set_par(struct fb_info *fbi)
|
|
|
|
|
|
mutex_lock(&mx3_fbi->mutex);
|
|
|
|
|
|
- ret = __set_par(fbi, true);
|
|
|
+ ret = mx3fb_must_set_par(fbi) ? __set_par(fbi, true) : 0;
|
|
|
|
|
|
mutex_unlock(&mx3_fbi->mutex);
|
|
|
|