diff options
author | Michael Grzeschik <m.grzeschik@pengutronix.de> | 2022-11-22 23:52:58 +0100 |
---|---|---|
committer | Michael Grzeschik <m.grzeschik@pengutronix.de> | 2023-02-22 15:43:46 +0100 |
commit | c7c59a33acf44bad7c0d8a37f2e6ceffefc90eb8 (patch) | |
tree | a2a75d417f949b1c60ee1ed2557bd9681802d33d | |
parent | 25d8a07641b15c3ed33fdfa3aa69e1624ffdafc1 (diff) | |
download | linux-c7c59a33acf44bad7c0d8a37f2e6ceffefc90eb8.tar.gz |
rkvdec: move dec specific code to separate functions
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
-rw-r--r-- | drivers/staging/media/rkvdec/rkvdec-h264.c | 27 | ||||
-rw-r--r-- | drivers/staging/media/rkvdec/rkvpu.c | 109 | ||||
-rw-r--r-- | drivers/staging/media/rkvdec/rkvpu.h | 4 |
3 files changed, 86 insertions, 54 deletions
diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index 86d4b92757da7..837a2b7b6d2bf 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -1175,6 +1175,31 @@ static int rkvdec_h264_run(struct rkvpu_ctx *ctx) return 0; } +static int rkvdec_h264_irq(struct rkvpu_ctx *ctx) +{ + struct rkvpu_dev *rkvpu = ctx->dev; + enum vb2_buffer_state state; + u32 status; + + status = readl(rkvpu->regs + RKVDEC_REG_INTERRUPT); + state = (status & RKVDEC_RDY_STA) ? + VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; + + writel(0, rkvpu->regs + RKVDEC_REG_INTERRUPT); + + return state; +} + +static int rkvdec_h264_watchdog(struct rkvpu_ctx *ctx) +{ + struct rkvpu_dev *rkvpu = ctx->dev; + + writel(RKVDEC_IRQ_DIS, rkvpu->regs + RKVDEC_REG_INTERRUPT); + writel(0, rkvpu->regs + RKVDEC_REG_SYSCTRL); + + return 0; +} + static int rkvdec_h264_try_ctrl(struct rkvpu_ctx *ctx, struct v4l2_ctrl *ctrl) { if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) @@ -1188,5 +1213,7 @@ const struct rkvpu_ops rkvdec_h264_fmt_ops = { .start = rkvdec_h264_start, .stop = rkvdec_h264_stop, .run = rkvdec_h264_run, + .irq = rkvdec_h264_irq, + .watchdog = rkvdec_h264_watchdog, .try_ctrl = rkvdec_h264_try_ctrl, }; diff --git a/drivers/staging/media/rkvdec/rkvpu.c b/drivers/staging/media/rkvdec/rkvpu.c index c8441d3413372..a525289e4245f 100644 --- a/drivers/staging/media/rkvdec/rkvpu.c +++ b/drivers/staging/media/rkvdec/rkvpu.c @@ -25,12 +25,11 @@ #include <media/videobuf2-vmalloc.h> #include "rkvpu.h" -#include "rkvpu-regs.h" static int rkvpu_try_ctrl(struct v4l2_ctrl *ctrl) { struct rkvpu_ctx *ctx = container_of(ctrl->handler, struct rkvpu_ctx, ctrl_hdl); - const struct rkvpu_fmt_desc *desc = ctx->src_fmt_desc; + const struct rkvpu_fmt_desc *desc = ctx->fmt_desc; if (desc->ops->try_ctrl) return desc->ops->try_ctrl(ctx, ctrl); @@ -112,7 +111,7 @@ static const struct rkvpu_ctrls rkvdec_vp9_ctrls = { .num_ctrls = ARRAY_SIZE(rkvdec_vp9_ctrl_descs), }; -static const struct rkvpu_fmt_desc rkvpu_src_fmts[] = { +static const struct rkvpu_fmt_desc rkvpu_fmts[] = { { .fourcc = V4L2_PIX_FMT_H264_SLICE, .frmsize = { @@ -147,13 +146,13 @@ static const struct rkvpu_fmt_desc rkvpu_src_fmts[] = { }; static const struct rkvpu_fmt_desc * -rkvpu_find_src_fmt_desc(u32 fourcc) +rkvpu_find_fmt_desc(u32 fourcc) { unsigned int i; - for (i = 0; i < ARRAY_SIZE(rkvpu_src_fmts); i++) { - if (rkvpu_src_fmts[i].fourcc == fourcc) - return &rkvpu_src_fmts[i]; + for (i = 0; i < ARRAY_SIZE(rkvpu_fmts); i++) { + if (rkvpu_fmts[i].fourcc == fourcc) + return &rkvpu_fmts[i]; } return NULL; @@ -175,25 +174,25 @@ static void rkvpu_reset_src_fmt(struct rkvpu_ctx *ctx) { struct v4l2_format *f = &ctx->src_fmt; - ctx->src_fmt_desc = &rkvpu_src_fmts[0]; - rkvpu_reset_fmt(ctx, f, ctx->src_fmt_desc->fourcc); + ctx->fmt_desc = &rkvpu_fmts[0]; + rkvpu_reset_fmt(ctx, f, ctx->fmt_desc->fourcc); f->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; - f->fmt.pix_mp.width = ctx->src_fmt_desc->frmsize.min_width; - f->fmt.pix_mp.height = ctx->src_fmt_desc->frmsize.min_height; + f->fmt.pix_mp.width = ctx->fmt_desc->frmsize.min_width; + f->fmt.pix_mp.height = ctx->fmt_desc->frmsize.min_height; - if (ctx->src_fmt_desc->ops->adjust_fmt) - ctx->src_fmt_desc->ops->adjust_fmt(ctx, f); + if (ctx->fmt_desc->ops->adjust_fmt) + ctx->fmt_desc->ops->adjust_fmt(ctx, f); } static void rkvpu_reset_dst_fmt(struct rkvpu_ctx *ctx) { struct v4l2_format *f = &ctx->dst_fmt; - rkvpu_reset_fmt(ctx, f, ctx->src_fmt_desc->dst_fmts[0]); + rkvpu_reset_fmt(ctx, f, ctx->fmt_desc->dst_fmts[0]); f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; v4l2_fill_pixfmt_mp(&f->fmt.pix_mp, - ctx->src_fmt_desc->dst_fmts[0], + ctx->fmt_desc->dst_fmts[0], ctx->src_fmt.fmt.pix_mp.width, ctx->src_fmt.fmt.pix_mp.height); f->fmt.pix_mp.plane_fmt[0].sizeimage += 128 * @@ -209,7 +208,7 @@ static int rkvpu_enum_framesizes(struct file *file, void *priv, if (fsize->index != 0) return -EINVAL; - fmt = rkvpu_find_src_fmt_desc(fsize->pixel_format); + fmt = rkvpu_find_fmt_desc(fsize->pixel_format); if (!fmt) return -EINVAL; @@ -245,7 +244,7 @@ static int rkvpu_try_capture_fmt(struct file *file, void *priv, * on the src end has not been set yet, it should point to the * default value. */ - src_desc = ctx->src_fmt_desc; + src_desc = ctx->fmt_desc; if (WARN_ON(!src_desc)) return -EINVAL; @@ -282,10 +281,10 @@ static int rkvpu_try_output_fmt(struct file *file, void *priv, struct rkvpu_ctx *ctx = fh_to_rkvpu_ctx(priv); const struct rkvpu_fmt_desc *desc; - desc = rkvpu_find_src_fmt_desc(pix_mp->pixelformat); + desc = rkvpu_find_fmt_desc(pix_mp->pixelformat); if (!desc) { - pix_mp->pixelformat = rkvpu_src_fmts[0].fourcc; - desc = &rkvpu_src_fmts[0]; + pix_mp->pixelformat = rkvpu_fmts[0].fourcc; + desc = &rkvpu_fmts[0]; } v4l2_apply_frmsize_constraints(&pix_mp->width, @@ -362,10 +361,10 @@ static int rkvpu_s_output_fmt(struct file *file, void *priv, if (ret) return ret; - desc = rkvpu_find_src_fmt_desc(f->fmt.pix_mp.pixelformat); + desc = rkvpu_find_fmt_desc(f->fmt.pix_mp.pixelformat); if (!desc) return -EINVAL; - ctx->src_fmt_desc = desc; + ctx->fmt_desc = desc; ctx->src_fmt = *f; /* @@ -413,10 +412,10 @@ static int rkvpu_g_capture_fmt(struct file *file, void *priv, static int rkvpu_enum_output_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *f) { - if (f->index >= ARRAY_SIZE(rkvpu_src_fmts)) + if (f->index >= ARRAY_SIZE(rkvpu_fmts)) return -EINVAL; - f->pixelformat = rkvpu_src_fmts[f->index].fourcc; + f->pixelformat = rkvpu_fmts[f->index].fourcc; return 0; } @@ -425,13 +424,13 @@ static int rkvpu_enum_capture_fmt(struct file *file, void *priv, { struct rkvpu_ctx *ctx = fh_to_rkvpu_ctx(priv); - if (WARN_ON(!ctx->src_fmt_desc)) + if (WARN_ON(!ctx->fmt_desc)) return -EINVAL; - if (f->index >= ctx->src_fmt_desc->num_dst_fmts) + if (f->index >= ctx->fmt_desc->num_dst_fmts) return -EINVAL; - f->pixelformat = ctx->src_fmt_desc->dst_fmts[f->index]; + f->pixelformat = ctx->fmt_desc->dst_fmts[f->index]; return 0; } @@ -555,7 +554,7 @@ static int rkvpu_start_streaming(struct vb2_queue *q, unsigned int count) if (V4L2_TYPE_IS_CAPTURE(q->type)) return 0; - desc = ctx->src_fmt_desc; + desc = ctx->fmt_desc; if (WARN_ON(!desc)) return -EINVAL; @@ -594,7 +593,7 @@ static void rkvpu_stop_streaming(struct vb2_queue *q) struct rkvpu_ctx *ctx = vb2_get_drv_priv(q); if (V4L2_TYPE_IS_OUTPUT(q->type)) { - const struct rkvpu_fmt_desc *desc = ctx->src_fmt_desc; + const struct rkvpu_fmt_desc *desc = ctx->fmt_desc; if (WARN_ON(!desc)) return; @@ -639,12 +638,12 @@ static const struct media_device_ops rkvpu_media_ops = { static void rkvpu_job_finish_no_pm(struct rkvpu_ctx *ctx, enum vb2_buffer_state result) { - if (ctx->src_fmt_desc->ops->done) { + if (ctx->fmt_desc->ops->done) { struct vb2_v4l2_buffer *src_buf, *dst_buf; src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); - ctx->src_fmt_desc->ops->done(ctx, src_buf, dst_buf, result); + ctx->fmt_desc->ops->done(ctx, src_buf, dst_buf, result); } v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx, @@ -690,7 +689,7 @@ static void rkvpu_device_run(void *priv) { struct rkvpu_ctx *ctx = priv; struct rkvpu_dev *rkvpu = ctx->dev; - const struct rkvpu_fmt_desc *desc = ctx->src_fmt_desc; + const struct rkvpu_fmt_desc *desc = ctx->fmt_desc; int ret; if (WARN_ON(!desc)) @@ -780,13 +779,13 @@ static int rkvpu_init_ctrls(struct rkvpu_ctx *ctx) unsigned int i, nctrls = 0; int ret; - for (i = 0; i < ARRAY_SIZE(rkvpu_src_fmts); i++) - nctrls += rkvpu_src_fmts[i].ctrls->num_ctrls; + for (i = 0; i < ARRAY_SIZE(rkvpu_fmts); i++) + nctrls += rkvpu_fmts[i].ctrls->num_ctrls; v4l2_ctrl_handler_init(&ctx->ctrl_hdl, nctrls); - for (i = 0; i < ARRAY_SIZE(rkvpu_src_fmts); i++) { - ret = rkvpu_add_ctrls(ctx, rkvpu_src_fmts[i].ctrls); + for (i = 0; i < ARRAY_SIZE(rkvpu_fmts); i++) { + ret = rkvpu_add_ctrls(ctx, rkvpu_fmts[i].ctrls); if (ret) goto err_free_handler; } @@ -950,14 +949,16 @@ static void rkvpu_v4l2_cleanup(struct rkvpu_dev *rkvpu) static irqreturn_t rkvpu_irq_handler(int irq, void *priv) { struct rkvpu_dev *rkvpu = priv; - enum vb2_buffer_state state; - u32 status; + struct rkvpu_ctx *ctx = v4l2_m2m_get_curr_priv(rkvpu->m2m_dev); + const struct rkvpu_desc *desc = ctx->fmt_desc; + enum vb2_buffer_state state = VB2_BUF_STATE_ERROR; - status = readl(rkvpu->regs + RKVDEC_REG_INTERRUPT); - state = (status & RKVDEC_RDY_STA) ? - VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; + if (WARN_ON(!desc)) + return IRQ_HANDLED; + + if (desc->ops->irq) + state = desc->ops->irq(ctx); - writel(0, rkvpu->regs + RKVDEC_REG_INTERRUPT); if (cancel_delayed_work(&rkvpu->watchdog_work)) { struct rkvpu_ctx *ctx; @@ -970,18 +971,20 @@ static irqreturn_t rkvpu_irq_handler(int irq, void *priv) static void rkvpu_watchdog_func(struct work_struct *work) { - struct rkvpu_dev *rkvpu; - struct rkvpu_ctx *ctx; + struct rkvpu_dev *rkvpu = container_of(to_delayed_work(work), + struct rkvpu_dev, watchdog_work); + struct rkvpu_ctx *ctx = v4l2_m2m_get_curr_priv(rkvpu->m2m_dev); + const struct rkvpu_desc *desc = ctx->fmt_desc; - rkvpu = container_of(to_delayed_work(work), struct rkvpu_dev, - watchdog_work); - ctx = v4l2_m2m_get_curr_priv(rkvpu->m2m_dev); - if (ctx) { - dev_err(rkvpu->dev, "Frame processing timed out!\n"); - writel(RKVDEC_IRQ_DIS, rkvpu->regs + RKVDEC_REG_INTERRUPT); - writel(0, rkvpu->regs + RKVDEC_REG_SYSCTRL); - rkvpu_job_finish(ctx, VB2_BUF_STATE_ERROR); - } + dev_err(rkvpu->dev, "Frame processing timed out!\n"); + + if (WARN_ON(!desc)) + return; + + if (desc->ops->watchdog) + desc->ops->watchdog(ctx); + + rkvpu_job_finish(ctx, VB2_BUF_STATE_ERROR); } static const struct of_device_id of_rkvpu_match[] = { diff --git a/drivers/staging/media/rkvdec/rkvpu.h b/drivers/staging/media/rkvdec/rkvpu.h index ad63d5c465901..e53551d26cdc9 100644 --- a/drivers/staging/media/rkvdec/rkvpu.h +++ b/drivers/staging/media/rkvdec/rkvpu.h @@ -72,6 +72,8 @@ struct rkvpu_ops { void (*done)(struct rkvpu_ctx *ctx, struct vb2_v4l2_buffer *src_buf, struct vb2_v4l2_buffer *dst_buf, enum vb2_buffer_state result); + int (*irq)(struct rkvpu_ctx *ctx); + int (*watchdog)(struct rkvpu_ctx *ctx); int (*try_ctrl)(struct rkvpu_ctx *ctx, struct v4l2_ctrl *ctrl); }; @@ -101,7 +103,7 @@ struct rkvpu_ctx { struct v4l2_fh fh; struct v4l2_format src_fmt; struct v4l2_format dst_fmt; - const struct rkvpu_fmt_desc *src_fmt_desc; + const struct rkvpu_fmt_desc *fmt_desc; struct v4l2_ctrl_handler ctrl_hdl; struct rkvpu_dev *dev; void *priv; |