Commit b58faa95 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] v4l: vsp1: Make rwpf operations independent of video device

The rwpf queue operation doesn't queue a buffer but sets the memory
address for the next run. Rename it to set_memory and pass it a new
structure independent of the video buffer than only contains memory
information.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 9d40637a
...@@ -186,28 +186,28 @@ static struct v4l2_subdev_ops rpf_ops = { ...@@ -186,28 +186,28 @@ static struct v4l2_subdev_ops rpf_ops = {
* Video Device Operations * Video Device Operations
*/ */
static void rpf_buf_queue(struct vsp1_rwpf *rpf, struct vsp1_vb2_buffer *buf) static void rpf_set_memory(struct vsp1_rwpf *rpf, struct vsp1_rwpf_memory *mem)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < 3; ++i) for (i = 0; i < 3; ++i)
rpf->buf_addr[i] = buf->addr[i]; rpf->buf_addr[i] = mem->addr[i];
if (!vsp1_entity_is_streaming(&rpf->entity)) if (!vsp1_entity_is_streaming(&rpf->entity))
return; return;
vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_Y, vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_Y,
buf->addr[0] + rpf->offsets[0]); mem->addr[0] + rpf->offsets[0]);
if (buf->buf.vb2_buf.num_planes > 1) if (mem->num_planes > 1)
vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_C0, vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_C0,
buf->addr[1] + rpf->offsets[1]); mem->addr[1] + rpf->offsets[1]);
if (buf->buf.vb2_buf.num_planes > 2) if (mem->num_planes > 2)
vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_C1, vsp1_rpf_write(rpf, VI6_RPF_SRCM_ADDR_C1,
buf->addr[2] + rpf->offsets[1]); mem->addr[2] + rpf->offsets[1]);
} }
static const struct vsp1_rwpf_operations rpf_vdev_ops = { static const struct vsp1_rwpf_operations rpf_vdev_ops = {
.queue = rpf_buf_queue, .set_memory = rpf_set_memory,
}; };
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
......
...@@ -24,10 +24,16 @@ ...@@ -24,10 +24,16 @@
#define RWPF_PAD_SOURCE 1 #define RWPF_PAD_SOURCE 1
struct vsp1_rwpf; struct vsp1_rwpf;
struct vsp1_vb2_buffer;
struct vsp1_rwpf_memory {
unsigned int num_planes;
dma_addr_t addr[3];
unsigned int length[3];
};
struct vsp1_rwpf_operations { struct vsp1_rwpf_operations {
void (*queue)(struct vsp1_rwpf *rwpf, struct vsp1_vb2_buffer *buf); void (*set_memory)(struct vsp1_rwpf *rwpf,
struct vsp1_rwpf_memory *mem);
}; };
struct vsp1_rwpf { struct vsp1_rwpf {
......
...@@ -628,7 +628,8 @@ vsp1_video_complete_buffer(struct vsp1_video *video) ...@@ -628,7 +628,8 @@ vsp1_video_complete_buffer(struct vsp1_video *video)
done->buf.sequence = video->sequence++; done->buf.sequence = video->sequence++;
done->buf.vb2_buf.timestamp = ktime_get_ns(); done->buf.vb2_buf.timestamp = ktime_get_ns();
for (i = 0; i < done->buf.vb2_buf.num_planes; ++i) for (i = 0; i < done->buf.vb2_buf.num_planes; ++i)
vb2_set_plane_payload(&done->buf.vb2_buf, i, done->length[i]); vb2_set_plane_payload(&done->buf.vb2_buf, i,
done->mem.length[i]);
vb2_buffer_done(&done->buf.vb2_buf, VB2_BUF_STATE_DONE); vb2_buffer_done(&done->buf.vb2_buf, VB2_BUF_STATE_DONE);
return next; return next;
...@@ -646,7 +647,7 @@ static void vsp1_video_frame_end(struct vsp1_pipeline *pipe, ...@@ -646,7 +647,7 @@ static void vsp1_video_frame_end(struct vsp1_pipeline *pipe,
spin_lock_irqsave(&pipe->irqlock, flags); spin_lock_irqsave(&pipe->irqlock, flags);
video->rwpf->ops->queue(video->rwpf, buf); video->rwpf->ops->set_memory(video->rwpf, &buf->mem);
pipe->buffers_ready |= 1 << video->pipe_index; pipe->buffers_ready |= 1 << video->pipe_index;
spin_unlock_irqrestore(&pipe->irqlock, flags); spin_unlock_irqrestore(&pipe->irqlock, flags);
...@@ -843,11 +844,13 @@ static int vsp1_video_buffer_prepare(struct vb2_buffer *vb) ...@@ -843,11 +844,13 @@ static int vsp1_video_buffer_prepare(struct vb2_buffer *vb)
if (vb->num_planes < format->num_planes) if (vb->num_planes < format->num_planes)
return -EINVAL; return -EINVAL;
buf->mem.num_planes = vb->num_planes;
for (i = 0; i < vb->num_planes; ++i) { for (i = 0; i < vb->num_planes; ++i) {
buf->addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); buf->mem.addr[i] = vb2_dma_contig_plane_dma_addr(vb, i);
buf->length[i] = vb2_plane_size(vb, i); buf->mem.length[i] = vb2_plane_size(vb, i);
if (buf->length[i] < format->plane_fmt[i].sizeimage) if (buf->mem.length[i] < format->plane_fmt[i].sizeimage)
return -EINVAL; return -EINVAL;
} }
...@@ -873,7 +876,7 @@ static void vsp1_video_buffer_queue(struct vb2_buffer *vb) ...@@ -873,7 +876,7 @@ static void vsp1_video_buffer_queue(struct vb2_buffer *vb)
spin_lock_irqsave(&pipe->irqlock, flags); spin_lock_irqsave(&pipe->irqlock, flags);
video->rwpf->ops->queue(video->rwpf, buf); video->rwpf->ops->set_memory(video->rwpf, &buf->mem);
pipe->buffers_ready |= 1 << video->pipe_index; pipe->buffers_ready |= 1 << video->pipe_index;
if (vb2_is_streaming(&video->queue) && if (vb2_is_streaming(&video->queue) &&
......
...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
#include <media/media-entity.h> #include <media/media-entity.h>
#include <media/videobuf2-v4l2.h> #include <media/videobuf2-v4l2.h>
struct vsp1_rwpf; #include "vsp1_rwpf.h"
struct vsp1_video; struct vsp1_video;
/* /*
...@@ -97,9 +98,7 @@ static inline struct vsp1_pipeline *to_vsp1_pipeline(struct media_entity *e) ...@@ -97,9 +98,7 @@ static inline struct vsp1_pipeline *to_vsp1_pipeline(struct media_entity *e)
struct vsp1_vb2_buffer { struct vsp1_vb2_buffer {
struct vb2_v4l2_buffer buf; struct vb2_v4l2_buffer buf;
struct list_head queue; struct list_head queue;
struct vsp1_rwpf_memory mem;
dma_addr_t addr[3];
unsigned int length[3];
}; };
static inline struct vsp1_vb2_buffer * static inline struct vsp1_vb2_buffer *
......
...@@ -195,17 +195,17 @@ static struct v4l2_subdev_ops wpf_ops = { ...@@ -195,17 +195,17 @@ static struct v4l2_subdev_ops wpf_ops = {
* Video Device Operations * Video Device Operations
*/ */
static void wpf_buf_queue(struct vsp1_rwpf *wpf, struct vsp1_vb2_buffer *buf) static void wpf_set_memory(struct vsp1_rwpf *wpf, struct vsp1_rwpf_memory *mem)
{ {
vsp1_wpf_write(wpf, VI6_WPF_DSTM_ADDR_Y, buf->addr[0]); vsp1_wpf_write(wpf, VI6_WPF_DSTM_ADDR_Y, mem->addr[0]);
if (buf->buf.vb2_buf.num_planes > 1) if (mem->num_planes > 1)
vsp1_wpf_write(wpf, VI6_WPF_DSTM_ADDR_C0, buf->addr[1]); vsp1_wpf_write(wpf, VI6_WPF_DSTM_ADDR_C0, mem->addr[1]);
if (buf->buf.vb2_buf.num_planes > 2) if (mem->num_planes > 2)
vsp1_wpf_write(wpf, VI6_WPF_DSTM_ADDR_C1, buf->addr[2]); vsp1_wpf_write(wpf, VI6_WPF_DSTM_ADDR_C1, mem->addr[2]);
} }
static const struct vsp1_rwpf_operations wpf_vdev_ops = { static const struct vsp1_rwpf_operations wpf_vdev_ops = {
.queue = wpf_buf_queue, .set_memory = wpf_set_memory,
}; };
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment