drm/exynos: gsc: Handles the combination of rotation and flip
authorHyungwon Hwang <human.hwang@samsung.com>
Mon, 29 Jun 2015 13:37:27 +0000 (22:37 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 31 Mar 2016 07:59:12 +0000 (16:59 +0900)
The unique results of all the combination of rotation and flip can
be represented by just 8 states. This patch handles all the combination
correctly.

Change-Id: I27d8c96f012b30d4d628a0eba9ca6f15b903a981
Signed-off-by: Hyungwon Hwang <human.hwang@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_gsc.c

index ed6357022ad13218b10637dde22d54d1133b8e4a..3e46706d1c7631733795def90b2d1c6f4e59c3cc 100644 (file)
@@ -682,9 +682,17 @@ static int gsc_src_set_transf(struct device *dev,
                break;
        case EXYNOS_DRM_DEGREE_180:
                cfg |= GSC_IN_ROT_180;
+               if (flip & EXYNOS_DRM_FLIP_VERTICAL)
+                       cfg &= ~GSC_IN_ROT_XFLIP;
+               if (flip & EXYNOS_DRM_FLIP_HORIZONTAL)
+                       cfg &= ~GSC_IN_ROT_YFLIP;
                break;
        case EXYNOS_DRM_DEGREE_270:
                cfg |= GSC_IN_ROT_270;
+               if (flip & EXYNOS_DRM_FLIP_VERTICAL)
+                       cfg &= ~GSC_IN_ROT_XFLIP;
+               if (flip & EXYNOS_DRM_FLIP_HORIZONTAL)
+                       cfg &= ~GSC_IN_ROT_YFLIP;
                break;
        default:
                dev_err(ippdrv->dev, "inavlid degree value %d.\n", degree);
@@ -955,9 +963,17 @@ static int gsc_dst_set_transf(struct device *dev,
                break;
        case EXYNOS_DRM_DEGREE_180:
                cfg |= GSC_IN_ROT_180;
+               if (flip & EXYNOS_DRM_FLIP_VERTICAL)
+                       cfg &= ~GSC_IN_ROT_XFLIP;
+               if (flip & EXYNOS_DRM_FLIP_HORIZONTAL)
+                       cfg &= ~GSC_IN_ROT_YFLIP;
                break;
        case EXYNOS_DRM_DEGREE_270:
                cfg |= GSC_IN_ROT_270;
+               if (flip & EXYNOS_DRM_FLIP_VERTICAL)
+                       cfg &= ~GSC_IN_ROT_XFLIP;
+               if (flip & EXYNOS_DRM_FLIP_HORIZONTAL)
+                       cfg &= ~GSC_IN_ROT_YFLIP;
                break;
        default:
                dev_err(ippdrv->dev, "inavlid degree value %d.\n", degree);