Linux Media Controller development
 help / color / mirror / Atom feed
* [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency
@ 2025-01-19 14:38 Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 1/9] media: v4l: Support passing media pad argument to v4l2_get_link_freq() Sakari Ailus
                   ` (8 more replies)
  0 siblings, 9 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:38 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Hi folks,

This set adds a few helpers for obtaining the link frequency from the V4L2
mbus config for devices that don't need to provide an UAPI to change it,
and finally move drivers to call v4l2_get_link_freq() on a pad.

since v8:

- Use memset() to zero mbus config in call_get_mbus_config() instead of
  documenting the caller is responsible for that.

- Call the function obtaining media pad in the external sub-device
  camss_find_sensor_pad() in the qcom camss driver. Correspondingly, call
  the related local variables "sensor_pad" instead of "sensor".

since v7:

- Drop ctrl_to_csi() as it's now unused.

- Add patches to document how CSI-2 receiver should obtain the link
  frequency, moving stopping streaming out of CSI-2 specific part and
  adding a note on setting all fields in get_mbus_config() op.

- Added a patch to convert existing users of v4l2_get_link_freq() to
  operate on a media pad (vs. the control handler). I'll postpone merging
  this however to test it a bit as it touches a number of drivers for
  which I have no hardware for.

- Revert the order or the ivsc and ipu6 patches.

- Improved documentation as discussed with Laurent in v7 review.

since v6:

- Remove comments on #else / #endif, it's trivial.

- Add a patch to convert the ipu6 driver.

since v5:

- Only support pad-based operation with CONFIG_MEDIA_CONTROLLER (1st and
  2nd patches).

since v4:

- Rework documentation a little.

- Remove wrong alignment change in 2nd patch.

- Move link_freq field after the type field in struct v4l2_mbus_config.

since v3:

- Add back missing ret I accidentally removed rather than moved to the 2nd
  patch.

since v2:

- Switch to V4L2 mbus config for conveying the link frequency.

since v1:

- Add a new 64-bit integer control V4L2_CID_CUR_LINK_FREQ instead of
  re-using V4L2_CID_LINK_FREQ.

Sakari Ailus (9):
  media: v4l: Support passing media pad argument to v4l2_get_link_freq()
  media: v4l: Support obtaining link frequency via get_mbus_config
  media: Documentation: Update link frequency driver documentation
  media: Documentation: tx-rx: Move transmitter control out of CSI-2
    part
  media: Documentation: Receiver drivers should call
    v4l2_get_link_freq()
  media: v4l: Memset argument to 0 before calling get_mbus_config pad op
  media: intel/ipu6: Obtain link frequency from the remote subdev pad
  media: ivsc: csi: Obtain link frequency from the media pad
  media: v4l: Convert the users of v4l2_get_link_freq to call it on a
    pad

 Documentation/driver-api/media/tx-rx.rst      | 26 ++++---
 drivers/media/i2c/st-mipid02.c                |  5 +-
 drivers/media/i2c/tc358746.c                  |  4 +-
 drivers/media/pci/intel/ipu3/ipu3-cio2.c      | 11 ++-
 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 12 +--
 drivers/media/pci/intel/ivsc/mei_csi.c        | 78 +++++++------------
 drivers/media/platform/cadence/cdns-csi2rx.c  |  4 +-
 drivers/media/platform/nxp/imx-mipi-csis.c    |  5 +-
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 11 ++-
 .../media/platform/qcom/camss/camss-vfe-17x.c |  9 ++-
 .../platform/qcom/camss/camss-vfe-gen1.c      |  9 ++-
 drivers/media/platform/qcom/camss/camss.c     | 27 +++----
 drivers/media/platform/qcom/camss/camss.h     |  2 +-
 .../media/platform/raspberrypi/rp1-cfe/cfe.c  |  4 +-
 drivers/media/platform/st/stm32/stm32-csi.c   |  4 +-
 drivers/media/platform/ti/cal/cal-camerarx.c  |  3 +-
 drivers/media/platform/ti/cal/cal.c           |  4 +-
 drivers/media/platform/ti/cal/cal.h           |  1 +
 drivers/media/v4l2-core/v4l2-common.c         | 32 +++++++-
 drivers/media/v4l2-core/v4l2-subdev.c         |  2 +
 include/media/v4l2-common.h                   | 19 ++++-
 include/media/v4l2-mediabus.h                 |  2 +
 include/media/v4l2-subdev.h                   |  4 +-
 23 files changed, 161 insertions(+), 117 deletions(-)


base-commit: c4b7779abc6633677e6edb79e2809f4f61fde157
-- 
2.39.5


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v9 1/9] media: v4l: Support passing media pad argument to v4l2_get_link_freq()
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
@ 2025-01-19 14:38 ` Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 2/9] media: v4l: Support obtaining link frequency via get_mbus_config Sakari Ailus
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:38 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

v4l2_get_link_freq() accepts a V4L2 control handler for now, but it needs
to take struct media_pad argument in order to obtain the link frequency
using get_mbus_config() pad op. Prepare for this by allowing struct
media_pad as well.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/media/v4l2-core/v4l2-common.c | 21 ++++++++++++++++++---
 include/media/v4l2-common.h           | 19 ++++++++++++++++---
 2 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c
index 0a2f4f0d0a07..9fe74c7e064f 100644
--- a/drivers/media/v4l2-core/v4l2-common.c
+++ b/drivers/media/v4l2-core/v4l2-common.c
@@ -466,8 +466,8 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat,
 }
 EXPORT_SYMBOL_GPL(v4l2_fill_pixfmt);
 
-s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul,
-		       unsigned int div)
+s64 __v4l2_get_link_freq_ctrl(struct v4l2_ctrl_handler *handler,
+			      unsigned int mul, unsigned int div)
 {
 	struct v4l2_ctrl *ctrl;
 	s64 freq;
@@ -502,7 +502,22 @@ s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul,
 
 	return freq > 0 ? freq : -EINVAL;
 }
-EXPORT_SYMBOL_GPL(v4l2_get_link_freq);
+EXPORT_SYMBOL_GPL(__v4l2_get_link_freq_ctrl);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+s64 __v4l2_get_link_freq_pad(struct media_pad *pad, unsigned int mul,
+			     unsigned int div)
+{
+	struct v4l2_subdev *sd;
+
+	sd = media_entity_to_v4l2_subdev(pad->entity);
+	if (!sd)
+		return -ENODEV;
+
+	return __v4l2_get_link_freq_ctrl(sd->ctrl_handler, mul, div);
+}
+EXPORT_SYMBOL_GPL(__v4l2_get_link_freq_pad);
+#endif /* CONFIG_MEDIA_CONTROLLER */
 
 /*
  * Simplify a fraction using a simple continued fraction decomposition. The
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
index 63ad36f04f72..fda903bb3674 100644
--- a/include/media/v4l2-common.h
+++ b/include/media/v4l2-common.h
@@ -525,7 +525,8 @@ int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat,
 /**
  * v4l2_get_link_freq - Get link rate from transmitter
  *
- * @handler: The transmitter's control handler
+ * @pad: The transmitter's media pad (or control handler for non-MC users or
+ *	 compatibility reasons, don't use in new code)
  * @mul: The multiplier between pixel rate and link frequency. Bits per pixel on
  *	 D-PHY, samples per clock on parallel. 0 otherwise.
  * @div: The divisor between pixel rate and link frequency. Number of data lanes
@@ -541,8 +542,20 @@ int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat,
  * * %-ENOENT: Link frequency or pixel rate control not found
  * * %-EINVAL: Invalid link frequency value
  */
-s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul,
-		       unsigned int div);
+#ifdef CONFIG_MEDIA_CONTROLLER
+#define v4l2_get_link_freq(pad, mul, div)				\
+	_Generic(pad,							\
+		 struct media_pad *: __v4l2_get_link_freq_pad,		\
+		 struct v4l2_ctrl_handler *: __v4l2_get_link_freq_ctrl)	\
+	(pad, mul, div)
+s64 __v4l2_get_link_freq_pad(struct media_pad *pad, unsigned int mul,
+			     unsigned int div);
+#else
+#define v4l2_get_link_freq(handler, mul, div)		\
+	__v4l2_get_link_freq_ctrl(handler, mul, div)
+#endif
+s64 __v4l2_get_link_freq_ctrl(struct v4l2_ctrl_handler *handler,
+			      unsigned int mul, unsigned int div);
 
 void v4l2_simplify_fraction(u32 *numerator, u32 *denominator,
 		unsigned int n_terms, unsigned int threshold);
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 2/9] media: v4l: Support obtaining link frequency via get_mbus_config
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 1/9] media: v4l: Support passing media pad argument to v4l2_get_link_freq() Sakari Ailus
@ 2025-01-19 14:38 ` Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 3/9] media: Documentation: Update link frequency driver documentation Sakari Ailus
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:38 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Add link_freq field to struct v4l2_mbus_config in order to pass the link
frequency to the receiving sub-device.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/media/v4l2-core/v4l2-common.c | 15 +++++++++++++--
 include/media/v4l2-mediabus.h         |  2 ++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c
index 9fe74c7e064f..e4b2de3833ee 100644
--- a/drivers/media/v4l2-core/v4l2-common.c
+++ b/drivers/media/v4l2-core/v4l2-common.c
@@ -508,12 +508,23 @@ EXPORT_SYMBOL_GPL(__v4l2_get_link_freq_ctrl);
 s64 __v4l2_get_link_freq_pad(struct media_pad *pad, unsigned int mul,
 			     unsigned int div)
 {
+	struct v4l2_mbus_config mbus_config = {};
 	struct v4l2_subdev *sd;
+	int ret;
 
 	sd = media_entity_to_v4l2_subdev(pad->entity);
-	if (!sd)
-		return -ENODEV;
+	ret = v4l2_subdev_call(sd, pad, get_mbus_config, pad->index,
+			       &mbus_config);
+	if (ret < 0 && ret != -ENOIOCTLCMD)
+		return ret;
+
+	if (mbus_config.link_freq)
+		return mbus_config.link_freq;
 
+	/*
+	 * Fall back to using the link frequency control if the media bus config
+	 * doesn't provide a link frequency.
+	 */
 	return __v4l2_get_link_freq_ctrl(sd->ctrl_handler, mul, div);
 }
 EXPORT_SYMBOL_GPL(__v4l2_get_link_freq_pad);
diff --git a/include/media/v4l2-mediabus.h b/include/media/v4l2-mediabus.h
index e7f019f68c8d..24c738cd7894 100644
--- a/include/media/v4l2-mediabus.h
+++ b/include/media/v4l2-mediabus.h
@@ -169,6 +169,7 @@ enum v4l2_mbus_type {
 /**
  * struct v4l2_mbus_config - media bus configuration
  * @type: interface type
+ * @link_freq: The link frequency. See also V4L2_CID_LINK_FREQ control.
  * @bus: bus configuration data structure
  * @bus.parallel: embedded &struct v4l2_mbus_config_parallel.
  *		  Used if the bus is parallel or BT.656.
@@ -183,6 +184,7 @@ enum v4l2_mbus_type {
  */
 struct v4l2_mbus_config {
 	enum v4l2_mbus_type type;
+	u64 link_freq;
 	union {
 		struct v4l2_mbus_config_parallel parallel;
 		struct v4l2_mbus_config_mipi_csi1 mipi_csi1;
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 3/9] media: Documentation: Update link frequency driver documentation
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 1/9] media: v4l: Support passing media pad argument to v4l2_get_link_freq() Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 2/9] media: v4l: Support obtaining link frequency via get_mbus_config Sakari Ailus
@ 2025-01-19 14:38 ` Sakari Ailus
  2025-01-19 14:38 ` [PATCH v9 4/9] media: Documentation: tx-rx: Move transmitter control out of CSI-2 part Sakari Ailus
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:38 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Add the get_mbus_config() as the means for conveying the link frequency
towards the receiver drivers.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 Documentation/driver-api/media/tx-rx.rst | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/driver-api/media/tx-rx.rst b/Documentation/driver-api/media/tx-rx.rst
index c71003f74b1c..6f9eba189a9f 100644
--- a/Documentation/driver-api/media/tx-rx.rst
+++ b/Documentation/driver-api/media/tx-rx.rst
@@ -49,6 +49,10 @@ Link frequency
 The :ref:`V4L2_CID_LINK_FREQ <v4l2-cid-link-freq>` control is used to tell the
 receiver the frequency of the bus (i.e. it is not the same as the symbol rate).
 
+Drivers that do not have user-configurable link frequency should report it
+through the ``.get_mbus_config()`` subdev pad operation, in the ``link_freq``
+field of struct v4l2_mbus_config, instead of through controls.
+
 ``.enable_streams()`` and ``.disable_streams()`` callbacks
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 4/9] media: Documentation: tx-rx: Move transmitter control out of CSI-2 part
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
                   ` (2 preceding siblings ...)
  2025-01-19 14:38 ` [PATCH v9 3/9] media: Documentation: Update link frequency driver documentation Sakari Ailus
@ 2025-01-19 14:38 ` Sakari Ailus
  2025-01-19 14:39 ` [PATCH v9 5/9] media: Documentation: Receiver drivers should call v4l2_get_link_freq() Sakari Ailus
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:38 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

The subsection on stopping the transmitter belongs to the generic part and
is not specific to CSI-2. Move it out of the CSI-2 section.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 Documentation/driver-api/media/tx-rx.rst | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/Documentation/driver-api/media/tx-rx.rst b/Documentation/driver-api/media/tx-rx.rst
index 6f9eba189a9f..03768e5aa88f 100644
--- a/Documentation/driver-api/media/tx-rx.rst
+++ b/Documentation/driver-api/media/tx-rx.rst
@@ -62,6 +62,15 @@ to control the transmitter driver's streaming state. These callbacks may not be
 called directly, but by using ``v4l2_subdev_enable_streams()`` and
 ``v4l2_subdev_disable_streams()``.
 
+Stopping the transmitter
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+A transmitter stops sending the stream of images as a result of
+calling the ``.disable_streams()`` callback. Some transmitters may stop the
+stream at a frame boundary whereas others stop immediately,
+effectively leaving the current frame unfinished. The receiver driver
+should not make assumptions either way, but function properly in both
+cases.
 
 CSI-2 transmitter drivers
 -------------------------
@@ -130,13 +139,3 @@ device, so this should be only done when it is needed.
 
 Receiver drivers that do not need explicit LP-11 or LP-111 state setup are
 waived from calling the two callbacks.
-
-Stopping the transmitter
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-A transmitter stops sending the stream of images as a result of
-calling the ``.disable_streams()`` callback. Some transmitters may stop the
-stream at a frame boundary whereas others stop immediately,
-effectively leaving the current frame unfinished. The receiver driver
-should not make assumptions either way, but function properly in both
-cases.
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 5/9] media: Documentation: Receiver drivers should call v4l2_get_link_freq()
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
                   ` (3 preceding siblings ...)
  2025-01-19 14:38 ` [PATCH v9 4/9] media: Documentation: tx-rx: Move transmitter control out of CSI-2 part Sakari Ailus
@ 2025-01-19 14:39 ` Sakari Ailus
  2025-01-19 14:39 ` [PATCH v9 6/9] media: v4l: Memset argument to 0 before calling get_mbus_config pad op Sakari Ailus
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:39 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Document that receiver drivers should call v4l2_get_link_freq() to obtain
the link frequency.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 Documentation/driver-api/media/tx-rx.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/driver-api/media/tx-rx.rst b/Documentation/driver-api/media/tx-rx.rst
index 03768e5aa88f..0b8c9cde8ee4 100644
--- a/Documentation/driver-api/media/tx-rx.rst
+++ b/Documentation/driver-api/media/tx-rx.rst
@@ -53,6 +53,9 @@ Drivers that do not have user-configurable link frequency should report it
 through the ``.get_mbus_config()`` subdev pad operation, in the ``link_freq``
 field of struct v4l2_mbus_config, instead of through controls.
 
+Receiver drivers should use :c:func:`v4l2_get_link_freq` helper to obtain the
+link frequency from the transmitter sub-device.
+
 ``.enable_streams()`` and ``.disable_streams()`` callbacks
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 6/9] media: v4l: Memset argument to 0 before calling get_mbus_config pad op
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
                   ` (4 preceding siblings ...)
  2025-01-19 14:39 ` [PATCH v9 5/9] media: Documentation: Receiver drivers should call v4l2_get_link_freq() Sakari Ailus
@ 2025-01-19 14:39 ` Sakari Ailus
  2025-01-19 14:39 ` [PATCH v9 7/9] media: intel/ipu6: Obtain link frequency from the remote subdev pad Sakari Ailus
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:39 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Memset the config argument to get_mbus_config V4L2 sub-device pad
operation to zero before calling the operation. This ensures the callers
don't need to bother with it nor the implementations need to set all
fields that may not be relevant to them.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/media/v4l2-core/v4l2-subdev.c | 2 ++
 include/media/v4l2-subdev.h           | 4 +++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
index cde1774c9098..a3074f469b15 100644
--- a/drivers/media/v4l2-core/v4l2-subdev.c
+++ b/drivers/media/v4l2-core/v4l2-subdev.c
@@ -444,6 +444,8 @@ static int call_enum_dv_timings(struct v4l2_subdev *sd,
 static int call_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
 				struct v4l2_mbus_config *config)
 {
+	memset(config, 0, sizeof(*config));
+
 	return check_pad(sd, pad) ? :
 	       sd->ops->pad->get_mbus_config(sd, pad, config);
 }
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 2f2200875b03..57f2bcb4eb16 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -822,7 +822,9 @@ struct v4l2_subdev_state {
  *		     possible configuration from the remote end, likely calling
  *		     this operation as close as possible to stream on time. The
  *		     operation shall fail if the pad index it has been called on
- *		     is not valid or in case of unrecoverable failures.
+ *		     is not valid or in case of unrecoverable failures. The
+ *		     config argument has been memset to 0 just before calling
+ *		     the op.
  *
  * @set_routing: Enable or disable data connection routes described in the
  *		 subdevice routing table. Subdevs that implement this operation
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 7/9] media: intel/ipu6: Obtain link frequency from the remote subdev pad
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
                   ` (5 preceding siblings ...)
  2025-01-19 14:39 ` [PATCH v9 6/9] media: v4l: Memset argument to 0 before calling get_mbus_config pad op Sakari Ailus
@ 2025-01-19 14:39 ` Sakari Ailus
  2025-01-19 14:39 ` [PATCH v9 8/9] media: ivsc: csi: Obtain link frequency from the media pad Sakari Ailus
  2025-01-19 14:39 ` [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad Sakari Ailus
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:39 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Obtain the link frequency from the sub-device's pad instead of a control
handler. This allows obtaining it using the get_mbus_config() sub-device
pad op which is the only method supported by the IVSC driver.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 051898ce53f4..da8581a37e22 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -80,25 +80,19 @@ static const struct ipu6_csi2_error dphy_rx_errors[] = {
 s64 ipu6_isys_csi2_get_link_freq(struct ipu6_isys_csi2 *csi2)
 {
 	struct media_pad *src_pad;
-	struct v4l2_subdev *ext_sd;
-	struct device *dev;
 
 	if (!csi2)
 		return -EINVAL;
 
-	dev = &csi2->isys->adev->auxdev.dev;
 	src_pad = media_entity_remote_source_pad_unique(&csi2->asd.sd.entity);
 	if (IS_ERR(src_pad)) {
-		dev_err(dev, "can't get source pad of %s (%ld)\n",
+		dev_err(&csi2->isys->adev->auxdev.dev,
+			"can't get source pad of %s (%ld)\n",
 			csi2->asd.sd.name, PTR_ERR(src_pad));
 		return PTR_ERR(src_pad);
 	}
 
-	ext_sd = media_entity_to_v4l2_subdev(src_pad->entity);
-	if (WARN(!ext_sd, "Failed to get subdev for %s\n", csi2->asd.sd.name))
-		return -ENODEV;
-
-	return v4l2_get_link_freq(ext_sd->ctrl_handler, 0, 0);
+	return v4l2_get_link_freq(src_pad, 0, 0);
 }
 
 static int csi2_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 8/9] media: ivsc: csi: Obtain link frequency from the media pad
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
                   ` (6 preceding siblings ...)
  2025-01-19 14:39 ` [PATCH v9 7/9] media: intel/ipu6: Obtain link frequency from the remote subdev pad Sakari Ailus
@ 2025-01-19 14:39 ` Sakari Ailus
  2025-01-19 14:39 ` [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad Sakari Ailus
  8 siblings, 0 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:39 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Support the use of the media pad for obtaining the link frequency.
Similarly, call the v4l2_get_link_freq() on the media pad, not on the
remote's control handler.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 drivers/media/pci/intel/ivsc/mei_csi.c | 78 +++++++++-----------------
 1 file changed, 26 insertions(+), 52 deletions(-)

diff --git a/drivers/media/pci/intel/ivsc/mei_csi.c b/drivers/media/pci/intel/ivsc/mei_csi.c
index 2a9c12c975ca..545de4654609 100644
--- a/drivers/media/pci/intel/ivsc/mei_csi.c
+++ b/drivers/media/pci/intel/ivsc/mei_csi.c
@@ -35,8 +35,6 @@
 
 #define MEI_CSI_ENTITY_NAME "Intel IVSC CSI"
 
-#define MEI_CSI_LINK_FREQ_400MHZ 400000000ULL
-
 /* the 5s used here is based on experiment */
 #define CSI_CMD_TIMEOUT (5 * HZ)
 /* to setup CSI-2 link an extra delay needed and determined experimentally */
@@ -121,14 +119,13 @@ struct mei_csi {
 	struct mutex lock;
 
 	struct v4l2_subdev subdev;
-	struct v4l2_subdev *remote;
+	struct media_pad *remote;
 	struct v4l2_async_notifier notifier;
 	struct v4l2_ctrl_handler ctrl_handler;
 	struct v4l2_ctrl *freq_ctrl;
 	struct v4l2_ctrl *privacy_ctrl;
 	/* lock for v4l2 controls */
 	struct mutex ctrl_lock;
-	unsigned int remote_pad;
 	/* start streaming or not */
 	int streaming;
 
@@ -147,10 +144,6 @@ static const struct v4l2_mbus_framefmt mei_csi_format_mbus_default = {
 	.field = V4L2_FIELD_NONE,
 };
 
-static s64 link_freq_menu_items[] = {
-	MEI_CSI_LINK_FREQ_400MHZ
-};
-
 static inline struct mei_csi *notifier_to_csi(struct v4l2_async_notifier *n)
 {
 	return container_of(n, struct mei_csi, notifier);
@@ -161,11 +154,6 @@ static inline struct mei_csi *sd_to_csi(struct v4l2_subdev *sd)
 	return container_of(sd, struct mei_csi, subdev);
 }
 
-static inline struct mei_csi *ctrl_to_csi(struct v4l2_ctrl *ctrl)
-{
-	return container_of(ctrl->handler, struct mei_csi, ctrl_handler);
-}
-
 /* send a command to firmware and mutex must be held by caller */
 static int mei_csi_send(struct mei_csi *csi, u8 *buf, size_t len)
 {
@@ -286,11 +274,13 @@ static void mei_csi_rx(struct mei_cl_device *cldev)
 static int mei_csi_set_stream(struct v4l2_subdev *sd, int enable)
 {
 	struct mei_csi *csi = sd_to_csi(sd);
+	struct v4l2_subdev *remote_sd =
+		media_entity_to_v4l2_subdev(csi->remote->entity);
 	s64 freq;
 	int ret;
 
 	if (enable && csi->streaming == 0) {
-		freq = v4l2_get_link_freq(csi->remote->ctrl_handler, 0, 0);
+		freq = v4l2_get_link_freq(csi->remote, 0, 0);
 		if (freq < 0) {
 			dev_err(&csi->cldev->dev,
 				"error %lld, invalid link_freq\n", freq);
@@ -309,11 +299,11 @@ static int mei_csi_set_stream(struct v4l2_subdev *sd, int enable)
 		if (ret < 0)
 			goto err_switch;
 
-		ret = v4l2_subdev_call(csi->remote, video, s_stream, 1);
+		ret = v4l2_subdev_call(remote_sd, video, s_stream, 1);
 		if (ret)
 			goto err_switch;
 	} else if (!enable && csi->streaming == 1) {
-		v4l2_subdev_call(csi->remote, video, s_stream, 0);
+		v4l2_subdev_call(remote_sd, video, s_stream, 0);
 
 		/* switch CSI-2 link to IVSC */
 		ret = csi_set_link_owner(csi, CSI_LINK_IVSC);
@@ -470,34 +460,30 @@ static int mei_csi_set_fmt(struct v4l2_subdev *sd,
 	return 0;
 }
 
-static int mei_csi_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
+static int mei_csi_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
+				   struct v4l2_mbus_config *mbus_config)
 {
-	struct mei_csi *csi = ctrl_to_csi(ctrl);
+	struct mei_csi *csi = sd_to_csi(sd);
+	unsigned int i;
 	s64 freq;
 
-	if (ctrl->id == V4L2_CID_LINK_FREQ) {
-		if (!csi->remote)
-			return -EINVAL;
+	mbus_config->type = V4L2_MBUS_CSI2_DPHY;
+	for (i = 0; i < V4L2_MBUS_CSI2_MAX_DATA_LANES; i++)
+		mbus_config->bus.mipi_csi2.data_lanes[i] = i + 1;
+	mbus_config->bus.mipi_csi2.num_data_lanes = csi->nr_of_lanes;
 
-		freq = v4l2_get_link_freq(csi->remote->ctrl_handler, 0, 0);
-		if (freq < 0) {
-			dev_err(&csi->cldev->dev,
-				"error %lld, invalid link_freq\n", freq);
-			return -EINVAL;
-		}
-
-		link_freq_menu_items[0] = freq;
-		ctrl->val = 0;
-
-		return 0;
+	freq = v4l2_get_link_freq(csi->remote, 0, 0);
+	if (freq < 0) {
+		dev_err(&csi->cldev->dev,
+			"error %lld, invalid link_freq\n", freq);
+		return -EINVAL;
 	}
 
-	return -EINVAL;
-}
+	csi->link_freq = freq;
+	mbus_config->link_freq = freq;
 
-static const struct v4l2_ctrl_ops mei_csi_ctrl_ops = {
-	.g_volatile_ctrl = mei_csi_g_volatile_ctrl,
-};
+	return 0;
+}
 
 static const struct v4l2_subdev_video_ops mei_csi_video_ops = {
 	.s_stream = mei_csi_set_stream,
@@ -506,6 +492,7 @@ static const struct v4l2_subdev_video_ops mei_csi_video_ops = {
 static const struct v4l2_subdev_pad_ops mei_csi_pad_ops = {
 	.get_fmt = v4l2_subdev_get_fmt,
 	.set_fmt = mei_csi_set_fmt,
+	.get_mbus_config = mei_csi_get_mbus_config,
 };
 
 static const struct v4l2_subdev_ops mei_csi_subdev_ops = {
@@ -533,8 +520,7 @@ static int mei_csi_notify_bound(struct v4l2_async_notifier *notifier,
 	if (pad < 0)
 		return pad;
 
-	csi->remote = subdev;
-	csi->remote_pad = pad;
+	csi->remote = &subdev->entity.pads[pad];
 
 	return media_create_pad_link(&subdev->entity, pad,
 				     &csi->subdev.entity, CSI_PAD_SINK,
@@ -558,28 +544,16 @@ static const struct v4l2_async_notifier_operations mei_csi_notify_ops = {
 
 static int mei_csi_init_controls(struct mei_csi *csi)
 {
-	u32 max;
 	int ret;
 
 	mutex_init(&csi->ctrl_lock);
 
-	ret = v4l2_ctrl_handler_init(&csi->ctrl_handler, 2);
+	ret = v4l2_ctrl_handler_init(&csi->ctrl_handler, 1);
 	if (ret)
 		return ret;
 
 	csi->ctrl_handler.lock = &csi->ctrl_lock;
 
-	max = ARRAY_SIZE(link_freq_menu_items) - 1;
-	csi->freq_ctrl = v4l2_ctrl_new_int_menu(&csi->ctrl_handler,
-						&mei_csi_ctrl_ops,
-						V4L2_CID_LINK_FREQ,
-						max,
-						0,
-						link_freq_menu_items);
-	if (csi->freq_ctrl)
-		csi->freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY |
-					 V4L2_CTRL_FLAG_VOLATILE;
-
 	csi->privacy_ctrl = v4l2_ctrl_new_std(&csi->ctrl_handler, NULL,
 					      V4L2_CID_PRIVACY, 0, 1, 1, 0);
 	if (csi->privacy_ctrl)
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
  2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
                   ` (7 preceding siblings ...)
  2025-01-19 14:39 ` [PATCH v9 8/9] media: ivsc: csi: Obtain link frequency from the media pad Sakari Ailus
@ 2025-01-19 14:39 ` Sakari Ailus
  2025-01-19 17:46   ` kernel test robot
                     ` (2 more replies)
  8 siblings, 3 replies; 13+ messages in thread
From: Sakari Ailus @ 2025-01-19 14:39 UTC (permalink / raw)
  To: linux-media
  Cc: Benjamin Mugnier, Sylvain Petinot, Yong Zhi, Dan Scally,
	Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao, Tianshu Qiu,
	Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Call v4l2_get_link_freq() on a pad, instead of a control handler. This way
we can soon convert v4l2_get_link_freq() to be callable only on a pad and
remove the compatibility code.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Naushir Patuck <naush@raspberrypi.com> # rp1-cfe
Acked-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com> # st-mipid02
---
 drivers/media/i2c/st-mipid02.c                |  5 ++--
 drivers/media/i2c/tc358746.c                  |  4 ++-
 drivers/media/pci/intel/ipu3/ipu3-cio2.c      | 11 +++++---
 drivers/media/platform/cadence/cdns-csi2rx.c  |  4 ++-
 drivers/media/platform/nxp/imx-mipi-csis.c    |  5 ++--
 drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 11 ++++++--
 .../media/platform/qcom/camss/camss-vfe-17x.c |  9 ++++---
 .../platform/qcom/camss/camss-vfe-gen1.c      |  9 ++++---
 drivers/media/platform/qcom/camss/camss.c     | 27 +++++++++----------
 drivers/media/platform/qcom/camss/camss.h     |  2 +-
 .../media/platform/raspberrypi/rp1-cfe/cfe.c  |  4 ++-
 drivers/media/platform/st/stm32/stm32-csi.c   |  4 ++-
 drivers/media/platform/ti/cal/cal-camerarx.c  |  3 ++-
 drivers/media/platform/ti/cal/cal.c           |  4 ++-
 drivers/media/platform/ti/cal/cal.h           |  1 +
 15 files changed, 64 insertions(+), 39 deletions(-)

diff --git a/drivers/media/i2c/st-mipid02.c b/drivers/media/i2c/st-mipid02.c
index f08db3cfe076..f4568e87f018 100644
--- a/drivers/media/i2c/st-mipid02.c
+++ b/drivers/media/i2c/st-mipid02.c
@@ -301,8 +301,9 @@ static int mipid02_detect(struct mipid02_dev *bridge)
 static int mipid02_configure_from_rx_speed(struct mipid02_dev *bridge,
 					   struct v4l2_mbus_framefmt *fmt)
 {
+	struct media_pad *remote =
+		&bridge->s_subdev->entity.pads[bridge->s_subdev_pad_id];
 	struct i2c_client *client = bridge->i2c_client;
-	struct v4l2_subdev *subdev = bridge->s_subdev;
 	struct v4l2_fwnode_endpoint *ep = &bridge->rx;
 	u32 bpp = bpp_from_code(fmt->code);
 	/*
@@ -312,7 +313,7 @@ static int mipid02_configure_from_rx_speed(struct mipid02_dev *bridge,
 	u64 ui_4 = 2000000000;
 	s64 link_freq;
 
-	link_freq = v4l2_get_link_freq(subdev->ctrl_handler, bpp,
+	link_freq = v4l2_get_link_freq(remote, bpp,
 				       2 * ep->bus.mipi_csi2.num_data_lanes);
 	if (link_freq < 0) {
 		dev_err(&client->dev, "Failed to get link frequency");
diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c
index 389582420ba7..31586f8e4be4 100644
--- a/drivers/media/i2c/tc358746.c
+++ b/drivers/media/i2c/tc358746.c
@@ -896,6 +896,7 @@ tc358746_link_validate(struct v4l2_subdev *sd, struct media_link *link,
 	const struct tc358746_format *fmt;
 	unsigned int fifo_sz, tmp, n;
 	struct v4l2_subdev *source;
+	struct media_pad *src_pad;
 	s64 source_link_freq;
 	int err;
 
@@ -910,7 +911,8 @@ tc358746_link_validate(struct v4l2_subdev *sd, struct media_link *link,
 	fmt = tc358746_get_format_by_code(TC358746_SINK, mbusfmt->code);
 
 	source = media_entity_to_v4l2_subdev(link->source->entity);
-	source_link_freq = v4l2_get_link_freq(source->ctrl_handler, 0, 0);
+	src_pad = &source->entity.pads[source_fmt->pad];
+	source_link_freq = v4l2_get_link_freq(src_pad, 0, 0);
 	if (source_link_freq <= 0) {
 		dev_err(tc358746->sd.dev,
 			"Failed to query or invalid source link frequency\n");
diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2.c b/drivers/media/pci/intel/ipu3/ipu3-cio2.c
index 4e98f432ed55..7731eb70fc8e 100644
--- a/drivers/media/pci/intel/ipu3/ipu3-cio2.c
+++ b/drivers/media/pci/intel/ipu3/ipu3-cio2.c
@@ -309,12 +309,17 @@ static int cio2_csi2_calc_timing(struct cio2_device *cio2, struct cio2_queue *q,
 				 unsigned int bpp, unsigned int lanes)
 {
 	struct device *dev = &cio2->pci_dev->dev;
+	struct media_pad *src_pad;
 	s64 freq;
 
-	if (!q->sensor)
-		return -ENODEV;
+	src_pad = media_entity_remote_source_pad_unique(&q->subdev.entity);
+	if (IS_ERR(src_pad)) {
+		dev_err(dev, "can't get source pad of %s (%ld)\n",
+			q->subdev.name, PTR_ERR(src_pad));
+		return PTR_ERR(src_pad);
+	}
 
-	freq = v4l2_get_link_freq(q->sensor->ctrl_handler, bpp, lanes * 2);
+	freq = v4l2_get_link_freq(src_pad, bpp, lanes * 2);
 	if (freq < 0) {
 		dev_err(dev, "error %lld, invalid link_freq\n", freq);
 		return freq;
diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
index 4d64df829e75..cebcae196eec 100644
--- a/drivers/media/platform/cadence/cdns-csi2rx.c
+++ b/drivers/media/platform/cadence/cdns-csi2rx.c
@@ -164,6 +164,8 @@ static void csi2rx_reset(struct csi2rx_priv *csi2rx)
 
 static int csi2rx_configure_ext_dphy(struct csi2rx_priv *csi2rx)
 {
+	struct media_pad *src_pad =
+		&csi2rx->source_subdev->entity.pads[csi2rx->source_pad];
 	union phy_configure_opts opts = { };
 	struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
 	struct v4l2_subdev_format sd_fmt = {
@@ -181,7 +183,7 @@ static int csi2rx_configure_ext_dphy(struct csi2rx_priv *csi2rx)
 
 	fmt = csi2rx_get_fmt_by_code(sd_fmt.format.code);
 
-	link_freq = v4l2_get_link_freq(csi2rx->source_subdev->ctrl_handler,
+	link_freq = v4l2_get_link_freq(src_pad,
 				       fmt->bpp, 2 * csi2rx->num_lanes);
 	if (link_freq < 0)
 		return link_freq;
diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
index 29523bb84d95..d060eadebc7a 100644
--- a/drivers/media/platform/nxp/imx-mipi-csis.c
+++ b/drivers/media/platform/nxp/imx-mipi-csis.c
@@ -597,12 +597,13 @@ static void __mipi_csis_set_format(struct mipi_csis_device *csis,
 static int mipi_csis_calculate_params(struct mipi_csis_device *csis,
 				      const struct csis_pix_format *csis_fmt)
 {
+	struct media_pad *src_pad =
+		&csis->source.sd->entity.pads[csis->source.pad->index];
 	s64 link_freq;
 	u32 lane_rate;
 
 	/* Calculate the line rate from the pixel rate. */
-	link_freq = v4l2_get_link_freq(csis->source.sd->ctrl_handler,
-				       csis_fmt->width,
+	link_freq = v4l2_get_link_freq(src_pad, csis_fmt->width,
 				       csis->bus.num_data_lanes * 2);
 	if (link_freq < 0) {
 		dev_err(csis->dev, "Unable to obtain link frequency: %d\n",
diff --git a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
index 1f2657cf6e82..a8bcf60e2f37 100644
--- a/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
+++ b/drivers/media/platform/nxp/imx8mq-mipi-csi2.c
@@ -287,6 +287,7 @@ static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state,
 					  struct v4l2_subdev_state *sd_state,
 					  u32 *hs_settle)
 {
+	struct media_pad *src_pad;
 	s64 link_freq;
 	u32 lane_rate;
 	unsigned long esc_clk_rate;
@@ -294,13 +295,19 @@ static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state,
 	const struct v4l2_mbus_framefmt *fmt;
 	const struct csi2_pix_format *csi2_fmt;
 
+	src_pad = media_entity_remote_source_pad_unique(&sd_state->sd->entity);
+	if (IS_ERR(src_pad)) {
+		dev_err(state->dev, "can't get source pad of %s (%ld)\n",
+			sd_state->sd->name, PTR_ERR(src_pad));
+		return PTR_ERR(src_pad);
+	}
+
 	/* Calculate the line rate from the pixel rate. */
 
 	fmt = v4l2_subdev_state_get_format(sd_state, MIPI_CSI2_PAD_SINK);
 	csi2_fmt = find_csi2_format(fmt->code);
 
-	link_freq = v4l2_get_link_freq(state->src_sd->ctrl_handler,
-				       csi2_fmt->width,
+	link_freq = v4l2_get_link_freq(src_pad, csi2_fmt->width,
 				       state->bus.num_data_lanes * 2);
 	if (link_freq < 0) {
 		dev_err(state->dev, "Unable to obtain link frequency: %d\n",
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-17x.c b/drivers/media/platform/qcom/camss/camss-vfe-17x.c
index 380c99321030..b8af019f2f45 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-17x.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-17x.c
@@ -443,14 +443,15 @@ static int vfe_enable_output(struct vfe_line *line)
 	struct vfe_device *vfe = to_vfe(line);
 	struct vfe_output *output = &line->output;
 	const struct vfe_hw_ops *ops = vfe->res->hw_ops;
-	struct media_entity *sensor;
+	struct media_pad *sensor_pad;
 	unsigned long flags;
 	unsigned int frame_skip = 0;
 	unsigned int i;
 
-	sensor = camss_find_sensor(&line->subdev.entity);
-	if (sensor) {
-		struct v4l2_subdev *subdev = media_entity_to_v4l2_subdev(sensor);
+	sensor_pad = camss_find_sensor_pad(&line->subdev.entity);
+	if (sensor_pad) {
+		struct v4l2_subdev *subdev =
+			media_entity_to_v4l2_subdev(sensor_pad->entity);
 
 		v4l2_subdev_call(subdev, sensor, g_skip_frames, &frame_skip);
 		/* Max frame skip is 29 frames */
diff --git a/drivers/media/platform/qcom/camss/camss-vfe-gen1.c b/drivers/media/platform/qcom/camss/camss-vfe-gen1.c
index eb33c03df27e..d84a375e3318 100644
--- a/drivers/media/platform/qcom/camss/camss-vfe-gen1.c
+++ b/drivers/media/platform/qcom/camss/camss-vfe-gen1.c
@@ -170,7 +170,7 @@ static int vfe_enable_output(struct vfe_line *line)
 	struct vfe_device *vfe = to_vfe(line);
 	struct vfe_output *output = &line->output;
 	const struct vfe_hw_ops *ops = vfe->res->hw_ops;
-	struct media_entity *sensor;
+	struct media_pad *sensor_pad;
 	unsigned long flags;
 	unsigned int frame_skip = 0;
 	unsigned int i;
@@ -180,9 +180,10 @@ static int vfe_enable_output(struct vfe_line *line)
 	if (!ub_size)
 		return -EINVAL;
 
-	sensor = camss_find_sensor(&line->subdev.entity);
-	if (sensor) {
-		struct v4l2_subdev *subdev = media_entity_to_v4l2_subdev(sensor);
+	sensor_pad = camss_find_sensor_pad(&line->subdev.entity);
+	if (sensor_pad) {
+		struct v4l2_subdev *subdev =
+			media_entity_to_v4l2_subdev(sensor_pad->entity);
 
 		v4l2_subdev_call(subdev, sensor, g_skip_frames, &frame_skip);
 		/* Max frame skip is 29 frames */
diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
index a85e9df0f301..f9bbbbc6a004 100644
--- a/drivers/media/platform/qcom/camss/camss.c
+++ b/drivers/media/platform/qcom/camss/camss.c
@@ -1996,12 +1996,12 @@ void camss_disable_clocks(int nclocks, struct camss_clock *clock)
 }
 
 /*
- * camss_find_sensor - Find a linked media entity which represents a sensor
+ * camss_find_sensor_pad - Find the media pad via which the sensor is linked
  * @entity: Media entity to start searching from
  *
- * Return a pointer to sensor media entity or NULL if not found
+ * Return a pointer to sensor media pad or NULL if not found
  */
-struct media_entity *camss_find_sensor(struct media_entity *entity)
+struct media_pad *camss_find_sensor_pad(struct media_entity *entity)
 {
 	struct media_pad *pad;
 
@@ -2017,7 +2017,7 @@ struct media_entity *camss_find_sensor(struct media_entity *entity)
 		entity = pad->entity;
 
 		if (entity->function == MEDIA_ENT_F_CAM_SENSOR)
-			return entity;
+			return pad;
 	}
 }
 
@@ -2032,16 +2032,13 @@ struct media_entity *camss_find_sensor(struct media_entity *entity)
 s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp,
 			unsigned int lanes)
 {
-	struct media_entity *sensor;
-	struct v4l2_subdev *subdev;
+	struct media_pad *sensor_pad;
 
-	sensor = camss_find_sensor(entity);
-	if (!sensor)
+	sensor_pad = camss_find_sensor_pad(entity);
+	if (!sensor_pad)
 		return -ENODEV;
 
-	subdev = media_entity_to_v4l2_subdev(sensor);
-
-	return v4l2_get_link_freq(subdev->ctrl_handler, bpp, 2 * lanes);
+	return v4l2_get_link_freq(sensor_pad, bpp, 2 * lanes);
 }
 
 /*
@@ -2053,15 +2050,15 @@ s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp,
  */
 int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock)
 {
-	struct media_entity *sensor;
+	struct media_pad *sensor;
 	struct v4l2_subdev *subdev;
 	struct v4l2_ctrl *ctrl;
 
-	sensor = camss_find_sensor(entity);
-	if (!sensor)
+	sensor_pad = camss_find_sensor_pad(entity);
+	if (!sensor_pad)
 		return -ENODEV;
 
-	subdev = media_entity_to_v4l2_subdev(sensor);
+	subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
 
 	ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_PIXEL_RATE);
 
diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h
index 9a046eea334f..f912a58ae070 100644
--- a/drivers/media/platform/qcom/camss/camss.h
+++ b/drivers/media/platform/qcom/camss/camss.h
@@ -153,7 +153,7 @@ void camss_add_clock_margin(u64 *rate);
 int camss_enable_clocks(int nclocks, struct camss_clock *clock,
 			struct device *dev);
 void camss_disable_clocks(int nclocks, struct camss_clock *clock);
-struct media_entity *camss_find_sensor(struct media_entity *entity);
+struct media_pad *camss_find_sensor_pad(struct media_entity *entity);
 s64 camss_get_link_freq(struct media_entity *entity, unsigned int bpp,
 			unsigned int lanes);
 int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock);
diff --git a/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c b/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c
index 12660087b12f..ed3d18917f2d 100644
--- a/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c
+++ b/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c
@@ -1102,6 +1102,8 @@ static void cfe_buffer_queue(struct vb2_buffer *vb)
 
 static s64 cfe_get_source_link_freq(struct cfe_device *cfe)
 {
+	struct media_pad *src_pad =
+		&cfe->source_sd->entity.pads[cfe->source_pad];
 	struct v4l2_subdev_state *state;
 	s64 link_freq;
 	u32 bpp;
@@ -1136,7 +1138,7 @@ static s64 cfe_get_source_link_freq(struct cfe_device *cfe)
 		bpp = 0;
 	}
 
-	link_freq = v4l2_get_link_freq(cfe->source_sd->ctrl_handler, bpp,
+	link_freq = v4l2_get_link_freq(src_pad, bpp,
 				       2 * cfe->csi2.dphy.active_lanes);
 	if (link_freq < 0)
 		cfe_err(cfe, "failed to get link freq for subdev '%s'\n",
diff --git a/drivers/media/platform/st/stm32/stm32-csi.c b/drivers/media/platform/st/stm32/stm32-csi.c
index 48941aae8c9b..b25afeee4f24 100644
--- a/drivers/media/platform/st/stm32/stm32-csi.c
+++ b/drivers/media/platform/st/stm32/stm32-csi.c
@@ -444,6 +444,8 @@ static void stm32_csi_phy_reg_write(struct stm32_csi_dev *csidev,
 static int stm32_csi_start(struct stm32_csi_dev *csidev,
 			   struct v4l2_subdev_state *state)
 {
+	struct media_pad *src_pad =
+		&csidev->s_subdev->entity.pads[csidev->s_subdev_pad_nb];
 	const struct stm32_csi_mbps_phy_reg *phy_regs;
 	struct v4l2_mbus_framefmt *sink_fmt;
 	const struct stm32_csi_fmts *fmt;
@@ -465,7 +467,7 @@ static int stm32_csi_start(struct stm32_csi_dev *csidev,
 	if (!csidev->s_subdev)
 		return -EIO;
 
-	link_freq = v4l2_get_link_freq(csidev->s_subdev->ctrl_handler,
+	link_freq = v4l2_get_link_freq(src_pad,
 				       fmt->bpp, 2 * csidev->num_lanes);
 	if (link_freq < 0)
 		return link_freq;
diff --git a/drivers/media/platform/ti/cal/cal-camerarx.c b/drivers/media/platform/ti/cal/cal-camerarx.c
index 42dfe08b765f..9cc875665695 100644
--- a/drivers/media/platform/ti/cal/cal-camerarx.c
+++ b/drivers/media/platform/ti/cal/cal-camerarx.c
@@ -65,7 +65,8 @@ static s64 cal_camerarx_get_ext_link_freq(struct cal_camerarx *phy)
 
 	bpp = fmtinfo->bpp;
 
-	freq = v4l2_get_link_freq(phy->source->ctrl_handler, bpp, 2 * num_lanes);
+	freq = v4l2_get_link_freq(&phy->source->entity.pads[phy->source_pad],
+				  bpp, 2 * num_lanes);
 	if (freq < 0) {
 		phy_err(phy, "failed to get link freq for subdev '%s'\n",
 			phy->source->name);
diff --git a/drivers/media/platform/ti/cal/cal.c b/drivers/media/platform/ti/cal/cal.c
index 4bd2092e0255..6cb3e5f49686 100644
--- a/drivers/media/platform/ti/cal/cal.c
+++ b/drivers/media/platform/ti/cal/cal.c
@@ -798,7 +798,6 @@ static int cal_async_notifier_bound(struct v4l2_async_notifier *notifier,
 		return 0;
 	}
 
-	phy->source = subdev;
 	phy_dbg(1, phy, "Using source %s for capture\n", subdev->name);
 
 	pad = media_entity_get_fwnode_pad(&subdev->entity,
@@ -820,6 +819,9 @@ static int cal_async_notifier_bound(struct v4l2_async_notifier *notifier,
 		return ret;
 	}
 
+	phy->source = subdev;
+	phy->source_pad = pad;
+
 	return 0;
 }
 
diff --git a/drivers/media/platform/ti/cal/cal.h b/drivers/media/platform/ti/cal/cal.h
index 0856297adc0b..72a246a64d9e 100644
--- a/drivers/media/platform/ti/cal/cal.h
+++ b/drivers/media/platform/ti/cal/cal.h
@@ -174,6 +174,7 @@ struct cal_camerarx {
 	struct device_node	*source_ep_node;
 	struct device_node	*source_node;
 	struct v4l2_subdev	*source;
+	unsigned int		source_pad;
 
 	struct v4l2_subdev	subdev;
 	struct media_pad	pads[CAL_CAMERARX_NUM_PADS];
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
  2025-01-19 14:39 ` [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad Sakari Ailus
@ 2025-01-19 17:46   ` kernel test robot
  2025-01-19 18:17   ` kernel test robot
  2025-01-19 18:28   ` kernel test robot
  2 siblings, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-01-19 17:46 UTC (permalink / raw)
  To: Sakari Ailus, linux-media
  Cc: oe-kbuild-all, Benjamin Mugnier, Sylvain Petinot, Yong Zhi,
	Dan Scally, Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao,
	Tianshu Qiu, Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Hi Sakari,

kernel test robot noticed the following build errors:

[auto build test ERROR on c4b7779abc6633677e6edb79e2809f4f61fde157]

url:    https://github.com/intel-lab-lkp/linux/commits/Sakari-Ailus/media-v4l-Support-passing-media-pad-argument-to-v4l2_get_link_freq/20250119-224053
base:   c4b7779abc6633677e6edb79e2809f4f61fde157
patch link:    https://lore.kernel.org/r/20250119143904.114991-10-sakari.ailus%40linux.intel.com
patch subject: [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20250120/202501200100.zPV2fkA4-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250120/202501200100.zPV2fkA4-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501200100.zPV2fkA4-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/media/platform/qcom/camss/camss.c: In function 'camss_get_pixel_clock':
>> drivers/media/platform/qcom/camss/camss.c:2057:9: error: 'sensor_pad' undeclared (first use in this function); did you mean 'sensor'?
    2057 |         sensor_pad = camss_find_sensor_pad(entity);
         |         ^~~~~~~~~~
         |         sensor
   drivers/media/platform/qcom/camss/camss.c:2057:9: note: each undeclared identifier is reported only once for each function it appears in
   In file included from include/linux/container_of.h:5,
                    from include/linux/kernel.h:22,
                    from include/linux/clk.h:13,
                    from drivers/media/platform/qcom/camss/camss.c:10:
>> include/linux/container_of.h:20:35: error: invalid type argument of unary '*' (have 'int')
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                                   ^~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/container_of.h:21:35: error: invalid type argument of unary '*' (have 'int')
      21 |                       __same_type(*(ptr), void),                        \
         |                                   ^~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
      21 |                       __same_type(*(ptr), void),                        \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler_types.h:483:27: error: expression in static assertion is not an integer
     483 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2053:27: warning: unused variable 'sensor' [-Wunused-variable]
    2053 |         struct media_pad *sensor;
         |                           ^~~~~~
--
   camss.c: In function 'camss_get_pixel_clock':
   camss.c:2057:9: error: 'sensor_pad' undeclared (first use in this function); did you mean 'sensor'?
    2057 |         sensor_pad = camss_find_sensor_pad(entity);
         |         ^~~~~~~~~~
         |         sensor
   camss.c:2057:9: note: each undeclared identifier is reported only once for each function it appears in
   In file included from include/linux/container_of.h:5,
                    from include/linux/kernel.h:22,
                    from include/linux/clk.h:13,
                    from camss.c:10:
>> include/linux/container_of.h:20:35: error: invalid type argument of unary '*' (have 'int')
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                                   ^~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/container_of.h:21:35: error: invalid type argument of unary '*' (have 'int')
      21 |                       __same_type(*(ptr), void),                        \
         |                                   ^~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
      21 |                       __same_type(*(ptr), void),                        \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler_types.h:483:27: error: expression in static assertion is not an integer
     483 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   camss.c:2053:27: warning: unused variable 'sensor' [-Wunused-variable]
    2053 |         struct media_pad *sensor;
         |                           ^~~~~~


vim +2057 drivers/media/platform/qcom/camss/camss.c

  2043	
  2044	/*
  2045	 * camss_get_pixel_clock - Get pixel clock rate from sensor
  2046	 * @entity: Media entity in the current pipeline
  2047	 * @pixel_clock: Received pixel clock value
  2048	 *
  2049	 * Return 0 on success or a negative error code otherwise
  2050	 */
  2051	int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock)
  2052	{
  2053		struct media_pad *sensor;
  2054		struct v4l2_subdev *subdev;
  2055		struct v4l2_ctrl *ctrl;
  2056	
> 2057		sensor_pad = camss_find_sensor_pad(entity);
  2058		if (!sensor_pad)
  2059			return -ENODEV;
  2060	
  2061		subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
  2062	
  2063		ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_PIXEL_RATE);
  2064	
  2065		if (!ctrl)
  2066			return -EINVAL;
  2067	
  2068		*pixel_clock = v4l2_ctrl_g_ctrl_int64(ctrl);
  2069	
  2070		return 0;
  2071	}
  2072	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
  2025-01-19 14:39 ` [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad Sakari Ailus
  2025-01-19 17:46   ` kernel test robot
@ 2025-01-19 18:17   ` kernel test robot
  2025-01-19 18:28   ` kernel test robot
  2 siblings, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-01-19 18:17 UTC (permalink / raw)
  To: Sakari Ailus, linux-media
  Cc: oe-kbuild-all, Benjamin Mugnier, Sylvain Petinot, Yong Zhi,
	Dan Scally, Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao,
	Tianshu Qiu, Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Hi Sakari,

kernel test robot noticed the following build warnings:

[auto build test WARNING on c4b7779abc6633677e6edb79e2809f4f61fde157]

url:    https://github.com/intel-lab-lkp/linux/commits/Sakari-Ailus/media-v4l-Support-passing-media-pad-argument-to-v4l2_get_link_freq/20250119-224053
base:   c4b7779abc6633677e6edb79e2809f4f61fde157
patch link:    https://lore.kernel.org/r/20250119143904.114991-10-sakari.ailus%40linux.intel.com
patch subject: [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
config: sh-allyesconfig (https://download.01.org/0day-ci/archive/20250120/202501200228.jk1X695m-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250120/202501200228.jk1X695m-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501200228.jk1X695m-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/media/platform/qcom/camss/camss.c: In function 'camss_get_pixel_clock':
   drivers/media/platform/qcom/camss/camss.c:2057:9: error: 'sensor_pad' undeclared (first use in this function); did you mean 'sensor'?
    2057 |         sensor_pad = camss_find_sensor_pad(entity);
         |         ^~~~~~~~~~
         |         sensor
   drivers/media/platform/qcom/camss/camss.c:2057:9: note: each undeclared identifier is reported only once for each function it appears in
   In file included from include/linux/container_of.h:5,
                    from include/linux/kernel.h:22,
                    from include/linux/clk.h:13,
                    from drivers/media/platform/qcom/camss/camss.c:10:
   include/linux/container_of.h:20:35: error: invalid type argument of unary '*' (have 'int')
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                                   ^~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/container_of.h:21:35: error: invalid type argument of unary '*' (have 'int')
      21 |                       __same_type(*(ptr), void),                        \
         |                                   ^~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
      21 |                       __same_type(*(ptr), void),                        \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler_types.h:483:27: error: expression in static assertion is not an integer
     483 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
      78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 'static_assert'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), ((type *)0)->member) ||       \
         |                       ^~~~~~~~~~~
   include/media/v4l2-subdev.h:1132:17: note: in expansion of macro 'container_of'
    1132 |                 container_of(__me_sd_ent, struct v4l2_subdev, entity) : \
         |                 ^~~~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2061:18: note: in expansion of macro 'media_entity_to_v4l2_subdev'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/platform/qcom/camss/camss.c:2053:27: warning: unused variable 'sensor' [-Wunused-variable]
    2053 |         struct media_pad *sensor;
         |                           ^~~~~~


vim +/sensor +2053 drivers/media/platform/qcom/camss/camss.c

  2043	
  2044	/*
  2045	 * camss_get_pixel_clock - Get pixel clock rate from sensor
  2046	 * @entity: Media entity in the current pipeline
  2047	 * @pixel_clock: Received pixel clock value
  2048	 *
  2049	 * Return 0 on success or a negative error code otherwise
  2050	 */
  2051	int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock)
  2052	{
> 2053		struct media_pad *sensor;
  2054		struct v4l2_subdev *subdev;
  2055		struct v4l2_ctrl *ctrl;
  2056	
  2057		sensor_pad = camss_find_sensor_pad(entity);
  2058		if (!sensor_pad)
  2059			return -ENODEV;
  2060	
  2061		subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
  2062	
  2063		ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_PIXEL_RATE);
  2064	
  2065		if (!ctrl)
  2066			return -EINVAL;
  2067	
  2068		*pixel_clock = v4l2_ctrl_g_ctrl_int64(ctrl);
  2069	
  2070		return 0;
  2071	}
  2072	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
  2025-01-19 14:39 ` [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad Sakari Ailus
  2025-01-19 17:46   ` kernel test robot
  2025-01-19 18:17   ` kernel test robot
@ 2025-01-19 18:28   ` kernel test robot
  2 siblings, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-01-19 18:28 UTC (permalink / raw)
  To: Sakari Ailus, linux-media
  Cc: llvm, oe-kbuild-all, Benjamin Mugnier, Sylvain Petinot, Yong Zhi,
	Dan Scally, Jacopo Mondi, hverkuil, laurent.pinchart, bingbu.cao,
	Tianshu Qiu, Maxime Ripard, Rui Miguel Silva, Martin Kepplinger,
	Purism Kernel Team, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Robert Foss, Todor Tomov,
	Bryan O'Donoghue, Tomi Valkeinen,
	Raspberry Pi Kernel Maintenance, Florian Fainelli,
	Broadcom internal kernel review list, Maxime Coquelin,
	Alexandre Torgue, Benoit Parrot, Ricardo Ribalda, Duc-Long, Le

Hi Sakari,

kernel test robot noticed the following build errors:

[auto build test ERROR on c4b7779abc6633677e6edb79e2809f4f61fde157]

url:    https://github.com/intel-lab-lkp/linux/commits/Sakari-Ailus/media-v4l-Support-passing-media-pad-argument-to-v4l2_get_link_freq/20250119-224053
base:   c4b7779abc6633677e6edb79e2809f4f61fde157
patch link:    https://lore.kernel.org/r/20250119143904.114991-10-sakari.ailus%40linux.intel.com
patch subject: [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad
config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20250120/202501200204.0M82bJgt-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250120/202501200204.0M82bJgt-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501200204.0M82bJgt-lkp@intel.com/

All error/warnings (new ones prefixed by >>):

   In file included from drivers/media/platform/qcom/camss/camss.c:14:
   In file included from include/linux/module.h:19:
   In file included from include/linux/elf.h:6:
   In file included from arch/s390/include/asm/elf.h:181:
   In file included from arch/s390/include/asm/mmu_context.h:11:
   In file included from arch/s390/include/asm/pgalloc.h:18:
   In file included from include/linux/mm.h:2223:
   include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     504 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     505 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     511 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     512 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     518 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     524 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     525 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/platform/qcom/camss/camss.c:2057:2: error: use of undeclared identifier 'sensor_pad'
    2057 |         sensor_pad = camss_find_sensor_pad(entity);
         |         ^
   drivers/media/platform/qcom/camss/camss.c:2058:7: error: use of undeclared identifier 'sensor_pad'; did you mean 'seq_pad'?
    2058 |         if (!sensor_pad)
         |              ^~~~~~~~~~
         |              seq_pad
   include/linux/seq_file.h:105:6: note: 'seq_pad' declared here
     105 | void seq_pad(struct seq_file *m, char c);
         |      ^
>> drivers/media/platform/qcom/camss/camss.c:2058:7: warning: address of function 'seq_pad' will always evaluate to 'true' [-Wpointer-bool-conversion]
    2058 |         if (!sensor_pad)
         |             ~^~~~~~~~~~
   drivers/media/platform/qcom/camss/camss.c:2058:7: note: prefix with the address-of operator to silence this warning
    2058 |         if (!sensor_pad)
         |              ^
         |              &
   drivers/media/platform/qcom/camss/camss.c:2061:39: error: use of undeclared identifier 'sensor_pad'
    2061 |         subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
         |                                              ^
   drivers/media/platform/qcom/camss/camss.c:2061:39: error: use of undeclared identifier 'sensor_pad'
   5 warnings and 4 errors generated.


vim +/sensor_pad +2057 drivers/media/platform/qcom/camss/camss.c

  2043	
  2044	/*
  2045	 * camss_get_pixel_clock - Get pixel clock rate from sensor
  2046	 * @entity: Media entity in the current pipeline
  2047	 * @pixel_clock: Received pixel clock value
  2048	 *
  2049	 * Return 0 on success or a negative error code otherwise
  2050	 */
  2051	int camss_get_pixel_clock(struct media_entity *entity, u64 *pixel_clock)
  2052	{
  2053		struct media_pad *sensor;
  2054		struct v4l2_subdev *subdev;
  2055		struct v4l2_ctrl *ctrl;
  2056	
> 2057		sensor_pad = camss_find_sensor_pad(entity);
> 2058		if (!sensor_pad)
  2059			return -ENODEV;
  2060	
  2061		subdev = media_entity_to_v4l2_subdev(sensor_pad->entity);
  2062	
  2063		ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_PIXEL_RATE);
  2064	
  2065		if (!ctrl)
  2066			return -EINVAL;
  2067	
  2068		*pixel_clock = v4l2_ctrl_g_ctrl_int64(ctrl);
  2069	
  2070		return 0;
  2071	}
  2072	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2025-01-19 18:29 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-19 14:38 [PATCH v9 0/9] Use V4L2 mbus config for conveying link frequency Sakari Ailus
2025-01-19 14:38 ` [PATCH v9 1/9] media: v4l: Support passing media pad argument to v4l2_get_link_freq() Sakari Ailus
2025-01-19 14:38 ` [PATCH v9 2/9] media: v4l: Support obtaining link frequency via get_mbus_config Sakari Ailus
2025-01-19 14:38 ` [PATCH v9 3/9] media: Documentation: Update link frequency driver documentation Sakari Ailus
2025-01-19 14:38 ` [PATCH v9 4/9] media: Documentation: tx-rx: Move transmitter control out of CSI-2 part Sakari Ailus
2025-01-19 14:39 ` [PATCH v9 5/9] media: Documentation: Receiver drivers should call v4l2_get_link_freq() Sakari Ailus
2025-01-19 14:39 ` [PATCH v9 6/9] media: v4l: Memset argument to 0 before calling get_mbus_config pad op Sakari Ailus
2025-01-19 14:39 ` [PATCH v9 7/9] media: intel/ipu6: Obtain link frequency from the remote subdev pad Sakari Ailus
2025-01-19 14:39 ` [PATCH v9 8/9] media: ivsc: csi: Obtain link frequency from the media pad Sakari Ailus
2025-01-19 14:39 ` [PATCH v9 9/9] media: v4l: Convert the users of v4l2_get_link_freq to call it on a pad Sakari Ailus
2025-01-19 17:46   ` kernel test robot
2025-01-19 18:17   ` kernel test robot
2025-01-19 18:28   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox