devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jai Luthra <j-luthra@ti.com>
To: Mauro Carvalho Chehab <mchehab@kernel.org>,
	Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Cc: <linux-media@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<devicetree@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	Mauro Carvalho Chehab <mchehab+samsung@kernel.org>,
	Maxime Ripard <mripard@kernel.org>,
	<niklas.soderlund+renesas@ragnatech.se>,
	Benoit Parrot <bparrot@ti.com>,
	Vaishnav Achath <vaishnav.a@ti.com>,
	Vignesh Raghavendra <vigneshr@ti.com>, <nm@ti.com>,
	<devarsht@ti.com>, <j-luthra@ti.com>
Subject: [PATCH v8 07/16] media: cadence: csi2rx: Add get_fmt and set_fmt pad ops
Date: Mon, 31 Jul 2023 13:59:25 +0530	[thread overview]
Message-ID: <20230731-upstream_csi-v8-7-fb7d3661c2c9@ti.com> (raw)
In-Reply-To: <20230731-upstream_csi-v8-0-fb7d3661c2c9@ti.com>

From: Pratyush Yadav <p.yadav@ti.com>

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.

Initialize and use the v4l2 subdev active state to keep track of the
active formats. Also propagate the new format from the sink pad to all
the source pads.

Signed-off-by: Pratyush Yadav <p.yadav@ti.com>
Co-authored-by: Jai Luthra <j-luthra@ti.com>
Signed-off-by: Jai Luthra <j-luthra@ti.com>
---
v7->v8:
- Use active subdev state to use v4l2_subdev_get_fmt
- Propagate formats from sink to source pads
- Drop Laurent's R-by because of the above changes

 drivers/media/platform/cadence/cdns-csi2rx.c | 107 ++++++++++++++++++++++++++-
 1 file changed, 106 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
index 83d1fadd592b..4f9654366485 100644
--- a/drivers/media/platform/cadence/cdns-csi2rx.c
+++ b/drivers/media/platform/cadence/cdns-csi2rx.c
@@ -61,6 +61,11 @@ enum csi2rx_pads {
 	CSI2RX_PAD_MAX,
 };
 
+struct csi2rx_fmt {
+	u32				code;
+	u8				bpp;
+};
+
 struct csi2rx_priv {
 	struct device			*dev;
 	unsigned int			count;
@@ -95,6 +100,36 @@ struct csi2rx_priv {
 	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,
+	},
+};
+
+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)
 {
@@ -303,12 +338,75 @@ static int csi2rx_s_stream(struct v4l2_subdev *subdev, int enable)
 	return ret;
 }
 
+static int csi2rx_set_fmt(struct v4l2_subdev *subdev,
+			  struct v4l2_subdev_state *state,
+			  struct v4l2_subdev_format *format)
+{
+	struct v4l2_mbus_framefmt *fmt;
+	unsigned int i;
+
+	/* No transcoding, source and sink formats must match. */
+	if (format->pad != CSI2RX_PAD_SINK)
+		return v4l2_subdev_get_fmt(subdev, state, format);
+
+	if (!csi2rx_get_fmt_by_code(format->format.code))
+		format->format.code = formats[0].code;
+
+	format->format.field = V4L2_FIELD_NONE;
+
+	/* Set sink format */
+	fmt = v4l2_subdev_get_pad_format(subdev, state, format->pad);
+	if (!fmt)
+		return -EINVAL;
+
+	*fmt = format->format;
+
+	/* Propagate to source formats */
+	for (i = CSI2RX_PAD_SOURCE_STREAM0; i < CSI2RX_PAD_MAX; i++) {
+		fmt = v4l2_subdev_get_pad_format(subdev, state, i);
+		if (!fmt)
+			return -EINVAL;
+		*fmt = format->format;
+	}
+
+	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	= v4l2_subdev_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,
@@ -532,9 +630,13 @@ static int csi2rx_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_cleanup;
 
+	ret = v4l2_subdev_init_finalize(&csi2rx->subdev);
+	if (ret)
+		goto err_cleanup;
+
 	ret = v4l2_async_register_subdev(&csi2rx->subdev);
 	if (ret < 0)
-		goto err_cleanup;
+		goto err_free_state;
 
 	dev_info(&pdev->dev,
 		 "Probed CSI2RX with %u/%u lanes, %u streams, %s D-PHY\n",
@@ -544,6 +646,8 @@ static int csi2rx_probe(struct platform_device *pdev)
 
 	return 0;
 
+err_free_state:
+	v4l2_subdev_cleanup(&csi2rx->subdev);
 err_cleanup:
 	v4l2_async_nf_unregister(&csi2rx->notifier);
 	v4l2_async_nf_cleanup(&csi2rx->notifier);
@@ -560,6 +664,7 @@ static void csi2rx_remove(struct platform_device *pdev)
 	v4l2_async_nf_unregister(&csi2rx->notifier);
 	v4l2_async_nf_cleanup(&csi2rx->notifier);
 	v4l2_async_unregister_subdev(&csi2rx->subdev);
+	v4l2_subdev_cleanup(&csi2rx->subdev);
 	media_entity_cleanup(&csi2rx->subdev.entity);
 	kfree(csi2rx);
 }

-- 
2.41.0

  parent reply	other threads:[~2023-07-31  8:29 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-31  8:29 [PATCH v8 00/16] CSI2RX support on J721E and AM62 Jai Luthra
2023-07-31  8:29 ` [PATCH v8 01/16] media: subdev: Export get_format helper for link validation Jai Luthra
2023-08-01 14:09   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 02/16] media: dt-bindings: Make sure items in data-lanes are unique Jai Luthra
2023-08-01 14:09   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 03/16] media: dt-bindings: cadence-csi2rx: Add TI compatible string Jai Luthra
2023-08-05 21:06   ` Krzysztof Kozlowski
2023-07-31  8:29 ` [PATCH v8 04/16] media: cadence: Add support for TI SoCs Jai Luthra
2023-08-05 21:06   ` Krzysztof Kozlowski
2023-08-07  7:58     ` Jai Luthra
2023-07-31  8:29 ` [PATCH v8 05/16] media: cadence: csi2rx: Unregister v4l2 async notifier Jai Luthra
2023-08-01 14:11   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 06/16] media: cadence: csi2rx: Cleanup media entity properly Jai Luthra
2023-08-01 14:11   ` Tomi Valkeinen
2023-07-31  8:29 ` Jai Luthra [this message]
2023-08-02  8:48   ` [PATCH v8 07/16] media: cadence: csi2rx: Add get_fmt and set_fmt pad ops Tomi Valkeinen
2023-08-03 11:18     ` Jai Luthra
2023-07-31  8:29 ` [PATCH v8 08/16] media: cadence: csi2rx: Configure DPHY using link freq Jai Luthra
2023-08-02  9:41   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 09/16] media: cadence: csi2rx: Soft reset the streams before starting capture Jai Luthra
2023-08-01 14:16   ` Tomi Valkeinen
2023-08-03 11:19     ` Jai Luthra
2023-07-31  8:29 ` [PATCH v8 10/16] media: cadence: csi2rx: Set the STOP bit when stopping a stream Jai Luthra
2023-08-02  9:45   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 11/16] media: cadence: csi2rx: Fix stream data configuration Jai Luthra
2023-08-01 14:17   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 12/16] media: cadence: csi2rx: Populate subdev devnode Jai Luthra
2023-08-01 14:18   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 13/16] media: cadence: csi2rx: Add link validation Jai Luthra
2023-08-01 14:19   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 14/16] media: cadence: csi2rx: Support RAW8 and RAW10 formats Jai Luthra
2023-08-02  9:46   ` Tomi Valkeinen
2023-07-31  8:29 ` [PATCH v8 15/16] media: dt-bindings: Add TI J721E CSI2RX Jai Luthra
2023-07-31  9:31   ` Rob Herring
2023-07-31  9:54     ` Jai Luthra
2023-07-31  8:29 ` [PATCH v8 16/16] media: ti: Add CSI2RX support for J721E Jai Luthra
2023-08-02 11:04   ` Tomi Valkeinen
2023-08-02 11:14     ` Sakari Ailus
2023-08-02 12:09       ` Tomi Valkeinen
2023-08-03 11:51     ` Jai Luthra
2023-07-31 12:11 ` [PATCH v8 00/16] CSI2RX support on J721E and AM62 Maxime Ripard
2023-08-08 22:55 ` Vaishnav Achath

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=20230731-upstream_csi-v8-7-fb7d3661c2c9@ti.com \
    --to=j-luthra@ti.com \
    --cc=bparrot@ti.com \
    --cc=conor+dt@kernel.org \
    --cc=devarsht@ti.com \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab+samsung@kernel.org \
    --cc=mchehab@kernel.org \
    --cc=mripard@kernel.org \
    --cc=niklas.soderlund+renesas@ragnatech.se \
    --cc=nm@ti.com \
    --cc=robh+dt@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=tomi.valkeinen@ideasonboard.com \
    --cc=vaishnav.a@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).