Re: [PATCH v3 20/29] media: raspberrypi: cfe: Use v4l2_subdev_get_frame_desc()

Frank Li <[email protected]>
Newsgroups org.kernel.vger.linux-media
Message-ID <aoyzlU7d9a-yfbVl@lizhi-Precision-Tower-5810>
On Mon, Aug 24, 2026 at 03:14:42PM +0300, Sakari Ailus wrote:
> Call v4l2_subdev_get_frame_desc() to obtain the frame descriptor. This is
> preferred over calling the get_frame_desc() pad operation directly. Also
> remove the workaround for drivers not implementing the get_frame_desc()
> pad op.
>
> Signed-off-by: Sakari Ailus <[email protected]>
> ---
Reviewed-by: Frank Li <[email protected]>

>  .../media/platform/raspberrypi/rp1-cfe/cfe.c  | 51 ++++---------------
>  1 file changed, 11 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c b/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c
> index 8375ed3e97b9..e99a77e0878e 100644
> --- a/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c
> +++ b/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c
> @@ -6,6 +6,7 @@
>   * Copyright (c) 2023-2024 Ideas on Board Oy
>   */
>
> +#include <linux/cleanup.h>
>  #include <linux/clk.h>
>  #include <linux/debugfs.h>
>  #include <linux/delay.h>
> @@ -778,32 +779,9 @@ static irqreturn_t cfe_isr(int irq, void *dev)
>   * Stream helpers
>   */
>
> -static int cfe_get_vc_dt_fallback(struct cfe_device *cfe, u8 *vc, u8 *dt)
> -{
> -	struct v4l2_subdev_state *state;
> -	struct v4l2_mbus_framefmt *fmt;
> -	const struct cfe_fmt *cfe_fmt;
> -
> -	state = v4l2_subdev_get_locked_active_state(&cfe->csi2.sd);
> -
> -	fmt = v4l2_subdev_state_get_format(state, CSI2_PAD_SINK, 0);
> -	if (!fmt)
> -		return -EINVAL;
> -
> -	cfe_fmt = find_format_by_code(fmt->code);
> -	if (!cfe_fmt)
> -		return -EINVAL;
> -
> -	*vc = 0;
> -	*dt = cfe_fmt->csi_dt;
> -
> -	return 0;
> -}
> -
>  static int cfe_get_vc_dt(struct cfe_device *cfe, unsigned int channel, u8 *vc,
>  			 u8 *dt)
>  {
> -	struct v4l2_mbus_frame_desc remote_desc;
>  	struct v4l2_subdev_state *state;
>  	u32 sink_stream;
>  	unsigned int i;
> @@ -816,34 +794,27 @@ static int cfe_get_vc_dt(struct cfe_device *cfe, unsigned int channel, u8 *vc,
>  	if (ret)
>  		return ret;
>
> -	ret = v4l2_subdev_call(cfe->source_sd, pad, get_frame_desc,
> -			       cfe->source_pad, &remote_desc);
> -	if (ret == -ENOIOCTLCMD) {
> -		cfe_dbg(cfe, "source does not support get_frame_desc, use fallback\n");
> -		return cfe_get_vc_dt_fallback(cfe, vc, dt);
> -	} else if (ret) {
> +	struct v4l2_mbus_frame_desc *fd __free(v4l2_subdev_free_frame_desc) =
> +		v4l2_subdev_get_frame_desc(cfe->source_sd, cfe->source_pad,
> +					   V4L2_MBUS_FRAME_DESC_TYPE_CSI2);
> +	if (IS_ERR(fd)) {
>  		cfe_err(cfe, "Failed to get frame descriptor\n");
> -		return ret;
> -	}
> -
> -	if (remote_desc.type != V4L2_MBUS_FRAME_DESC_TYPE_CSI2) {
> -		cfe_err(cfe, "Frame descriptor does not describe CSI-2 link");
> -		return -EINVAL;
> +		return PTR_ERR(fd);
>  	}
>
> -	for (i = 0; i < remote_desc.num_entries; i++) {
> -		if (remote_desc.entry[i].stream == sink_stream)
> +	for (i = 0; i < fd->num_entries; i++) {
> +		if (fd->entry[i].stream == sink_stream)
>  			break;
>  	}
>
> -	if (i == remote_desc.num_entries) {
> +	if (i == fd->num_entries) {
>  		cfe_err(cfe, "Stream %u not found in remote frame desc\n",
>  			sink_stream);
>  		return -EINVAL;
>  	}
>
> -	*vc = remote_desc.entry[i].bus.csi2.vc;
> -	*dt = remote_desc.entry[i].bus.csi2.dt;
> +	*vc = fd->entry[i].bus.csi2.vc;
> +	*dt = fd->entry[i].bus.csi2.dt;
>
>  	return 0;
>  }
> --
> 2.47.3
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.