struct v4l2_bt_timings *act = &video->active_timings;
        unsigned int size = act->width * act->height;
 
+       /* Set capture/compression frame sizes */
        aspeed_video_calc_compressed_size(video, size);
 
+       if (video->active_timings.width == 1680) {
+               /*
+                * This is a workaround to fix a silicon bug on A1 and A2
+                * revisions. Since it doesn't break capturing operation of
+                * other revisions, use it for all revisions without checking
+                * the revision ID. It picked 1728 which is a very next
+                * 64-pixels aligned value to 1680 to minimize memory bandwidth
+                * and to get better access speed from video engine.
+                */
+               aspeed_video_write(video, VE_CAP_WINDOW,
+                                  1728 << 16 | act->height);
+               size += (1728 - 1680) * video->active_timings.height;
+       } else {
+               aspeed_video_write(video, VE_CAP_WINDOW,
+                                  act->width << 16 | act->height);
+       }
+       aspeed_video_write(video, VE_COMP_WINDOW,
+                          act->width << 16 | act->height);
+       aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4);
+
        /* Don't use direct mode below 1024 x 768 (irqs don't fire) */
        if (size < DIRECT_FETCH_THRESHOLD) {
                aspeed_video_write(video, VE_TGS_0,
                aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_DIRECT_FETCH);
        }
 
-       /* Set capture/compression frame sizes */
-       aspeed_video_write(video, VE_CAP_WINDOW,
-                          act->width << 16 | act->height);
-       aspeed_video_write(video, VE_COMP_WINDOW,
-                          act->width << 16 | act->height);
-       aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4);
-
        size *= 4;
 
        if (size != video->srcs[0].size) {