@@ -78,6 +78,7 @@ static void mdp5_plane_install_rotation_property(struct drm_device *dev,
drm_plane_create_rotation_property(plane,
BIT(DRM_ROTATE_0),
BIT(DRM_ROTATE_0) |
+ BIT(DRM_ROTATE_180) |
BIT(DRM_REFLECT_X) |
BIT(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,12 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
return -EINVAL;
}
- hflip = !!(state->rotation & BIT(DRM_REFLECT_X));
- vflip = !!(state->rotation & BIT(DRM_REFLECT_Y));
+ rotation = drm_rotation_simplify(state->rotation,
+ BIT(DRM_ROTATE_0) |
+ BIT(DRM_REFLECT_X) |
+ BIT(DRM_REFLECT_Y));
+ hflip = !!(rotation & BIT(DRM_REFLECT_X));
+ vflip = !!(rotation & BIT(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 +684,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 +747,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 & BIT(DRM_REFLECT_X));
- vflip = !!(pstate->rotation & BIT(DRM_REFLECT_Y));
+ rotation = drm_rotation_simplify(pstate->rotation,
+ BIT(DRM_ROTATE_0) |
+ BIT(DRM_REFLECT_X) |
+ BIT(DRM_REFLECT_Y));
+ hflip = !!(rotation & BIT(DRM_REFLECT_X));
+ vflip = !!(rotation & BIT(DRM_REFLECT_Y));
spin_lock_irqsave(&mdp5_plane->pipe_lock, flags);