[media] v4l: vsp1: Reset VSP1 RPF source address
authorTakanari Hayama <taki@igel.co.jp>
Thu, 27 Nov 2014 01:25:01 +0000 (22:25 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 23 Dec 2014 11:31:58 +0000 (09:31 -0200)
Source address of VSP1 RPF needs to be reset whenever crop offsets are
recalculated.

This correctly reflects a crop setting even VIDIOC_QBUF is called
before VIDIOC_STREAMON is called.

Signed-off-by: Takanari Hayama <taki@igel.co.jp>
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/vsp1/vsp1_rpf.c
drivers/media/platform/vsp1/vsp1_rwpf.h

index d14d26b718efe14ae2a2c69a1650d048d4eee22d..3294529a3108fb33cc7319912bdbf18529c0d203 100644 (file)
@@ -106,11 +106,22 @@ static int rpf_s_stream(struct v4l2_subdev *subdev, int enable)
                        + crop->left * fmtinfo->bpp[0] / 8;
        pstride = format->plane_fmt[0].bytesperline
                << VI6_RPF_SRCM_PSTRIDE_Y_SHIFT;
+
+       vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_Y,
+                      rpf->buf_addr[0] + rpf->offsets[0]);
+
        if (format->num_planes > 1) {
                rpf->offsets[1] = crop->top * format->plane_fmt[1].bytesperline
                                + crop->left * fmtinfo->bpp[1] / 8;
                pstride |= format->plane_fmt[1].bytesperline
                        << VI6_RPF_SRCM_PSTRIDE_C_SHIFT;
+
+               vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_C0,
+                              rpf->buf_addr[1] + rpf->offsets[1]);
+
+               if (format->num_planes > 2)
+                       vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_C1,
+                                      rpf->buf_addr[2] + rpf->offsets[1]);
        }
 
        vsp1_rpf_write(rpf, VI6_RPF_SRCM_PSTRIDE, pstride);
@@ -179,6 +190,13 @@ static void rpf_vdev_queue(struct vsp1_video *video,
                           struct vsp1_video_buffer *buf)
 {
        struct vsp1_rwpf *rpf = container_of(video, struct vsp1_rwpf, video);
+       unsigned int i;
+
+       for (i = 0; i < 3; ++i)
+               rpf->buf_addr[i] = buf->addr[i];
+
+       if (!vsp1_entity_is_streaming(&rpf->entity))
+               return;
 
        vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_Y,
                       buf->addr[0] + rpf->offsets[0]);
index 28dd9e7b3838a04298f9abb234063b6bb380c2bd..2cf1f13d3bf9c3fefaa42fad8803c54b949cf71a 100644 (file)
@@ -39,6 +39,7 @@ struct vsp1_rwpf {
        struct v4l2_rect crop;
 
        unsigned int offsets[2];
+       dma_addr_t buf_addr[3];
 };
 
 static inline struct vsp1_rwpf *to_rwpf(struct v4l2_subdev *subdev)