diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2017-05-15 12:57:46 +0300 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2017-06-02 11:04:07 +0300 |
commit | 8958aeb9c7bc86c89667af049243c47836111ab7 (patch) | |
tree | bbf72ddaa42c2a22457be9a23c38dccf7743cee0 | |
parent | 41aff42ae6e3e9dbb800640fe3bb62383d4aa6e3 (diff) |
drm/omap: add drm_rotation_to_tiler helper()
Add a helper function to convert DRM rotation to TILER rotation.
Also drop a error print that can never happen, as the DRM framework
makes sure the rotation is valid.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index c5b2088ee168..2f461d427924 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c @@ -122,6 +122,36 @@ bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb) return omap_gem_flags(plane->bo) & OMAP_BO_TILED; } +/* Note: DRM rotates counter-clockwise, TILER & DSS rotates clockwise */ +static uint32_t drm_rotation_to_tiler(unsigned int drm_rot) +{ + uint32_t orient; + + switch (drm_rot & DRM_MODE_ROTATE_MASK) { + default: + case DRM_MODE_ROTATE_0: + orient = 0; + break; + case DRM_MODE_ROTATE_90: + orient = MASK_XY_FLIP | MASK_X_INVERT; + break; + case DRM_MODE_ROTATE_180: + orient = MASK_X_INVERT | MASK_Y_INVERT; + break; + case DRM_MODE_ROTATE_270: + orient = MASK_XY_FLIP | MASK_Y_INVERT; + break; + } + + if (drm_rot & DRM_MODE_REFLECT_X) + orient ^= MASK_X_INVERT; + + if (drm_rot & DRM_MODE_REFLECT_Y) + orient ^= MASK_Y_INVERT; + + return orient; +} + /* update ovl info for scanout, handles cases of multi-planar fb's, etc. */ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, @@ -148,31 +178,7 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb, uint32_t w = win->src_w; uint32_t h = win->src_h; - switch (win->rotation & DRM_MODE_ROTATE_MASK) { - default: - dev_err(fb->dev->dev, "invalid rotation: %02x", - (uint32_t)win->rotation); - /* fallthru to default to no rotation */ - case 0: - case DRM_MODE_ROTATE_0: - orient = 0; - break; - case DRM_MODE_ROTATE_90: - orient = MASK_XY_FLIP | MASK_X_INVERT; - break; - case DRM_MODE_ROTATE_180: - orient = MASK_X_INVERT | MASK_Y_INVERT; - break; - case DRM_MODE_ROTATE_270: - orient = MASK_XY_FLIP | MASK_Y_INVERT; - break; - } - - if (win->rotation & DRM_MODE_REFLECT_X) - orient ^= MASK_X_INVERT; - - if (win->rotation & DRM_MODE_REFLECT_Y) - orient ^= MASK_Y_INVERT; + orient = drm_rotation_to_tiler(win->rotation); /* adjust x,y offset for flip/invert: */ if (orient & MASK_XY_FLIP) |