From: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
To: Marco Felsch <m.felsch@pengutronix.de>
Cc: mchehab@kernel.org, robh+dt@kernel.org, mark.rutland@arm.com,
p.zabel@pengutronix.de, afshin.nasser@gmail.com,
javierm@redhat.com, sakari.ailus@linux.intel.com,
laurent.pinchart@ideasonboard.com, linux-media@vger.kernel.org,
devicetree@vger.kernel.org, kernel@pengutronix.de
Subject: Re: [PATCH 06/22] [media] tvp5150: add FORMAT_TRY support for get/set selection handlers
Date: Mon, 30 Jul 2018 21:01:23 -0300 [thread overview]
Message-ID: <20180730210123.7f1f2b57@coco.lan> (raw)
In-Reply-To: <20180628162054.25613-7-m.felsch@pengutronix.de>
Em Thu, 28 Jun 2018 18:20:38 +0200
Marco Felsch <m.felsch@pengutronix.de> escreveu:
> Since commit 10d5509c8d50 ("[media] v4l2: remove g/s_crop from video ops")
> the 'which' field for set/get_selection must be FORMAT_ACTIVE. There is
> no way to try different selections. The patch adds a helper function to
> select the correct selection memory space (sub-device file handle or
> driver state) which will be set/returned.
>
> The TVP5150 AVID will be updated if the 'which' field is FORMAT_ACTIVE
> and the requested selection rectangle differs from the already set one.
>
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> ---
> drivers/media/i2c/tvp5150.c | 107 ++++++++++++++++++++++++------------
> 1 file changed, 73 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
> index d150487cc2d1..29eaf8166f25 100644
> --- a/drivers/media/i2c/tvp5150.c
> +++ b/drivers/media/i2c/tvp5150.c
> @@ -18,6 +18,7 @@
> #include <media/v4l2-ctrls.h>
> #include <media/v4l2-fwnode.h>
> #include <media/v4l2-mc.h>
> +#include <media/v4l2-rect.h>
>
> #include "tvp5150_reg.h"
>
> @@ -846,20 +847,38 @@ static v4l2_std_id tvp5150_read_std(struct v4l2_subdev *sd)
> }
> }
>
> +static struct v4l2_rect *
> +__tvp5150_get_pad_crop(struct tvp5150 *decoder,
> + struct v4l2_subdev_pad_config *cfg, unsigned int pad,
> + enum v4l2_subdev_format_whence which)
> +{
> + switch (which) {
> + case V4L2_SUBDEV_FORMAT_TRY:
> + return v4l2_subdev_get_try_crop(&decoder->sd, cfg, pad);
This is not ok. It causes compilation breakage if the subdev API is not
selected:
drivers/media/i2c/tvp5150.c: In function ‘__tvp5150_get_pad_crop’:
drivers/media/i2c/tvp5150.c:857:10: error: implicit declaration of function ‘v4l2_subdev_get_try_crop’; did you mean ‘v4l2_subdev_has_op’? [-Werror=implicit-function-declaration]
return v4l2_subdev_get_try_crop(&decoder->sd, cfg, pad);
^~~~~~~~~~~~~~~~~~~~~~~~
v4l2_subdev_has_op
drivers/media/i2c/tvp5150.c:857:10: warning: returning ‘int’ from a function with return type ‘struct v4l2_rect *’ makes pointer from integer without a cast [-Wint-conversion]
return v4l2_subdev_get_try_crop(&decoder->sd, cfg, pad);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The logic should keep working both with and without subdev API.
> + case V4L2_SUBDEV_FORMAT_ACTIVE:
> + return &decoder->rect;
> + default:
> + return NULL;
> + }
> +}
> +
> static int tvp5150_fill_fmt(struct v4l2_subdev *sd,
> struct v4l2_subdev_pad_config *cfg,
> struct v4l2_subdev_format *format)
> {
> struct v4l2_mbus_framefmt *f;
> + struct v4l2_rect *__crop;
> struct tvp5150 *decoder = to_tvp5150(sd);
>
> if (!format || (format->pad != DEMOD_PAD_VID_OUT))
> return -EINVAL;
>
> f = &format->format;
> + __crop = __tvp5150_get_pad_crop(decoder, cfg, format->pad,
> + format->which);
>
> - f->width = decoder->rect.width;
> - f->height = decoder->rect.height / 2;
> + f->width = __crop->width;
> + f->height = __crop->height / 2;
>
> f->code = MEDIA_BUS_FMT_UYVY8_2X8;
> f->field = V4L2_FIELD_ALTERNATE;
> @@ -870,17 +889,51 @@ static int tvp5150_fill_fmt(struct v4l2_subdev *sd,
> return 0;
> }
>
> +unsigned int tvp5150_get_hmax(struct v4l2_subdev *sd)
> +{
> + struct tvp5150 *decoder = to_tvp5150(sd);
> + v4l2_std_id std;
> +
> + /* Calculate height based on current standard */
> + if (decoder->norm == V4L2_STD_ALL)
> + std = tvp5150_read_std(sd);
> + else
> + std = decoder->norm;
> +
> + return (std & V4L2_STD_525_60) ?
> + TVP5150_V_MAX_525_60 : TVP5150_V_MAX_OTHERS;
> +}
> +
> +static inline void
> +__tvp5150_set_selection(struct v4l2_subdev *sd, struct v4l2_rect rect)
> +{
> + struct tvp5150 *decoder = to_tvp5150(sd);
> + unsigned int hmax = tvp5150_get_hmax(sd);
> +
> + regmap_write(decoder->regmap, TVP5150_VERT_BLANKING_START, rect.top);
> + regmap_write(decoder->regmap, TVP5150_VERT_BLANKING_STOP,
> + rect.top + rect.height - hmax);
> + regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_ST_MSB,
> + rect.left >> TVP5150_CROP_SHIFT);
> + regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_ST_LSB,
> + rect.left | (1 << TVP5150_CROP_SHIFT));
> + regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_STP_MSB,
> + (rect.left + rect.width - TVP5150_MAX_CROP_LEFT) >>
> + TVP5150_CROP_SHIFT);
> + regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_STP_LSB,
> + rect.left + rect.width - TVP5150_MAX_CROP_LEFT);
> +}
> +
> static int tvp5150_set_selection(struct v4l2_subdev *sd,
> struct v4l2_subdev_pad_config *cfg,
> struct v4l2_subdev_selection *sel)
> {
> struct tvp5150 *decoder = to_tvp5150(sd);
> struct v4l2_rect rect = sel->r;
> - v4l2_std_id std;
> - int hmax;
> + struct v4l2_rect *__crop;
> + unsigned int hmax;
>
> - if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
> - sel->target != V4L2_SEL_TGT_CROP)
> + if (sel->target != V4L2_SEL_TGT_CROP)
> return -EINVAL;
>
> dev_dbg_lvl(sd->dev, 1, debug, "%s left=%d, top=%d, width=%d, height=%d\n",
> @@ -889,17 +942,7 @@ static int tvp5150_set_selection(struct v4l2_subdev *sd,
> /* tvp5150 has some special limits */
> rect.left = clamp(rect.left, 0, TVP5150_MAX_CROP_LEFT);
> rect.top = clamp(rect.top, 0, TVP5150_MAX_CROP_TOP);
> -
> - /* Calculate height based on current standard */
> - if (decoder->norm == V4L2_STD_ALL)
> - std = tvp5150_read_std(sd);
> - else
> - std = decoder->norm;
> -
> - if (std & V4L2_STD_525_60)
> - hmax = TVP5150_V_MAX_525_60;
> - else
> - hmax = TVP5150_V_MAX_OTHERS;
> + hmax = tvp5150_get_hmax(sd);
>
> /*
> * alignments:
> @@ -912,20 +955,18 @@ static int tvp5150_set_selection(struct v4l2_subdev *sd,
> hmax - TVP5150_MAX_CROP_TOP - rect.top,
> hmax - rect.top, 0, 0);
>
> - regmap_write(decoder->regmap, TVP5150_VERT_BLANKING_START, rect.top);
> - regmap_write(decoder->regmap, TVP5150_VERT_BLANKING_STOP,
> - rect.top + rect.height - hmax);
> - regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_ST_MSB,
> - rect.left >> TVP5150_CROP_SHIFT);
> - regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_ST_LSB,
> - rect.left | (1 << TVP5150_CROP_SHIFT));
> - regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_STP_MSB,
> - (rect.left + rect.width - TVP5150_MAX_CROP_LEFT) >>
> - TVP5150_CROP_SHIFT);
> - regmap_write(decoder->regmap, TVP5150_ACT_VD_CROP_STP_LSB,
> - rect.left + rect.width - TVP5150_MAX_CROP_LEFT);
> + __crop = __tvp5150_get_pad_crop(decoder, cfg, sel->pad,
> + sel->which);
> +
> + /*
> + * Update output image size if the selection (crop) rectangle size or
> + * position has been modified.
> + */
> + if (!v4l2_rect_equal(&rect, __crop))
> + if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
> + __tvp5150_set_selection(sd, rect);
>
> - decoder->rect = rect;
> + *__crop = rect;
>
> return 0;
> }
> @@ -937,9 +978,6 @@ static int tvp5150_get_selection(struct v4l2_subdev *sd,
> struct tvp5150 *decoder = container_of(sd, struct tvp5150, sd);
> v4l2_std_id std;
>
> - if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE)
> - return -EINVAL;
> -
> switch (sel->target) {
> case V4L2_SEL_TGT_CROP_BOUNDS:
> case V4L2_SEL_TGT_CROP_DEFAULT:
> @@ -958,7 +996,8 @@ static int tvp5150_get_selection(struct v4l2_subdev *sd,
> sel->r.height = TVP5150_V_MAX_OTHERS;
> return 0;
> case V4L2_SEL_TGT_CROP:
> - sel->r = decoder->rect;
> + sel->r = *__tvp5150_get_pad_crop(decoder, cfg, sel->pad,
> + sel->which);
> return 0;
> default:
> return -EINVAL;
Thanks,
Mauro
next prev parent reply other threads:[~2018-07-31 0:01 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-28 16:20 [PATCH 00/21] TVP5150 fixes and new features Marco Felsch
2018-06-28 16:20 ` [PATCH 01/22] [media] tvp5150: fix width alignment during set_selection() Marco Felsch
2018-06-28 16:20 ` [PATCH 02/22] [media] tvp5150: fix switch exit in set control handler Marco Felsch
2018-06-28 16:20 ` [PATCH 03/22] [media] tvp5150: convert register access to regmap Marco Felsch
2018-06-28 16:20 ` [PATCH 04/22] [media] tvp5150: make use of regmap_update_bits Marco Felsch
2018-06-28 16:20 ` [PATCH 05/22] [media] v4l2-rect.h: add position and equal helpers Marco Felsch
2018-06-29 14:12 ` Sakari Ailus
2018-06-28 16:20 ` [PATCH 06/22] [media] tvp5150: add FORMAT_TRY support for get/set selection handlers Marco Felsch
2018-07-31 0:01 ` Mauro Carvalho Chehab [this message]
2018-08-09 13:52 ` Marco Felsch
2018-06-28 16:20 ` [PATCH 07/22] [media] tvp5150: add default format helper Marco Felsch
2018-06-28 16:20 ` [PATCH 08/22] [media] tvp5150: trigger autodetection on subdev open to reset cropping Marco Felsch
2018-06-28 16:20 ` [PATCH 09/22] [media] tvp5150: fix standard autodetection Marco Felsch
2018-06-28 16:20 ` [PATCH 10/22] [media] tvp5150: split reset/enable routine Marco Felsch
2018-06-28 16:20 ` [PATCH 11/22] [media] tvp5150: remove pin configuration from initialization tables Marco Felsch
2018-06-28 16:20 ` [PATCH 12/22] [media] tvp5150: Add sync lock interrupt handling Marco Felsch
2018-06-28 16:20 ` [PATCH 13/22] [media] tvp5150: disable output while signal not locked Marco Felsch
2018-07-30 18:00 ` Mauro Carvalho Chehab
2018-07-30 18:06 ` Mauro Carvalho Chehab
2018-07-31 6:02 ` Marco Felsch
2018-06-28 16:20 ` [PATCH 14/22] [media] tvp5150: issue source change events Marco Felsch
2018-06-28 16:20 ` [PATCH 15/22] [media] tvp5150: add sync lock/loss signal debug messages Marco Felsch
2018-06-28 16:20 ` [PATCH 16/22] [media] tvp5150: add querystd Marco Felsch
2018-07-30 18:09 ` Mauro Carvalho Chehab
2018-08-01 13:21 ` Marco Felsch
2018-08-01 14:22 ` Mauro Carvalho Chehab
2018-08-01 14:49 ` Marco Felsch
2018-08-01 15:50 ` Mauro Carvalho Chehab
2018-08-02 8:01 ` Marco Felsch
2018-08-02 9:49 ` Mauro Carvalho Chehab
2018-08-02 10:16 ` Marco Felsch
2018-08-02 14:38 ` Mauro Carvalho Chehab
2018-08-02 10:54 ` Ian Arkver
2018-08-02 11:58 ` Marco Felsch
2018-06-28 16:20 ` [PATCH 17/22] [media] tvp5150: add g_std callback Marco Felsch
2018-06-28 16:20 ` [PATCH 18/22] partial revert of "[media] tvp5150: add HW input connectors support" Marco Felsch
2018-07-03 23:19 ` Rob Herring
2018-07-30 18:18 ` Mauro Carvalho Chehab
2018-07-31 7:01 ` Marco Felsch
2018-07-31 8:52 ` Javier Martinez Canillas
2018-07-31 10:06 ` Mauro Carvalho Chehab
2018-07-31 11:26 ` Javier Martinez Canillas
2018-07-31 12:36 ` Marco Felsch
2018-07-31 12:52 ` Javier Martinez Canillas
2018-07-31 13:30 ` Marco Felsch
2018-07-31 19:56 ` Mauro Carvalho Chehab
2018-08-01 12:10 ` Marco Felsch
2018-08-01 13:32 ` Mauro Carvalho Chehab
2018-08-01 15:49 ` Marco Felsch
2018-08-01 16:23 ` Javier Martinez Canillas
2018-07-31 13:01 ` Mauro Carvalho Chehab
2018-07-31 13:22 ` Mauro Carvalho Chehab
2018-06-28 16:20 ` [PATCH 19/22] [media] tvp5150: add input source selection of_graph support Marco Felsch
2018-07-30 18:29 ` Mauro Carvalho Chehab
2018-08-08 15:29 ` Marco Felsch
2018-08-08 18:52 ` Mauro Carvalho Chehab
2018-08-09 12:55 ` Marco Felsch
2018-08-09 13:36 ` Mauro Carvalho Chehab
2018-08-09 14:35 ` Marco Felsch
2018-08-09 16:04 ` Mauro Carvalho Chehab
2018-08-09 16:34 ` Marco Felsch
2018-06-28 16:20 ` [PATCH 20/22] [media] tvp5150: Add input port connectors DT bindings Marco Felsch
2018-07-03 23:23 ` Rob Herring
2018-07-11 8:50 ` Marco Felsch
2018-08-03 7:29 ` Marco Felsch
2018-08-03 17:30 ` Mauro Carvalho Chehab
2018-08-04 9:04 ` Marco Felsch
2018-06-28 16:20 ` [PATCH 21/22] [media] tvp5150: initialize subdev before parsing device tree Marco Felsch
2018-06-28 16:20 ` [PATCH 22/22] [media] tvp5150: Change default input source selection behaviour Marco Felsch
2018-06-28 20:57 ` [PATCH 00/21] TVP5150 fixes and new features Javier Martinez Canillas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180730210123.7f1f2b57@coco.lan \
--to=mchehab+samsung@kernel.org \
--cc=afshin.nasser@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=javierm@redhat.com \
--cc=kernel@pengutronix.de \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=m.felsch@pengutronix.de \
--cc=mark.rutland@arm.com \
--cc=mchehab@kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=robh+dt@kernel.org \
--cc=sakari.ailus@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.