Skip to content

Commit

Permalink
media: mtk-mdp: Remove states for format checks
Browse files Browse the repository at this point in the history
The mtk-mdp driver uses states to check if the formats have been set
on the capture and output when turning the streaming on, setting
controls or setting the selection rectangles.
Those states are reset when 0 buffers are requested like when checking
capabilities.
This patch removes all format checks and set one by default as queues in
V4L2 are expected to always have a format set.

https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/vidioc-streamon.html
https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/vidioc-g-ctrl.html
https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/vidioc-g-selection.html

Signed-off-by: Francois Buergisser <fbuergisser@chromium.org>
Signed-off-by: Eizan Miyamoto <eizan@chromium.org>
Reviewed-by: Enric Balletbo I Serra <enric.balletbo@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
  • Loading branch information
Francois Buergisser authored and Mauro Carvalho Chehab committed Jul 4, 2020
1 parent 2505a21 commit 0d1e342
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 58 deletions.
2 changes: 0 additions & 2 deletions drivers/media/platform/mtk-mdp/mtk_mdp_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@
#define MTK_MDP_FMT_FLAG_CAPTURE BIT(1)

#define MTK_MDP_VPU_INIT BIT(0)
#define MTK_MDP_SRC_FMT BIT(1)
#define MTK_MDP_DST_FMT BIT(2)
#define MTK_MDP_CTX_ERROR BIT(5)

/**
Expand Down
90 changes: 34 additions & 56 deletions drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,13 +369,6 @@ void mtk_mdp_ctx_state_lock_set(struct mtk_mdp_ctx *ctx, u32 state)
mutex_unlock(&ctx->slock);
}

static void mtk_mdp_ctx_state_lock_clear(struct mtk_mdp_ctx *ctx, u32 state)
{
mutex_lock(&ctx->slock);
ctx->state &= ~state;
mutex_unlock(&ctx->slock);
}

static bool mtk_mdp_ctx_state_is_set(struct mtk_mdp_ctx *ctx, u32 mask)
{
bool ret;
Expand Down Expand Up @@ -726,11 +719,6 @@ static int mtk_mdp_m2m_s_fmt_mplane(struct file *file, void *fh,
ctx->quant = pix_mp->quantization;
}

if (V4L2_TYPE_IS_OUTPUT(f->type))
mtk_mdp_ctx_state_lock_set(ctx, MTK_MDP_SRC_FMT);
else
mtk_mdp_ctx_state_lock_set(ctx, MTK_MDP_DST_FMT);

mtk_mdp_dbg(2, "[%d] type:%d, frame:%dx%d", ctx->id, f->type,
frame->width, frame->height);

Expand All @@ -742,13 +730,6 @@ static int mtk_mdp_m2m_reqbufs(struct file *file, void *fh,
{
struct mtk_mdp_ctx *ctx = fh_to_ctx(fh);

if (reqbufs->count == 0) {
if (reqbufs->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
mtk_mdp_ctx_state_lock_clear(ctx, MTK_MDP_SRC_FMT);
else
mtk_mdp_ctx_state_lock_clear(ctx, MTK_MDP_DST_FMT);
}

return v4l2_m2m_reqbufs(file, ctx->m2m_ctx, reqbufs);
}

Expand All @@ -758,14 +739,6 @@ static int mtk_mdp_m2m_streamon(struct file *file, void *fh,
struct mtk_mdp_ctx *ctx = fh_to_ctx(fh);
int ret;

/* The source and target color format need to be set */
if (V4L2_TYPE_IS_OUTPUT(type)) {
if (!mtk_mdp_ctx_state_is_set(ctx, MTK_MDP_SRC_FMT))
return -EINVAL;
} else if (!mtk_mdp_ctx_state_is_set(ctx, MTK_MDP_DST_FMT)) {
return -EINVAL;
}

if (!mtk_mdp_ctx_state_is_set(ctx, MTK_MDP_VPU_INIT)) {
ret = mtk_mdp_vpu_init(&ctx->vpu);
if (ret < 0) {
Expand Down Expand Up @@ -899,24 +872,21 @@ static int mtk_mdp_m2m_s_selection(struct file *file, void *fh,
frame = &ctx->d_frame;

/* Check to see if scaling ratio is within supported range */
if (mtk_mdp_ctx_state_is_set(ctx, MTK_MDP_DST_FMT | MTK_MDP_SRC_FMT)) {
if (V4L2_TYPE_IS_OUTPUT(s->type)) {
ret = mtk_mdp_check_scaler_ratio(variant, new_r.width,
new_r.height, ctx->d_frame.crop.width,
ctx->d_frame.crop.height,
ctx->ctrls.rotate->val);
} else {
ret = mtk_mdp_check_scaler_ratio(variant,
ctx->s_frame.crop.width,
ctx->s_frame.crop.height, new_r.width,
new_r.height, ctx->ctrls.rotate->val);
}
if (V4L2_TYPE_IS_OUTPUT(s->type))
ret = mtk_mdp_check_scaler_ratio(variant, new_r.width,
new_r.height, ctx->d_frame.crop.width,
ctx->d_frame.crop.height,
ctx->ctrls.rotate->val);
else
ret = mtk_mdp_check_scaler_ratio(variant,
ctx->s_frame.crop.width,
ctx->s_frame.crop.height, new_r.width,
new_r.height, ctx->ctrls.rotate->val);

if (ret) {
dev_info(&ctx->mdp_dev->pdev->dev,
"Out of scaler range");
return -EINVAL;
}
if (ret) {
dev_info(&ctx->mdp_dev->pdev->dev,
"Out of scaler range");
return -EINVAL;
}

s->r = new_r;
Expand Down Expand Up @@ -989,7 +959,6 @@ static int mtk_mdp_s_ctrl(struct v4l2_ctrl *ctrl)
struct mtk_mdp_ctx *ctx = ctrl_to_ctx(ctrl);
struct mtk_mdp_dev *mdp = ctx->mdp_dev;
struct mtk_mdp_variant *variant = mdp->variant;
u32 state = MTK_MDP_DST_FMT | MTK_MDP_SRC_FMT;
int ret = 0;

if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
Expand All @@ -1003,17 +972,15 @@ static int mtk_mdp_s_ctrl(struct v4l2_ctrl *ctrl)
ctx->vflip = ctrl->val;
break;
case V4L2_CID_ROTATE:
if (mtk_mdp_ctx_state_is_set(ctx, state)) {
ret = mtk_mdp_check_scaler_ratio(variant,
ctx->s_frame.crop.width,
ctx->s_frame.crop.height,
ctx->d_frame.crop.width,
ctx->d_frame.crop.height,
ctx->ctrls.rotate->val);

if (ret)
return -EINVAL;
}
ret = mtk_mdp_check_scaler_ratio(variant,
ctx->s_frame.crop.width,
ctx->s_frame.crop.height,
ctx->d_frame.crop.width,
ctx->d_frame.crop.height,
ctx->ctrls.rotate->val);

if (ret)
return -EINVAL;

ctx->rotation = ctrl->val;
break;
Expand Down Expand Up @@ -1090,6 +1057,7 @@ static int mtk_mdp_m2m_open(struct file *file)
struct video_device *vfd = video_devdata(file);
struct mtk_mdp_ctx *ctx = NULL;
int ret;
struct v4l2_format default_format;

ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
if (!ctx)
Expand Down Expand Up @@ -1144,6 +1112,16 @@ static int mtk_mdp_m2m_open(struct file *file)
list_add(&ctx->list, &mdp->ctx_list);
mutex_unlock(&mdp->lock);

/* Default format */
memset(&default_format, 0, sizeof(default_format));
default_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
default_format.fmt.pix_mp.width = 32;
default_format.fmt.pix_mp.height = 32;
default_format.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_YUV420M;
mtk_mdp_m2m_s_fmt_mplane(file, &ctx->fh, &default_format);
default_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
mtk_mdp_m2m_s_fmt_mplane(file, &ctx->fh, &default_format);

mtk_mdp_dbg(0, "%s [%d]", dev_name(&mdp->pdev->dev), ctx->id);

return 0;
Expand Down

0 comments on commit 0d1e342

Please sign in to comment.