drm: rcar-du: Add procedure of memory width update 27/31927/1
authorKoji Matsuoka <koji.matsuoka.xm@renesas.com>
Mon, 24 Mar 2014 05:40:01 +0000 (14:40 +0900)
committerDamian Hobson-Garcia <dhobsong@igel.co.jp>
Fri, 12 Dec 2014 09:13:44 +0000 (18:13 +0900)
When the frame buffer is changed, there is a problem which memory width
is not updated. This problem is resolved by this patch.

Change-Id: Ifd581c28b285328a5b6977e5964136a3d22db374
Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp>
drivers/gpu/drm/rcar-du/rcar_du_crtc.c
drivers/gpu/drm/rcar-du/rcar_du_plane.c

index 79d6ddb..4b4b4a7 100644 (file)
@@ -337,6 +337,8 @@ static void rcar_du_crtc_update_base(struct rcar_du_crtc *rcrtc)
 {
        struct drm_crtc *crtc = &rcrtc->crtc;
 
+       rcrtc->plane->pitch = crtc->fb->pitches[0];
+
        rcar_du_plane_compute_base(rcrtc->plane, crtc->fb);
        rcar_du_plane_update_base(rcrtc->plane);
 }
index 0f422f9..4156bb4 100644 (file)
@@ -225,6 +225,7 @@ static void __rcar_du_plane_setup(struct rcar_du_plane *plane,
        struct rcar_du_group *rgrp = plane->group;
        u32 ddcr2 = PnDDCR2_CODE;
        u32 ddcr4;
+       u32 mwr;
 
        /* Data format
         *
@@ -255,6 +256,17 @@ static void __rcar_du_plane_setup(struct rcar_du_plane *plane,
        rcar_du_plane_write(rgrp, index, PnDDCR2, ddcr2);
        rcar_du_plane_write(rgrp, index, PnDDCR4, ddcr4);
 
+       /* Memory pitch (expressed in pixels) */
+       if (plane->format->planes == 2)
+               mwr = plane->pitch;
+       else
+               mwr = plane->pitch * 8 / plane->format->bpp;
+
+       if ((plane->interlace_flag) && (plane->format->bpp == 32))
+               rcar_du_plane_write(rgrp, index, PnMWR, mwr * 2);
+       else
+               rcar_du_plane_write(rgrp, index, PnMWR, mwr);
+
        /* Destination position and size */
        rcar_du_plane_write(rgrp, index, PnDSXR, plane->width);
        rcar_du_plane_write(rgrp, index, PnDSYR, plane->height);