{
        int scale_x = out_width != orig_width;
        int scale_y = out_height != orig_height;
+       bool chroma_upscale = true;
 
        if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE))
                return;
 
        switch (color_mode) {
        case OMAP_DSS_COLOR_NV12:
-               /* UV is subsampled by 2 vertically*/
-               orig_height >>= 1;
-               /* UV is subsampled by 2 horz.*/
-               orig_width >>= 1;
+               if (chroma_upscale) {
+                       /* UV is subsampled by 2 horizontally and vertically */
+                       orig_height >>= 1;
+                       orig_width >>= 1;
+               } else {
+                       /* UV is downsampled by 2 horizontally and vertically */
+                       orig_height <<= 1;
+                       orig_width <<= 1;
+               }
+
                break;
        case OMAP_DSS_COLOR_YUV2:
        case OMAP_DSS_COLOR_UYVY:
-               /*For YUV422 with 90/270 rotation,
-                *we don't upsample chroma
-                */
+               /* For YUV422 with 90/270 rotation, we don't upsample chroma */
                if (rotation == OMAP_DSS_ROT_0 ||
-                       rotation == OMAP_DSS_ROT_180)
-                       /* UV is subsampled by 2 hrz*/
-                       orig_width >>= 1;
+                               rotation == OMAP_DSS_ROT_180) {
+                       if (chroma_upscale)
+                               /* UV is subsampled by 2 horizontally */
+                               orig_width >>= 1;
+                       else
+                               /* UV is downsampled by 2 horizontally */
+                               orig_width <<= 1;
+               }
+
                /* must use FIR for YUV422 if rotated */
                if (rotation != OMAP_DSS_ROT_0)
                        scale_x = scale_y = true;
+
                break;
        default:
                BUG();