From nobody Thu Oct 2 09:17:04 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA5832F83BA; Fri, 19 Sep 2025 09:57:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758275871; cv=none; b=FmhcPGEqO06pRzQlnbfobBgjrrYtFZu/pMbwcaTZ3co/Nzfcf4ZgxA+iNINp+SGrtentOcoMY/IeBfoqs91rMRAcGZC5hhRmmIyb3qzRx62FT/h4IJWXFko8CBCKdytZK7+FsIxHdF60Bxj1a36Wukm808QuTI3yyrB/V1cqq2A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758275871; c=relaxed/simple; bh=7RThQq6enDN5qtXPKbmoCSTktTegcP0V9iKtvTOatxI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SiQfXZLZ3zYsuVKsqqxQkELaTttPUeNsbASkD26MJ4Sx8P7PsfkZxQJweJ9WprBMrw6hoBYsMJKDVMpCy1fgttGeL+Ms+UmWXZmqE5Uhu/sGlOCYzoGIrG/HvCQovKw4uvs572U/hPLZdO2bb3m3w7Vwh7FxmRE3feiDH+I2CwY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=RTNIp4cw; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="RTNIp4cw" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c30:4816:952:3054:81b6:1a3a]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D07BD99F; Fri, 19 Sep 2025 11:56:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1758275788; bh=7RThQq6enDN5qtXPKbmoCSTktTegcP0V9iKtvTOatxI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RTNIp4cwO7rObTEHofXw4Xz5C4Ir6lo+9fKw7pBOmTF/gY2gkCwZsGnS4OrKpz/ZE o58t89zvpogBte6dzF4IY5Tpl2xlhpPq0NzCE+XDZE46JgrLwTpz2D0Rf+pLArsgER rzb7fZ6T+Opif20w+7PMPdPDJNN4XqGX93nyS3OE= From: Jai Luthra Date: Fri, 19 Sep 2025 15:26:00 +0530 Subject: [PATCH v2 08/10] media: ti: j721e-csi2rx: Use video_device_state Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250919-vdev-state-v2-8-b2c42426965c@ideasonboard.com> References: <20250919-vdev-state-v2-0-b2c42426965c@ideasonboard.com> In-Reply-To: <20250919-vdev-state-v2-0-b2c42426965c@ideasonboard.com> To: Hans Verkuil , Mauro Carvalho Chehab , Sakari Ailus , Laurent Pinchart , Tomi Valkeinen , Jacopo Mondi , linux-media@vger.kernel.org Cc: Jai Luthra , Jai Luthra , linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Use the newly introduced video_device_state to store the active V4L2 format for the video device. This change allows using a single function for both .s_fmt and .try_fmt hooks, while leveraging the framework helper for the .g_fmt hook. Signed-off-by: Jai Luthra -- Cc: Jai Luthra Cc: Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org Cc: linux-kernel@vger.kernel.org --- .../media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 119 +++++++++++------= ---- 1 file changed, 62 insertions(+), 57 deletions(-) diff --git a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c b/driver= s/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c index ac9a87ee06b1090456508c87893ac0a265c93ae9..08557fc77851ec5897d5adc8011= e2cd031267cf5 100644 --- a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c +++ b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c @@ -17,6 +17,7 @@ =20 #include #include +#include #include #include #include @@ -110,7 +111,6 @@ struct ti_csi2rx_dev { struct v4l2_subdev *source; struct vb2_queue vidq; struct mutex mutex; /* To serialize ioctls. */ - struct v4l2_format v_fmt; struct ti_csi2rx_dma dma; u32 sequence; u8 pix_per_clk; @@ -308,22 +308,19 @@ static int ti_csi2rx_enum_fmt_vid_cap(struct file *fi= le, return 0; } =20 -static int ti_csi2rx_g_fmt_vid_cap(struct file *file, - struct video_device_state *state, - struct v4l2_format *f) -{ - struct ti_csi2rx_dev *csi =3D video_drvdata(file); - - *f =3D csi->v_fmt; - - return 0; -} - -static int ti_csi2rx_try_fmt_vid_cap(struct file *file, +static int ti_csi2rx_adj_fmt_vid_cap(struct file *file, struct video_device_state *state, struct v4l2_format *f) { const struct ti_csi2rx_fmt *fmt; + struct v4l2_format *format; + + if (state->which =3D=3D VIDEO_DEVICE_STATE_ACTIVE) { + struct ti_csi2rx_dev *csi =3D video_drvdata(file); + + if (vb2_is_busy(csi->vdev.queue)) + return -EBUSY; + } =20 /* * Default to the first format if the requested pixel format code isn't @@ -338,25 +335,8 @@ static int ti_csi2rx_try_fmt_vid_cap(struct file *file, =20 ti_csi2rx_fill_fmt(fmt, f); =20 - return 0; -} - -static int ti_csi2rx_s_fmt_vid_cap(struct file *file, - struct video_device_state *state, - struct v4l2_format *f) -{ - struct ti_csi2rx_dev *csi =3D video_drvdata(file); - struct vb2_queue *q =3D &csi->vidq; - int ret; - - if (vb2_is_busy(q)) - return -EBUSY; - - ret =3D ti_csi2rx_try_fmt_vid_cap(file, state, f); - if (ret < 0) - return ret; - - csi->v_fmt =3D *f; + format =3D video_device_state_get_fmt(state); + *format =3D *f; =20 return 0; } @@ -390,12 +370,36 @@ static int ti_csi2rx_enum_framesizes(struct file *fil= e, return 0; } =20 +static int ti_csi2rx_vdev_init_state(struct video_device_state *state) +{ + const struct ti_csi2rx_fmt *fmt; + struct v4l2_pix_format *pix_fmt; + + fmt =3D find_format_by_fourcc(V4L2_PIX_FMT_UYVY); + if (!fmt) + return -EINVAL; + + state->fmt.type =3D V4L2_BUF_TYPE_VIDEO_CAPTURE; + pix_fmt =3D &state->fmt.fmt.pix; + pix_fmt->width =3D 640; + pix_fmt->height =3D 480; + pix_fmt->field =3D V4L2_FIELD_NONE; + pix_fmt->colorspace =3D V4L2_COLORSPACE_SRGB; + pix_fmt->ycbcr_enc =3D V4L2_YCBCR_ENC_601; + pix_fmt->quantization =3D V4L2_QUANTIZATION_LIM_RANGE; + pix_fmt->xfer_func =3D V4L2_XFER_FUNC_SRGB; + + ti_csi2rx_fill_fmt(fmt, &state->fmt); + + return 0; +} + static const struct v4l2_ioctl_ops csi_ioctl_ops =3D { .vidioc_querycap =3D ti_csi2rx_querycap, .vidioc_enum_fmt_vid_cap =3D ti_csi2rx_enum_fmt_vid_cap, - .vidioc_try_fmt_vid_cap =3D ti_csi2rx_try_fmt_vid_cap, - .vidioc_g_fmt_vid_cap =3D ti_csi2rx_g_fmt_vid_cap, - .vidioc_s_fmt_vid_cap =3D ti_csi2rx_s_fmt_vid_cap, + .vidioc_try_fmt_vid_cap =3D ti_csi2rx_adj_fmt_vid_cap, + .vidioc_g_fmt_vid_cap =3D video_device_g_fmt, + .vidioc_s_fmt_vid_cap =3D ti_csi2rx_adj_fmt_vid_cap, .vidioc_enum_framesizes =3D ti_csi2rx_enum_framesizes, .vidioc_reqbufs =3D vb2_ioctl_reqbufs, .vidioc_create_bufs =3D vb2_ioctl_create_bufs, @@ -418,6 +422,10 @@ static const struct v4l2_file_operations csi_fops =3D { .mmap =3D vb2_fop_mmap, }; =20 +static const struct video_device_internal_ops csi_vdev_ops =3D { + .init_state =3D ti_csi2rx_vdev_init_state, +}; + static int csi_async_notifier_bound(struct v4l2_async_notifier *notifier, struct v4l2_subdev *subdev, struct v4l2_async_connection *asc) @@ -518,9 +526,11 @@ static void ti_csi2rx_request_max_ppc(struct ti_csi2rx= _dev *csi) static void ti_csi2rx_setup_shim(struct ti_csi2rx_dev *csi) { const struct ti_csi2rx_fmt *fmt; + struct v4l2_format *format; unsigned int reg; =20 - fmt =3D find_format_by_fourcc(csi->v_fmt.fmt.pix.pixelformat); + format =3D video_device_state_get_fmt(csi->vdev.state); + fmt =3D find_format_by_fourcc(format->fmt.pix.pixelformat); =20 /* De-assert the pixel interface reset. */ reg =3D SHIM_CNTL_PIX_RST; @@ -671,13 +681,21 @@ static void ti_csi2rx_dma_callback(void *param) spin_unlock_irqrestore(&dma->lock, flags); } =20 +static u32 ti_csi2rx_sizeimage(struct ti_csi2rx_dev *csi) +{ + struct v4l2_format *format =3D + video_device_state_get_fmt(csi->vdev.state); + + return format->fmt.pix.sizeimage; +} + static int ti_csi2rx_start_dma(struct ti_csi2rx_dev *csi, struct ti_csi2rx_buffer *buf) { - unsigned long addr; struct dma_async_tx_descriptor *desc; - size_t len =3D csi->v_fmt.fmt.pix.sizeimage; + unsigned long addr; dma_cookie_t cookie; + size_t len =3D ti_csi2rx_sizeimage(csi); int ret =3D 0; =20 addr =3D vb2_dma_contig_plane_dma_addr(&buf->vb.vb2_buf, 0); @@ -754,7 +772,7 @@ static int ti_csi2rx_queue_setup(struct vb2_queue *q, u= nsigned int *nbuffers, struct device *alloc_devs[]) { struct ti_csi2rx_dev *csi =3D vb2_get_drv_priv(q); - unsigned int size =3D csi->v_fmt.fmt.pix.sizeimage; + unsigned int size =3D ti_csi2rx_sizeimage(csi); =20 if (*nplanes) { if (sizes[0] < size) @@ -771,7 +789,7 @@ static int ti_csi2rx_queue_setup(struct vb2_queue *q, u= nsigned int *nbuffers, static int ti_csi2rx_buffer_prepare(struct vb2_buffer *vb) { struct ti_csi2rx_dev *csi =3D vb2_get_drv_priv(vb->vb2_queue); - unsigned long size =3D csi->v_fmt.fmt.pix.sizeimage; + unsigned long size =3D ti_csi2rx_sizeimage(csi); =20 if (vb2_plane_size(vb, 0) < size) { dev_err(csi->dev, "Data will not fit into plane\n"); @@ -951,7 +969,8 @@ static int ti_csi2rx_link_validate(struct media_link *l= ink) struct media_entity *entity =3D link->sink->entity; struct video_device *vdev =3D media_entity_to_video_device(entity); struct ti_csi2rx_dev *csi =3D container_of(vdev, struct ti_csi2rx_dev, vd= ev); - struct v4l2_pix_format *csi_fmt =3D &csi->v_fmt.fmt.pix; + struct v4l2_format *format =3D video_device_state_get_fmt(vdev->state); + struct v4l2_pix_format *csi_fmt =3D &format->fmt.pix; struct v4l2_subdev_format source_fmt =3D { .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, .pad =3D link->source->index, @@ -1041,24 +1060,8 @@ static int ti_csi2rx_v4l2_init(struct ti_csi2rx_dev = *csi) { struct media_device *mdev =3D &csi->mdev; struct video_device *vdev =3D &csi->vdev; - const struct ti_csi2rx_fmt *fmt; - struct v4l2_pix_format *pix_fmt =3D &csi->v_fmt.fmt.pix; int ret; =20 - fmt =3D find_format_by_fourcc(V4L2_PIX_FMT_UYVY); - if (!fmt) - return -EINVAL; - - pix_fmt->width =3D 640; - pix_fmt->height =3D 480; - pix_fmt->field =3D V4L2_FIELD_NONE; - pix_fmt->colorspace =3D V4L2_COLORSPACE_SRGB; - pix_fmt->ycbcr_enc =3D V4L2_YCBCR_ENC_601; - pix_fmt->quantization =3D V4L2_QUANTIZATION_LIM_RANGE; - pix_fmt->xfer_func =3D V4L2_XFER_FUNC_SRGB; - - ti_csi2rx_fill_fmt(fmt, &csi->v_fmt); - mdev->dev =3D csi->dev; mdev->hw_revision =3D 1; strscpy(mdev->model, "TI-CSI2RX", sizeof(mdev->model)); @@ -1070,10 +1073,12 @@ static int ti_csi2rx_v4l2_init(struct ti_csi2rx_dev= *csi) vdev->vfl_dir =3D VFL_DIR_RX; vdev->fops =3D &csi_fops; vdev->ioctl_ops =3D &csi_ioctl_ops; + vdev->vdev_ops =3D &csi_vdev_ops; vdev->release =3D video_device_release_empty; vdev->device_caps =3D V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | V4L2_CAP_IO_MC; vdev->lock =3D &csi->mutex; + set_bit(V4L2_FL_USES_STATE, &vdev->flags); video_set_drvdata(vdev, csi); =20 csi->pad.flags =3D MEDIA_PAD_FL_SINK; --=20 2.51.0