From: Ville Syrjälä <ville.syrj...@linux.intel.com>

Since the hardware can apparently do both X and Y reflection, we
can advertize also 180 degree rotation as thats just X+Y reflection.

v2: Drop the BIT()

Cc: Rob Clark <robdclark at gmail.com>
Cc: Jilai Wang <jilaiw at codeaurora.org>
Cc: Archit Taneja <architt at codeaurora.org>
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
index 2653ad893ebc..cf50d3ec8d1b 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
@@ -78,6 +78,7 @@ static void mdp5_plane_install_rotation_property(struct 
drm_device *dev,
        drm_plane_create_rotation_property(plane,
                                           DRM_ROTATE_0,
                                           DRM_ROTATE_0 |
+                                          DRM_ROTATE_180 |
                                           DRM_REFLECT_X |
                                           DRM_REFLECT_Y);
 }
@@ -285,6 +286,8 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
                        plane_enabled(old_state), plane_enabled(state));

        if (plane_enabled(state)) {
+               unsigned int rotation;
+
                format = to_mdp_format(msm_framebuffer_format(state->fb));
                if (MDP_FORMAT_IS_YUV(format) &&
                        !pipe_supports_yuv(mdp5_plane->caps)) {
@@ -305,8 +308,13 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
                        return -EINVAL;
                }

-               hflip = !!(state->rotation & DRM_REFLECT_X);
-               vflip = !!(state->rotation & DRM_REFLECT_Y);
+               rotation = drm_rotation_simplify(state->rotation,
+                                                DRM_ROTATE_0 |
+                                                DRM_REFLECT_X |
+                                                DRM_REFLECT_Y);
+               hflip = !!(rotation & DRM_REFLECT_X);
+               vflip = !!(rotation & DRM_REFLECT_Y);
+
                if ((vflip && !(mdp5_plane->caps & MDP_PIPE_CAP_VFLIP)) ||
                        (hflip && !(mdp5_plane->caps & MDP_PIPE_CAP_HFLIP))) {
                        dev_err(plane->dev->dev,
@@ -677,6 +685,7 @@ static int mdp5_plane_mode_set(struct drm_plane *plane,
        int pe_top[COMP_MAX], pe_bottom[COMP_MAX];
        uint32_t hdecm = 0, vdecm = 0;
        uint32_t pix_format;
+       unsigned int rotation;
        bool vflip, hflip;
        unsigned long flags;
        int ret;
@@ -739,8 +748,12 @@ static int mdp5_plane_mode_set(struct drm_plane *plane,
        config |= get_scale_config(format, src_h, crtc_h, false);
        DBG("scale config = %x", config);

-       hflip = !!(pstate->rotation & DRM_REFLECT_X);
-       vflip = !!(pstate->rotation & DRM_REFLECT_Y);
+       rotation = drm_rotation_simplify(pstate->rotation,
+                                        DRM_ROTATE_0 |
+                                        DRM_REFLECT_X |
+                                        DRM_REFLECT_Y);
+       hflip = !!(rotation & DRM_REFLECT_X);
+       vflip = !!(rotation & DRM_REFLECT_Y);

        spin_lock_irqsave(&mdp5_plane->pipe_lock, flags);

-- 
2.7.4

Reply via email to