From 956fd55c1071c48f00285d82507698c501633e7a Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 13 Sep 2019 15:11:47 +0100 Subject: [PATCH] staging: bcm2835-codec: Correct g/s_selection API MPLANE support The g_selection and s_selection API is messed up and requires the driver to expect the non-MPLANE buffer types, not the MPLANE ones even if they are supported. The V4L2 core will convert the MPLANE ones to non-MPLANE should they be passed in Fixes: 5e484a3 staging: bcm2835-codec: switch to multi-planar API Signed-off-by: Dave Stevenson --- .../bcm2835-codec/bcm2835-v4l2-codec.c | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) --- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c +++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c @@ -1260,17 +1260,30 @@ static int vidioc_g_selection(struct fil { struct bcm2835_codec_ctx *ctx = file2ctx(file); struct bcm2835_codec_q_data *q_data; - bool capture_queue = s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ? - true : false; - if ((ctx->dev->role == DECODE && !capture_queue) || - (ctx->dev->role == ENCODE && capture_queue)) - /* OUTPUT on decoder and CAPTURE on encoder are not valid. */ - return -EINVAL; - - q_data = get_q_data(ctx, s->type); - if (!q_data) + /* + * The selection API takes V4L2_BUF_TYPE_VIDEO_CAPTURE and + * V4L2_BUF_TYPE_VIDEO_OUTPUT, even if the device implements the MPLANE + * API. The V4L2 core will have converted the MPLANE variants to + * non-MPLANE. + * Open code this instead of using get_q_data in this case. + */ + switch (s->type) { + case V4L2_BUF_TYPE_VIDEO_CAPTURE: + /* CAPTURE on encoder is not valid. */ + if (ctx->dev->role == ENCODE) + return -EINVAL; + q_data = &ctx->q_data[V4L2_M2M_DST]; + break; + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + /* OUTPUT on deoder is not valid. */ + if (ctx->dev->role == DECODE) + return -EINVAL; + q_data = &ctx->q_data[V4L2_M2M_SRC]; + break; + default: return -EINVAL; + } switch (ctx->dev->role) { case DECODE: @@ -1323,22 +1336,36 @@ static int vidioc_s_selection(struct fil { struct bcm2835_codec_ctx *ctx = file2ctx(file); struct bcm2835_codec_q_data *q_data = NULL; - bool capture_queue = s->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ? - true : false; + + /* + * The selection API takes V4L2_BUF_TYPE_VIDEO_CAPTURE and + * V4L2_BUF_TYPE_VIDEO_OUTPUT, even if the device implements the MPLANE + * API. The V4L2 core will have converted the MPLANE variants to + * non-MPLANE. + * + * Open code this instead of using get_q_data in this case. + */ + switch (s->type) { + case V4L2_BUF_TYPE_VIDEO_CAPTURE: + /* CAPTURE on encoder is not valid. */ + if (ctx->dev->role == ENCODE) + return -EINVAL; + q_data = &ctx->q_data[V4L2_M2M_DST]; + break; + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + /* OUTPUT on deoder is not valid. */ + if (ctx->dev->role == DECODE) + return -EINVAL; + q_data = &ctx->q_data[V4L2_M2M_SRC]; + break; + default: + return -EINVAL; + } v4l2_dbg(1, debug, &ctx->dev->v4l2_dev, "%s: ctx %p, type %d, q_data %p, target %d, rect x/y %d/%d, w/h %ux%u\n", __func__, ctx, s->type, q_data, s->target, s->r.left, s->r.top, s->r.width, s->r.height); - if ((ctx->dev->role == DECODE && !capture_queue) || - (ctx->dev->role == ENCODE && capture_queue)) - /* OUTPUT on decoder and CAPTURE on encoder are not valid. */ - return -EINVAL; - - q_data = get_q_data(ctx, s->type); - if (!q_data) - return -EINVAL; - switch (ctx->dev->role) { case DECODE: switch (s->target) {