drm/exynos: gsc: Handles the combination of rotation and flip
authorHyungwon Hwang <human.hwang@samsung.com>
Wed, 1 Jul 2015 10:09:25 +0000 (19:09 +0900)
committerInki Dae <inki.dae@samsung.com>
Sun, 16 Aug 2015 01:23:32 +0000 (10:23 +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.

Signed-off-by: Hyungwon Hwang <human.hwang@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_gsc.c

index f1c6b76c127f4db02388267775431fcd25ac7eb8..808a0a013780e1ad2bde35623f6f48468d29a7c7 100644 (file)
@@ -582,9 +582,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);
@@ -845,9 +853,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);