From nobody Mon Feb 9 10:39:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0796EC77B73 for ; Wed, 24 May 2023 13:29:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234431AbjEXN3h (ORCPT ); Wed, 24 May 2023 09:29:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230019AbjEXN3f (ORCPT ); Wed, 24 May 2023 09:29:35 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3227AB0 for ; Wed, 24 May 2023 06:29:32 -0700 (PDT) Received: from dude05.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::54]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1q1oYU-0007Bo-HD; Wed, 24 May 2023 15:29:30 +0200 From: Philipp Zabel Date: Wed, 24 May 2023 15:29:24 +0200 Subject: [PATCH 1/2] media: video-mux: fix error paths MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20230524-video-mux-active-state-v1-1-325c69937ac3@pengutronix.de> References: <20230524-video-mux-active-state-v1-0-325c69937ac3@pengutronix.de> In-Reply-To: <20230524-video-mux-active-state-v1-0-325c69937ac3@pengutronix.de> To: Mauro Carvalho Chehab Cc: Sakari Ailus , Laurent Pinchart , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Philipp Zabel X-Mailer: b4 0.12-dev-aab37 X-SA-Exim-Connect-IP: 2a0a:edc0:0:1101:1d::54 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move notifier cleanup into video_mux_async_register() to avoid calling v4l2_async_nf_unregister() when v4l2_async_subdev_nf_register() failed. In case video_mux_async_register() fails, call media_entity_cleanup(). Signed-off-by: Philipp Zabel Reviewed-by: Laurent Pinchart --- drivers/media/platform/video-mux.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/vi= deo-mux.c index 1d9f32e5a917..4fe31386afc7 100644 --- a/drivers/media/platform/video-mux.c +++ b/drivers/media/platform/video-mux.c @@ -389,7 +389,7 @@ static int video_mux_async_register(struct video_mux *v= mux, ret =3D PTR_ERR(asd); /* OK if asd already exists */ if (ret !=3D -EEXIST) - return ret; + goto err_nf_cleanup; } } =20 @@ -397,9 +397,19 @@ static int video_mux_async_register(struct video_mux *= vmux, =20 ret =3D v4l2_async_subdev_nf_register(&vmux->subdev, &vmux->notifier); if (ret) - return ret; + goto err_nf_cleanup; =20 - return v4l2_async_register_subdev(&vmux->subdev); + ret =3D v4l2_async_register_subdev(&vmux->subdev); + if (ret) + goto err_nf_unregister; + + return 0; + +err_nf_unregister: + v4l2_async_nf_unregister(&vmux->notifier); +err_nf_cleanup: + v4l2_async_nf_cleanup(&vmux->notifier); + return ret; } =20 static int video_mux_probe(struct platform_device *pdev) @@ -473,11 +483,13 @@ static int video_mux_probe(struct platform_device *pd= ev) vmux->subdev.entity.ops =3D &video_mux_ops; =20 ret =3D video_mux_async_register(vmux, num_pads - 1); - if (ret) { - v4l2_async_nf_unregister(&vmux->notifier); - v4l2_async_nf_cleanup(&vmux->notifier); - } + if (ret) + goto err_entity_cleanup; =20 + return 0; + +err_entity_cleanup: + media_entity_cleanup(&vmux->subdev.entity); return ret; } =20 --=20 2.39.2 From nobody Mon Feb 9 10:39:27 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1203C7EE23 for ; Wed, 24 May 2023 13:29:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230308AbjEXN3n (ORCPT ); Wed, 24 May 2023 09:29:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57010 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234399AbjEXN3h (ORCPT ); Wed, 24 May 2023 09:29:37 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B0C0C13E for ; Wed, 24 May 2023 06:29:32 -0700 (PDT) Received: from dude05.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::54]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1q1oYU-0007Bo-Ry; Wed, 24 May 2023 15:29:30 +0200 From: Philipp Zabel Date: Wed, 24 May 2023 15:29:25 +0200 Subject: [PATCH 2/2] media: video-mux: update driver to active state MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20230524-video-mux-active-state-v1-2-325c69937ac3@pengutronix.de> References: <20230524-video-mux-active-state-v1-0-325c69937ac3@pengutronix.de> In-Reply-To: <20230524-video-mux-active-state-v1-0-325c69937ac3@pengutronix.de> To: Mauro Carvalho Chehab Cc: Sakari Ailus , Laurent Pinchart , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Philipp Zabel X-Mailer: b4 0.12-dev-aab37 X-SA-Exim-Connect-IP: 2a0a:edc0:0:1101:1d::54 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Drop the open coded pad format array, use subdev active state instead. Signed-off-by: Philipp Zabel Reviewed-by: Laurent Pinchart --- drivers/media/platform/video-mux.c | 78 ++++++++++++----------------------= ---- 1 file changed, 24 insertions(+), 54 deletions(-) diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/vi= deo-mux.c index 4fe31386afc7..6d273abfe16c 100644 --- a/drivers/media/platform/video-mux.c +++ b/drivers/media/platform/video-mux.c @@ -24,7 +24,6 @@ struct video_mux { struct v4l2_subdev subdev; struct v4l2_async_notifier notifier; struct media_pad *pads; - struct v4l2_mbus_framefmt *format_mbus; struct mux_control *mux; struct mutex lock; int active; @@ -71,6 +70,9 @@ static int video_mux_link_setup(struct media_entity *enti= ty, mutex_lock(&vmux->lock); =20 if (flags & MEDIA_LNK_FL_ENABLED) { + struct v4l2_subdev_state *sd_state; + struct v4l2_mbus_framefmt *source_mbusformat; + if (vmux->active =3D=3D local->index) goto out; =20 @@ -86,7 +88,12 @@ static int video_mux_link_setup(struct media_entity *ent= ity, vmux->active =3D local->index; =20 /* Propagate the active format to the source */ - vmux->format_mbus[source_pad] =3D vmux->format_mbus[vmux->active]; + sd_state =3D v4l2_subdev_lock_and_get_active_state(sd); + source_mbusformat =3D v4l2_subdev_get_pad_format(sd, sd_state, + source_pad); + *source_mbusformat =3D *v4l2_subdev_get_pad_format(sd, sd_state, + vmux->active); + v4l2_subdev_unlock_state(sd_state); } else { if (vmux->active !=3D local->index) goto out; @@ -138,40 +145,6 @@ static const struct v4l2_subdev_video_ops video_mux_su= bdev_video_ops =3D { .s_stream =3D video_mux_s_stream, }; =20 -static struct v4l2_mbus_framefmt * -__video_mux_get_pad_format(struct v4l2_subdev *sd, - struct v4l2_subdev_state *sd_state, - unsigned int pad, u32 which) -{ - struct video_mux *vmux =3D v4l2_subdev_to_video_mux(sd); - - switch (which) { - case V4L2_SUBDEV_FORMAT_TRY: - return v4l2_subdev_get_try_format(sd, sd_state, pad); - case V4L2_SUBDEV_FORMAT_ACTIVE: - return &vmux->format_mbus[pad]; - default: - return NULL; - } -} - -static int video_mux_get_format(struct v4l2_subdev *sd, - struct v4l2_subdev_state *sd_state, - struct v4l2_subdev_format *sdformat) -{ - struct video_mux *vmux =3D v4l2_subdev_to_video_mux(sd); - - mutex_lock(&vmux->lock); - - sdformat->format =3D *__video_mux_get_pad_format(sd, sd_state, - sdformat->pad, - sdformat->which); - - mutex_unlock(&vmux->lock); - - return 0; -} - static int video_mux_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *sdformat) @@ -181,14 +154,11 @@ static int video_mux_set_format(struct v4l2_subdev *s= d, struct media_pad *pad =3D &vmux->pads[sdformat->pad]; u16 source_pad =3D sd->entity.num_pads - 1; =20 - mbusformat =3D __video_mux_get_pad_format(sd, sd_state, sdformat->pad, - sdformat->which); + mbusformat =3D v4l2_subdev_get_pad_format(sd, sd_state, sdformat->pad); if (!mbusformat) return -EINVAL; =20 - source_mbusformat =3D __video_mux_get_pad_format(sd, sd_state, - source_pad, - sdformat->which); + source_mbusformat =3D v4l2_subdev_get_pad_format(sd, sd_state, source_pad= ); if (!source_mbusformat) return -EINVAL; =20 @@ -298,7 +268,8 @@ static int video_mux_set_format(struct v4l2_subdev *sd, =20 /* Source pad mirrors active sink pad, no limitations on sink pads */ if ((pad->flags & MEDIA_PAD_FL_SOURCE) && vmux->active >=3D 0) - sdformat->format =3D vmux->format_mbus[vmux->active]; + sdformat->format =3D *v4l2_subdev_get_pad_format(sd, sd_state, + vmux->active); =20 *mbusformat =3D sdformat->format; =20 @@ -321,7 +292,7 @@ static int video_mux_init_cfg(struct v4l2_subdev *sd, mutex_lock(&vmux->lock); =20 for (i =3D 0; i < sd->entity.num_pads; i++) { - mbusformat =3D v4l2_subdev_get_try_format(sd, sd_state, i); + mbusformat =3D v4l2_subdev_get_pad_format(sd, sd_state, i); *mbusformat =3D video_mux_format_mbus_default; } =20 @@ -332,7 +303,7 @@ static int video_mux_init_cfg(struct v4l2_subdev *sd, =20 static const struct v4l2_subdev_pad_ops video_mux_pad_ops =3D { .init_cfg =3D video_mux_init_cfg, - .get_fmt =3D video_mux_get_format, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D video_mux_set_format, }; =20 @@ -462,17 +433,9 @@ static int video_mux_probe(struct platform_device *pde= v) if (!vmux->pads) return -ENOMEM; =20 - vmux->format_mbus =3D devm_kcalloc(dev, num_pads, - sizeof(*vmux->format_mbus), - GFP_KERNEL); - if (!vmux->format_mbus) - return -ENOMEM; - - for (i =3D 0; i < num_pads; i++) { + for (i =3D 0; i < num_pads; i++) vmux->pads[i].flags =3D (i < num_pads - 1) ? MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE; - vmux->format_mbus[i] =3D video_mux_format_mbus_default; - } =20 vmux->subdev.entity.function =3D MEDIA_ENT_F_VID_MUX; ret =3D media_entity_pads_init(&vmux->subdev.entity, num_pads, @@ -482,12 +445,18 @@ static int video_mux_probe(struct platform_device *pd= ev) =20 vmux->subdev.entity.ops =3D &video_mux_ops; =20 + ret =3D v4l2_subdev_init_finalize(&vmux->subdev); + if (ret < 0) + goto err_entity_cleanup; + ret =3D video_mux_async_register(vmux, num_pads - 1); if (ret) - goto err_entity_cleanup; + goto err_subdev_cleanup; =20 return 0; =20 +err_subdev_cleanup: + v4l2_subdev_cleanup(&vmux->subdev); err_entity_cleanup: media_entity_cleanup(&vmux->subdev.entity); return ret; @@ -501,6 +470,7 @@ static void video_mux_remove(struct platform_device *pd= ev) v4l2_async_nf_unregister(&vmux->notifier); v4l2_async_nf_cleanup(&vmux->notifier); v4l2_async_unregister_subdev(sd); + v4l2_subdev_cleanup(sd); media_entity_cleanup(&sd->entity); } =20 --=20 2.39.2