drm/exynos: add ratio calculation
authorJoonyoung Shim <jy0922.shim@samsung.com>
Tue, 7 Apr 2015 06:59:39 +0000 (15:59 +0900)
committerInki Dae <inki.dae@samsung.com>
Mon, 13 Apr 2015 02:39:41 +0000 (11:39 +0900)
Calculation ratio from exynos_drm plane codes, then each hw drivers can
use it without extra operation. Also this fixes width and height of
source used for actual crtc shown via screen.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_plane.c
drivers/gpu/drm/exynos/exynos_mixer.c

index 8e925838d047483aaf091be7586650674e87858f..e12ecb5d5d9aa01a7618eafb8930b5dc552cb14e 100644 (file)
@@ -61,6 +61,8 @@ enum exynos_drm_output_type {
  * @crtc_height: window height to be displayed (hardware screen).
  * @mode_width: width of screen mode.
  * @mode_height: height of screen mode.
+ * @h_ratio: horizontal scaling ratio, 16.16 fixed point
+ * @v_ratio: vertical scaling ratio, 16.16 fixed point
  * @refresh: refresh rate.
  * @scan_flag: interlace or progressive way.
  *     (it could be DRM_MODE_FLAG_*)
@@ -97,6 +99,8 @@ struct exynos_drm_plane {
        unsigned int crtc_height;
        unsigned int mode_width;
        unsigned int mode_height;
+       unsigned int h_ratio;
+       unsigned int v_ratio;
        unsigned int refresh;
        unsigned int scan_flag;
        unsigned int bpp;
index 5cb4ced9c4b5e9c95b0b414e30151ab428e01130..13ea3349363b153a8225aece3acc3e70a05dbe51 100644 (file)
@@ -110,11 +110,15 @@ void exynos_plane_mode_set(struct drm_plane *plane, struct drm_crtc *crtc,
                crtc_y = 0;
        }
 
+       /* set ratio */
+       exynos_plane->h_ratio = (src_w << 16) / crtc_w;
+       exynos_plane->v_ratio = (src_h << 16) / crtc_h;
+
        /* set drm framebuffer data. */
        exynos_plane->src_x = src_x;
        exynos_plane->src_y = src_y;
-       exynos_plane->src_width = src_w;
-       exynos_plane->src_height = src_h;
+       exynos_plane->src_width = (actual_w * exynos_plane->h_ratio) >> 16;
+       exynos_plane->src_height = (actual_h * exynos_plane->v_ratio) >> 16;
        exynos_plane->fb_width = fb->width;
        exynos_plane->fb_height = fb->height;
        exynos_plane->bpp = fb->bits_per_pixel;
index ede402bda086d6cfb31e6f11c42246f39f623342..fbec750574e64a3158b232d15ef309b29ed5340c 100644 (file)
@@ -382,7 +382,6 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
        struct mixer_resources *res = &ctx->mixer_res;
        unsigned long flags;
        struct exynos_drm_plane *plane;
-       unsigned int x_ratio, y_ratio;
        unsigned int buf_num = 1;
        dma_addr_t luma_addr[2], chroma_addr[2];
        bool tiled_mode = false;
@@ -407,10 +406,6 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
                return;
        }
 
-       /* scaling feature: (src << 16) / dst */
-       x_ratio = (plane->src_width << 16) / plane->crtc_width;
-       y_ratio = (plane->src_height << 16) / plane->crtc_height;
-
        if (buf_num == 2) {
                luma_addr[0] = plane->dma_addr[0];
                chroma_addr[0] = plane->dma_addr[1];
@@ -470,8 +465,8 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
                vp_reg_write(res, VP_DST_V_POSITION, plane->crtc_y);
        }
 
-       vp_reg_write(res, VP_H_RATIO, x_ratio);
-       vp_reg_write(res, VP_V_RATIO, y_ratio);
+       vp_reg_write(res, VP_H_RATIO, plane->h_ratio);
+       vp_reg_write(res, VP_V_RATIO, plane->v_ratio);
 
        vp_reg_write(res, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE);