mirror of https://gitee.com/openkylin/linux.git
media: rockchip/vpu: Support the Request API
Introduce support for the Request API. Although the JPEG encoder does not mandate using the Request API, it's perfectly possible to use it, if the application wants to. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
b1c6cc64dd
commit
7d47b45dc5
|
@ -113,11 +113,15 @@ void rk3399_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx)
|
|||
struct rockchip_vpu_dev *vpu = ctx->dev;
|
||||
struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
||||
struct rockchip_vpu_jpeg_ctx jpeg_ctx;
|
||||
struct media_request *src_req;
|
||||
u32 reg;
|
||||
|
||||
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
||||
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
||||
|
||||
src_req = src_buf->vb2_buf.req_obj.req;
|
||||
v4l2_ctrl_request_setup(src_req, &ctx->ctrl_handler);
|
||||
|
||||
memset(&jpeg_ctx, 0, sizeof(jpeg_ctx));
|
||||
jpeg_ctx.buffer = vb2_plane_vaddr(&dst_buf->vb2_buf, 0);
|
||||
jpeg_ctx.width = ctx->dst_fmt.width;
|
||||
|
@ -153,6 +157,8 @@ void rk3399_vpu_jpeg_enc_run(struct rockchip_vpu_ctx *ctx)
|
|||
| VEPU_REG_ENCODE_FORMAT_JPEG
|
||||
| VEPU_REG_ENCODE_ENABLE;
|
||||
|
||||
v4l2_ctrl_request_complete(src_req, &ctx->ctrl_handler);
|
||||
|
||||
/* Kick the watchdog and start encoding */
|
||||
schedule_delayed_work(&vpu->watchdog_work, msecs_to_jiffies(2000));
|
||||
vepu_write(vpu, reg, VEPU_REG_ENCODE_START);
|
||||
|
|
|
@ -162,6 +162,7 @@ enc_queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)
|
|||
src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
||||
src_vq->lock = &ctx->dev->vpu_mutex;
|
||||
src_vq->dev = ctx->dev->v4l2_dev.dev;
|
||||
src_vq->supports_requests = true;
|
||||
|
||||
ret = vb2_queue_init(src_vq);
|
||||
if (ret)
|
||||
|
@ -525,6 +526,11 @@ static void rockchip_vpu_remove_enc_func(struct rockchip_vpu_dev *vpu)
|
|||
video_unregister_device(&func->vdev);
|
||||
}
|
||||
|
||||
static const struct media_device_ops rockchip_m2m_media_ops = {
|
||||
.req_validate = vb2_request_validate,
|
||||
.req_queue = v4l2_m2m_request_queue,
|
||||
};
|
||||
|
||||
static int rockchip_vpu_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
|
@ -617,6 +623,7 @@ static int rockchip_vpu_probe(struct platform_device *pdev)
|
|||
strscpy(vpu->mdev.bus_info, "platform: " DRIVER_NAME,
|
||||
sizeof(vpu->mdev.model));
|
||||
media_device_init(&vpu->mdev);
|
||||
vpu->mdev.ops = &rockchip_m2m_media_ops;
|
||||
vpu->v4l2_dev.mdev = &vpu->mdev;
|
||||
|
||||
ret = rockchip_vpu_add_enc_func(vpu);
|
||||
|
|
|
@ -540,14 +540,33 @@ static void rockchip_vpu_stop_streaming(struct vb2_queue *q)
|
|||
vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
|
||||
if (!vbuf)
|
||||
break;
|
||||
v4l2_ctrl_request_complete(vbuf->vb2_buf.req_obj.req,
|
||||
&ctx->ctrl_handler);
|
||||
v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
static void rockchip_vpu_buf_request_complete(struct vb2_buffer *vb)
|
||||
{
|
||||
struct rockchip_vpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||
|
||||
v4l2_ctrl_request_complete(vb->req_obj.req, &ctx->ctrl_handler);
|
||||
}
|
||||
|
||||
static int rockchip_vpu_buf_out_validate(struct vb2_buffer *vb)
|
||||
{
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
|
||||
vbuf->field = V4L2_FIELD_NONE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct vb2_ops rockchip_vpu_enc_queue_ops = {
|
||||
.queue_setup = rockchip_vpu_queue_setup,
|
||||
.buf_prepare = rockchip_vpu_buf_prepare,
|
||||
.buf_queue = rockchip_vpu_buf_queue,
|
||||
.buf_out_validate = rockchip_vpu_buf_out_validate,
|
||||
.buf_request_complete = rockchip_vpu_buf_request_complete,
|
||||
.start_streaming = rockchip_vpu_start_streaming,
|
||||
.stop_streaming = rockchip_vpu_stop_streaming,
|
||||
.wait_prepare = vb2_ops_wait_prepare,
|
||||
|
|
Loading…
Reference in New Issue