From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Pratyush Yadav <p.yadav@ti.com>
Cc: "Mauro Carvalho Chehab" <mchehab@kernel.org>,
"Nikhil Devshatwar" <nikhil.nd@ti.com>,
"Tomi Valkeinen" <tomi.valkeinen@ideasonboard.com>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Benoit Parrot" <bparrot@ti.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Rob Herring" <robh+dt@kernel.org>,
"Sakari Ailus" <sakari.ailus@linux.intel.com>,
"Niklas Söderlund" <niklas.soderlund+renesas@ragnatech.se>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-media@vger.kernel.org
Subject: Re: [PATCH v5 03/14] media: cadence: csi2rx: Add get_fmt and set_fmt pad ops
Date: Thu, 30 Dec 2021 06:32:26 +0200 [thread overview]
Message-ID: <Yc02WlMLA+mafKDo@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20211223191615.17803-4-p.yadav@ti.com>
Hi Pratyush,
Thank you for the patch.
On Fri, Dec 24, 2021 at 12:46:04AM +0530, Pratyush Yadav wrote:
> The format is needed to calculate the link speed for the external DPHY
> configuration. It is not right to query the format from the source
> subdev. Add get_fmt and set_fmt pad operations so that the format can be
> configured and correct bpp be selected.
>
> Signed-off-by: Pratyush Yadav <p.yadav@ti.com>
>
> ---
>
> Changes in v5:
> - Use YUV 1X16 formats instead of 2X8.
> - New in v5.
>
> drivers/media/platform/cadence/cdns-csi2rx.c | 137 +++++++++++++++++++
> 1 file changed, 137 insertions(+)
>
> diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
> index 2547903f2e8e..4a2a5a9d019b 100644
> --- a/drivers/media/platform/cadence/cdns-csi2rx.c
> +++ b/drivers/media/platform/cadence/cdns-csi2rx.c
> @@ -54,6 +54,11 @@ enum csi2rx_pads {
> CSI2RX_PAD_MAX,
> };
>
> +struct csi2rx_fmt {
> + u32 code;
> + u8 bpp;
> +};
> +
> struct csi2rx_priv {
> struct device *dev;
> unsigned int count;
> @@ -79,12 +84,43 @@ struct csi2rx_priv {
> struct v4l2_subdev subdev;
> struct v4l2_async_notifier notifier;
> struct media_pad pads[CSI2RX_PAD_MAX];
> + struct v4l2_mbus_framefmt fmt;
>
> /* Remote source */
> struct v4l2_subdev *source_subdev;
> int source_pad;
> };
>
> +static const struct csi2rx_fmt formats[] = {
> + {
> + .code = MEDIA_BUS_FMT_YUYV8_1X16,
> + .bpp = 16,
> + },
> + {
> + .code = MEDIA_BUS_FMT_UYVY8_1X16,
> + .bpp = 16,
> + },
> + {
> + .code = MEDIA_BUS_FMT_YVYU8_1X16,
> + .bpp = 16,
> + },
> + {
> + .code = MEDIA_BUS_FMT_VYUY8_1X16,
> + .bpp = 16,
> + },
> +};
bpp isn't used. Unless you need it in a subsequent patch in the series,
you can turn the formats array into a u32 array.
> +
> +static const struct csi2rx_fmt *csi2rx_get_fmt_by_code(u32 code)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < ARRAY_SIZE(formats); i++)
> + if (formats[i].code == code)
> + return &formats[i];
> +
> + return NULL;
> +}
> +
> static inline
> struct csi2rx_priv *v4l2_subdev_to_csi2rx(struct v4l2_subdev *subdev)
> {
> @@ -236,12 +272,109 @@ static int csi2rx_s_stream(struct v4l2_subdev *subdev, int enable)
> return ret;
> }
>
> +static struct v4l2_mbus_framefmt *
> +csi2rx_get_pad_format(struct csi2rx_priv *csi2rx,
> + struct v4l2_subdev_state *state,
> + unsigned int pad, u32 which)
> +{
> + switch (which) {
> + case V4L2_SUBDEV_FORMAT_TRY:
> + return v4l2_subdev_get_try_format(&csi2rx->subdev, state, pad);
> + case V4L2_SUBDEV_FORMAT_ACTIVE:
> + return &csi2rx->fmt;
> + default:
> + return NULL;
> + }
> +}
> +
> +static int csi2rx_get_fmt(struct v4l2_subdev *subdev,
> + struct v4l2_subdev_state *state,
> + struct v4l2_subdev_format *format)
> +{
> + struct csi2rx_priv *csi2rx = v4l2_subdev_to_csi2rx(subdev);
> + struct v4l2_mbus_framefmt *framefmt;
> +
> + mutex_lock(&csi2rx->lock);
> +
> + framefmt = csi2rx_get_pad_format(csi2rx, state, format->pad,
> + format->which);
> + mutex_unlock(&csi2rx->lock);
> +
> + if (!framefmt)
> + return -EINVAL;
This can't happen, you can drop the check.
> +
> + format->format = *framefmt;
This is the assignment that needs to be protected by the lock.
csi2rx_get_pad_format() returns a pointer to the storage, it doesn't
modify it.
framefmt = csi2rx_get_pad_format(csi2rx, state, format->pad,
format->which);
mutex_lock(&csi2rx->lock);
format->format = *framefmt;
mutex_unlock(&csi2rx->lock);
Same comments for csi2rx_set_fmt().
> +
> + return 0;
> +}
> +
> +static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
> + struct v4l2_subdev_state *state,
> + struct v4l2_subdev_format *format)
> +{
> + struct csi2rx_priv *csi2rx = v4l2_subdev_to_csi2rx(subdev);
> + struct v4l2_mbus_framefmt *framefmt;
> + const struct csi2rx_fmt *fmt;
> +
> + /* No transcoding, source and sink formats must match. */
> + if (format->pad != CSI2RX_PAD_SINK)
> + return csi2rx_get_fmt(subdev, state, format);
> +
> + fmt = csi2rx_get_fmt_by_code(format->format.code);
> + if (!fmt)
> + return -EOPNOTSUPP;
This should not return an error, but instead adjust the code:
if (!csi2rx_get_fmt_by_code(format->format.code))
format->format.code = formats[0].code;
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> +
> + format->format.field = V4L2_FIELD_NONE;
> +
> + mutex_lock(&csi2rx->lock);
> + framefmt = csi2rx_get_pad_format(csi2rx, state, format->pad,
> + format->which);
> + if (!framefmt) {
> + mutex_unlock(&csi2rx->lock);
> + return -EINVAL;
> + }
> +
> + *framefmt = format->format;
> + mutex_unlock(&csi2rx->lock);
> +
> + return 0;
> +}
> +
> +static int csi2rx_init_cfg(struct v4l2_subdev *subdev,
> + struct v4l2_subdev_state *state)
> +{
> + struct v4l2_subdev_format format = {
> + .which = state ? V4L2_SUBDEV_FORMAT_TRY
> + : V4L2_SUBDEV_FORMAT_ACTIVE,
> + .pad = CSI2RX_PAD_SINK,
> + .format = {
> + .width = 640,
> + .height = 480,
> + .code = MEDIA_BUS_FMT_UYVY8_1X16,
> + .field = V4L2_FIELD_NONE,
> + .colorspace = V4L2_COLORSPACE_SRGB,
> + .ycbcr_enc = V4L2_YCBCR_ENC_601,
> + .quantization = V4L2_QUANTIZATION_LIM_RANGE,
> + .xfer_func = V4L2_XFER_FUNC_SRGB,
> + },
> + };
> +
> + return csi2rx_set_fmt(subdev, state, &format);
> +}
> +
> +static const struct v4l2_subdev_pad_ops csi2rx_pad_ops = {
> + .get_fmt = csi2rx_get_fmt,
> + .set_fmt = csi2rx_set_fmt,
> + .init_cfg = csi2rx_init_cfg,
> +};
> +
> static const struct v4l2_subdev_video_ops csi2rx_video_ops = {
> .s_stream = csi2rx_s_stream,
> };
>
> static const struct v4l2_subdev_ops csi2rx_subdev_ops = {
> .video = &csi2rx_video_ops,
> + .pad = &csi2rx_pad_ops,
> };
>
> static int csi2rx_async_bound(struct v4l2_async_notifier *notifier,
> @@ -457,6 +590,10 @@ static int csi2rx_probe(struct platform_device *pdev)
> if (ret)
> goto err_cleanup;
>
> + ret = csi2rx_init_cfg(&csi2rx->subdev, NULL);
> + if (ret)
> + goto err_cleanup;
> +
> ret = v4l2_async_register_subdev(&csi2rx->subdev);
> if (ret < 0)
> goto err_cleanup;
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2021-12-30 4:32 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-23 19:16 [PATCH v5 00/14] CSI2RX support on J721E Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 01/14] media: cadence: csi2rx: Unregister v4l2 async notifier Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 02/14] media: cadence: csi2rx: Cleanup media entity properly Pratyush Yadav
2021-12-30 4:23 ` Laurent Pinchart
2021-12-23 19:16 ` [PATCH v5 03/14] media: cadence: csi2rx: Add get_fmt and set_fmt pad ops Pratyush Yadav
2021-12-30 4:32 ` Laurent Pinchart [this message]
2022-01-04 6:21 ` Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 04/14] media: cadence: csi2rx: Add external DPHY support Pratyush Yadav
2021-12-30 4:43 ` Laurent Pinchart
2022-01-01 3:07 ` kernel test robot
2021-12-23 19:16 ` [PATCH v5 05/14] media: cadence: csi2rx: Soft reset the streams before starting capture Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 06/14] media: cadence: csi2rx: Set the STOP bit when stopping a stream Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 07/14] media: cadence: csi2rx: Fix stream data configuration Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 08/14] media: cadence: csi2rx: Populate subdev devnode Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 09/14] media: cadence: csi2rx: Add link validation Pratyush Yadav
2021-12-30 4:47 ` Laurent Pinchart
2021-12-23 19:16 ` [PATCH v5 10/14] media: Re-structure TI platform drivers Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 11/14] media: ti: Add CSI2RX support for J721E Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 12/14] media: dt-bindings: Make sure items in data-lanes are unique Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 13/14] media: dt-bindings: Add DT bindings for TI J721E CSI2RX driver Pratyush Yadav
2021-12-23 19:16 ` [PATCH v5 14/14] media: dt-bindings: Convert Cadence CSI2RX binding to YAML Pratyush Yadav
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=Yc02WlMLA+mafKDo@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=bparrot@ti.com \
--cc=devicetree@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=mripard@kernel.org \
--cc=nikhil.nd@ti.com \
--cc=niklas.soderlund+renesas@ragnatech.se \
--cc=p.yadav@ti.com \
--cc=robh+dt@kernel.org \
--cc=sakari.ailus@linux.intel.com \
--cc=tomi.valkeinen@ideasonboard.com \
--cc=vigneshr@ti.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.