From nobody Thu Oct 2 09:17:03 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 02D1C306D4B; Fri, 19 Sep 2025 09:57:55 +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=1758275877; cv=none; b=lH3Eg7BjSqqgs5qvYZKSCHA3dpSZBUTXJLecnhon+Ude2LJ9cpwi5d8out3bErq6ZG0xESmNgRg7B3NTYxqB0J52vbnbJh8sQe8vMvC7Zr8tsWqrI80cobXAtjgpEVD0bf/6X/tk4P4WQ3Tc2napcBf6pqkE09/FMbG35d86CtQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758275877; c=relaxed/simple; bh=h03H+8yiC2Kyhg05f5+XZZP4Qf6g7IoJdSXpJjGJz9k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mAl89+FoM33k0W09FLIdHB/xSH+mIll+gGabQ/WWtDVO4T0oiwmwHkKCkJ4eqaZRM+dR8ueNzeHUSXA0NPe5562XUkHyrkBzup39kpsRDmUeZ34pPp9dj5Nw1mUI5QAXxhndFHlMcYKhEsTrOjmLHiBEloFJABnF8mX83e3u5zo= 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=AdlKwL5J; 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="AdlKwL5J" Received: from mail.ideasonboard.com (unknown [IPv6:2401:4900:1c30:4816:952:3054:81b6:1a3a]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1EDAAD3E; Fri, 19 Sep 2025 11:56:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1758275793; bh=h03H+8yiC2Kyhg05f5+XZZP4Qf6g7IoJdSXpJjGJz9k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=AdlKwL5J/YS60EZTBBJub18zWuZvEeYq/TYP10lyYMZRlD07R6l0ROWawEo0IpPkh BA7+D861xMKSXd9fUo7besj6CfGgL210vGhr2LWqrTJdBXmyYoLOY8PAbqndAA1+2m LkTsusoN0HOOpDJ5L3yNFBNUcW1WIWhGudp33ThE= From: Jai Luthra Date: Fri, 19 Sep 2025 15:26:01 +0530 Subject: [PATCH v2 09/10] media: rkisp1: 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-9-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 , Dafna Hirschfeld , Heiko Stuebner , linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, 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. Additionally, calculate stride on-demand instead of storing it in the driver context structure. 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: Dafna Hirschfeld Cc: Laurent Pinchart Cc: Mauro Carvalho Chehab Cc: Heiko Stuebner Cc: linux-media@vger.kernel.org Cc: linux-rockchip@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org --- .../platform/rockchip/rkisp1/rkisp1-capture.c | 135 +++++++++++------= ---- .../media/platform/rockchip/rkisp1/rkisp1-common.h | 4 - 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c b/driv= ers/media/platform/rockchip/rkisp1/rkisp1-capture.c index 38541f482b2d0dcf23546a0b9f893fb8544bcc40..81bf4ed8bccdb0873c910fa49b2= 2ef72eab295eb 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c @@ -482,7 +482,10 @@ static void rkisp1_irq_frame_end_enable(struct rkisp1_= capture *cap) =20 static void rkisp1_mp_config(struct rkisp1_capture *cap) { - const struct v4l2_pix_format_mplane *pixm =3D &cap->pix.fmt; + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; + u32 stride =3D pixm->plane_fmt[0].bytesperline / cap->pix.info->bpp[0]; struct rkisp1_device *rkisp1 =3D cap->rkisp1; u32 reg; =20 @@ -494,11 +497,11 @@ static void rkisp1_mp_config(struct rkisp1_capture *c= ap) rkisp1_pixfmt_comp_size(pixm, RKISP1_PLANE_CR)); =20 if (rkisp1_has_feature(rkisp1, MAIN_STRIDE)) { - rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_LLENGTH, cap->stride); + rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_LLENGTH, stride); rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_PIC_WIDTH, pixm->width); rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_PIC_HEIGHT, pixm->height); rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_PIC_SIZE, - cap->stride * pixm->height); + stride * pixm->height); } =20 rkisp1_irq_frame_end_enable(cap); @@ -546,7 +549,10 @@ static void rkisp1_mp_config(struct rkisp1_capture *ca= p) =20 static void rkisp1_sp_config(struct rkisp1_capture *cap) { - const struct v4l2_pix_format_mplane *pixm =3D &cap->pix.fmt; + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; + u32 stride =3D pixm->plane_fmt[0].bytesperline / cap->pix.info->bpp[0]; struct rkisp1_device *rkisp1 =3D cap->rkisp1; u32 mi_ctrl, reg; =20 @@ -557,11 +563,11 @@ static void rkisp1_sp_config(struct rkisp1_capture *c= ap) rkisp1_write(rkisp1, cap->config->mi.cr_size_init, rkisp1_pixfmt_comp_size(pixm, RKISP1_PLANE_CR)); =20 - rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_LLENGTH, cap->stride); + rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_LLENGTH, stride); rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_PIC_WIDTH, pixm->width); rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_PIC_HEIGHT, pixm->height); rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_PIC_SIZE, - cap->stride * pixm->height); + stride * pixm->height); =20 rkisp1_irq_frame_end_enable(cap); =20 @@ -704,7 +710,9 @@ static const struct rkisp1_capture_ops rkisp1_capture_o= ps_sp =3D { =20 static int rkisp1_dummy_buf_create(struct rkisp1_capture *cap) { - const struct v4l2_pix_format_mplane *pixm =3D &cap->pix.fmt; + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; struct rkisp1_dummy_buffer *dummy_buf =3D &cap->buf.dummy; =20 dummy_buf->size =3D max3(rkisp1_pixfmt_comp_size(pixm, RKISP1_PLANE_Y), @@ -869,7 +877,9 @@ static int rkisp1_vb2_queue_setup(struct vb2_queue *que= ue, struct device *alloc_devs[]) { struct rkisp1_capture *cap =3D queue->drv_priv; - const struct v4l2_pix_format_mplane *pixm =3D &cap->pix.fmt; + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; unsigned int i; =20 if (*num_planes) { @@ -894,7 +904,9 @@ static int rkisp1_vb2_buf_init(struct vb2_buffer *vb) struct rkisp1_buffer *ispbuf =3D container_of(vbuf, struct rkisp1_buffer, vb); struct rkisp1_capture *cap =3D vb->vb2_queue->drv_priv; - const struct v4l2_pix_format_mplane *pixm =3D &cap->pix.fmt; + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; unsigned int i; =20 memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); @@ -936,10 +948,13 @@ static void rkisp1_vb2_buf_queue(struct vb2_buffer *v= b) static int rkisp1_vb2_buf_prepare(struct vb2_buffer *vb) { struct rkisp1_capture *cap =3D vb->vb2_queue->drv_priv; + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; unsigned int i; =20 - for (i =3D 0; i < cap->pix.fmt.num_planes; i++) { - unsigned long size =3D cap->pix.fmt.plane_fmt[i].sizeimage; + for (i =3D 0; i < pixm->num_planes; i++) { + unsigned long size =3D pixm->plane_fmt[i].sizeimage; =20 if (vb2_plane_size(vb, i) < size) { dev_err(cap->rkisp1->dev, @@ -1278,7 +1293,7 @@ rkisp1_find_fmt_cfg(const struct rkisp1_capture *cap,= const u32 pixelfmt) return NULL; } =20 -static void rkisp1_try_fmt(const struct rkisp1_capture *cap, +static void rkisp1_adj_fmt(const struct rkisp1_capture *cap, struct v4l2_pix_format_mplane *pixm, const struct rkisp1_capture_fmt_cfg **fmt_cfg, const struct v4l2_format_info **fmt_info) @@ -1317,23 +1332,23 @@ static void rkisp1_try_fmt(const struct rkisp1_capt= ure *cap, *fmt_info =3D info; } =20 -static void rkisp1_set_fmt(struct rkisp1_capture *cap, - struct v4l2_pix_format_mplane *pixm) -{ - rkisp1_try_fmt(cap, pixm, &cap->pix.cfg, &cap->pix.info); - - cap->pix.fmt =3D *pixm; - cap->stride =3D pixm->plane_fmt[0].bytesperline / cap->pix.info->bpp[0]; -} - -static int rkisp1_try_fmt_vid_cap_mplane(struct file *file, +static int rkisp1_adj_fmt_vid_cap_mplane(struct file *file, struct video_device_state *state, struct v4l2_format *f) { struct rkisp1_capture *cap =3D video_drvdata(file); =20 - rkisp1_try_fmt(cap, &f->fmt.pix_mp, NULL, NULL); + if (state->which =3D=3D VIDEO_DEVICE_STATE_ACTIVE) { + if (vb2_is_busy(cap->vnode.vdev.queue)) + return -EBUSY; =20 + rkisp1_adj_fmt(cap, &f->fmt.pix_mp, &cap->pix.cfg, + &cap->pix.info); + } else { + rkisp1_adj_fmt(cap, &f->fmt.pix_mp, NULL, NULL); + } + + state->fmt =3D *f; return 0; } =20 @@ -1402,33 +1417,6 @@ static int rkisp1_enum_framesizes(struct file *file, return 0; } =20 -static int rkisp1_s_fmt_vid_cap_mplane(struct file *file, - struct video_device_state *state, - struct v4l2_format *f) -{ - struct rkisp1_capture *cap =3D video_drvdata(file); - struct rkisp1_vdev_node *node =3D - rkisp1_vdev_to_node(&cap->vnode.vdev); - - if (vb2_is_busy(&node->buf_queue)) - return -EBUSY; - - rkisp1_set_fmt(cap, &f->fmt.pix_mp); - - return 0; -} - -static int rkisp1_g_fmt_vid_cap_mplane(struct file *file, - struct video_device_state *state, - struct v4l2_format *f) -{ - struct rkisp1_capture *cap =3D video_drvdata(file); - - f->fmt.pix_mp =3D cap->pix.fmt; - - return 0; -} - static int rkisp1_querycap(struct file *file, struct video_device_state *state, struct v4l2_capability *cap) @@ -1450,9 +1438,9 @@ static const struct v4l2_ioctl_ops rkisp1_v4l2_ioctl_= ops =3D { .vidioc_prepare_buf =3D vb2_ioctl_prepare_buf, .vidioc_streamon =3D vb2_ioctl_streamon, .vidioc_streamoff =3D vb2_ioctl_streamoff, - .vidioc_try_fmt_vid_cap_mplane =3D rkisp1_try_fmt_vid_cap_mplane, - .vidioc_s_fmt_vid_cap_mplane =3D rkisp1_s_fmt_vid_cap_mplane, - .vidioc_g_fmt_vid_cap_mplane =3D rkisp1_g_fmt_vid_cap_mplane, + .vidioc_try_fmt_vid_cap_mplane =3D rkisp1_adj_fmt_vid_cap_mplane, + .vidioc_s_fmt_vid_cap_mplane =3D rkisp1_adj_fmt_vid_cap_mplane, + .vidioc_g_fmt_vid_cap_mplane =3D video_device_g_fmt, .vidioc_enum_fmt_vid_cap =3D rkisp1_enum_fmt_vid_cap_mplane, .vidioc_enum_framesizes =3D rkisp1_enum_framesizes, .vidioc_querycap =3D rkisp1_querycap, @@ -1460,6 +1448,25 @@ static const struct v4l2_ioctl_ops rkisp1_v4l2_ioctl= _ops =3D { .vidioc_unsubscribe_event =3D v4l2_event_unsubscribe, }; =20 +static int rkisp1_vdev_init_state(struct video_device_state *state) +{ + struct rkisp1_capture *cap =3D video_get_drvdata(state->vdev); + struct v4l2_pix_format_mplane *pixm =3D &state->fmt.fmt.pix_mp; + + state->fmt.type =3D V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + pixm->pixelformat =3D V4L2_PIX_FMT_YUYV; + pixm->width =3D RKISP1_DEFAULT_WIDTH; + pixm->height =3D RKISP1_DEFAULT_HEIGHT; + + rkisp1_adj_fmt(cap, pixm, &cap->pix.cfg, &cap->pix.info); + + return 0; +} + +static const struct video_device_internal_ops rkisp1_vdev_ops =3D { + .init_state =3D rkisp1_vdev_init_state, +}; + static int rkisp1_capture_link_validate(struct media_link *link) { struct video_device *vdev =3D @@ -1467,8 +1474,11 @@ static int rkisp1_capture_link_validate(struct media= _link *link) struct v4l2_subdev *sd =3D media_entity_to_v4l2_subdev(link->source->entity); struct rkisp1_capture *cap =3D video_get_drvdata(vdev); + const struct v4l2_format *format =3D + video_device_state_get_fmt(cap->vnode.vdev.state); + const struct v4l2_pix_format_mplane *pixm =3D &format->fmt.pix_mp; const struct rkisp1_capture_fmt_cfg *fmt =3D - rkisp1_find_fmt_cfg(cap, cap->pix.fmt.pixelformat); + rkisp1_find_fmt_cfg(cap, pixm->pixelformat); struct v4l2_subdev_format sd_fmt =3D { .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, .pad =3D link->source->index, @@ -1479,16 +1489,16 @@ static int rkisp1_capture_link_validate(struct medi= a_link *link) if (ret) return ret; =20 - if (sd_fmt.format.height !=3D cap->pix.fmt.height || - sd_fmt.format.width !=3D cap->pix.fmt.width || + if (sd_fmt.format.height !=3D pixm->height || + sd_fmt.format.width !=3D pixm->width || sd_fmt.format.code !=3D fmt->mbus) { dev_dbg(cap->rkisp1->dev, "link '%s':%u -> '%s':%u not valid: 0x%04x/%ux%u !=3D 0x%04x/%ux%u\n", link->source->entity->name, link->source->index, link->sink->entity->name, link->sink->index, sd_fmt.format.code, sd_fmt.format.width, - sd_fmt.format.height, fmt->mbus, cap->pix.fmt.width, - cap->pix.fmt.height); + sd_fmt.format.height, fmt->mbus, pixm->width, + pixm->height); return -EPIPE; } =20 @@ -1546,6 +1556,7 @@ static int rkisp1_register_capture(struct rkisp1_capt= ure *cap) mutex_init(&node->vlock); =20 vdev->ioctl_ops =3D &rkisp1_v4l2_ioctl_ops; + vdev->vdev_ops =3D &rkisp1_vdev_ops; vdev->release =3D video_device_release_empty; vdev->fops =3D &rkisp1_fops; vdev->minor =3D -1; @@ -1554,6 +1565,7 @@ static int rkisp1_register_capture(struct rkisp1_capt= ure *cap) vdev->device_caps =3D V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING | V4L2_CAP_IO_MC; vdev->entity.ops =3D &rkisp1_media_ops; + set_bit(V4L2_FL_USES_STATE, &vdev->flags); video_set_drvdata(vdev, cap); vdev->vfl_dir =3D VFL_DIR_RX; node->pad.flags =3D MEDIA_PAD_FL_SINK; @@ -1604,7 +1616,6 @@ static void rkisp1_capture_init(struct rkisp1_device *rkisp1, enum rkisp1_stream_id id) { struct rkisp1_capture *cap =3D &rkisp1->capture_devs[id]; - struct v4l2_pix_format_mplane pixm; =20 memset(cap, 0, sizeof(*cap)); cap->id =3D id; @@ -1622,12 +1633,6 @@ rkisp1_capture_init(struct rkisp1_device *rkisp1, en= um rkisp1_stream_id id) } =20 cap->is_streaming =3D false; - - memset(&pixm, 0, sizeof(pixm)); - pixm.pixelformat =3D V4L2_PIX_FMT_YUYV; - pixm.width =3D RKISP1_DEFAULT_WIDTH; - pixm.height =3D RKISP1_DEFAULT_HEIGHT; - rkisp1_set_fmt(cap, &pixm); } =20 int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1) diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h b/drive= rs/media/platform/rockchip/rkisp1/rkisp1-common.h index 6028ecdd23de6f69d53f77796252ee399a14436a..5731c4b368f8832c2b0748338cd= 0da2d0edf0a93 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h @@ -309,7 +309,6 @@ struct rkisp1_device; * handler to stop the streaming by waiting on the 'done' wait queue. * If the irq handler is not called, the stream is stopped by the callb= ack * after timeout. - * @stride: the line stride for the first plane, in pixel units * @buf.lock: lock to protect buf.queue * @buf.queue: queued buffer list * @buf.dummy: dummy space to store dropped data @@ -319,7 +318,6 @@ struct rkisp1_device; * @buf.next: the buffer used for next frame * @pix.cfg: pixel configuration * @pix.info: a pointer to the v4l2_format_info of the pixel format - * @pix.fmt: buffer format */ struct rkisp1_capture { struct rkisp1_vdev_node vnode; @@ -330,7 +328,6 @@ struct rkisp1_capture { bool is_streaming; bool is_stopping; wait_queue_head_t done; - unsigned int stride; struct { /* protects queue, curr and next */ spinlock_t lock; @@ -342,7 +339,6 @@ struct rkisp1_capture { struct { const struct rkisp1_capture_fmt_cfg *cfg; const struct v4l2_format_info *info; - struct v4l2_pix_format_mplane fmt; } pix; }; =20 --=20 2.51.0