From nobody Tue Apr 7 22:10:52 2026 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 6847F2D3EC1; Wed, 11 Mar 2026 13:53:58 +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=1773237241; cv=none; b=rUNk0OOWL7ITLlwL08U42wD4Lqli5NTmo6OclA+2jGFjxK2wcrr4ov+429Pxew8+Tp4SClxXfX2u/p4qbZsZ/dYldD94HUzLOz00PHyE50oETTUT4qksVGL7rq0jmunp98jYkImG/125p3e5fZTBwTMvtDhFh+UU9G/xUTVJPiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237241; c=relaxed/simple; bh=pdZyak81e8CG8vI3htglWPevuPv2rJAraMngVPQe9+o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RwsHs8UteEojojSNrfeSO+UT8m1KfEQM6aNcmmwtph1uqTL6RwIuMDOOxAL2AopyYUG645u+rNh3UNunxzBcUN4qWNbhO1aNvHfYYXl7REnAudoKCZ0yucBnE4bvYsCfgDMbLAxrTABlcXqxDkBMkotS5L7Kud7IQQV9ua8dDgo= 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=WNQaMzsB; 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="WNQaMzsB" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6DF5F5A5; Wed, 11 Mar 2026 14:52:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237163; bh=pdZyak81e8CG8vI3htglWPevuPv2rJAraMngVPQe9+o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WNQaMzsBRe3ziVVHxOSjzaEy6xqfuug9C+Y18T5I3yu0LXQVT/9He93EUMlTh6lDY LK2JppEB45fkzxvNMbpb7Aj+i12RbuFmJ/HMvN6btJKP4HdtMq+I6RuNRaYv2Zh1Lc bWl7hrSHmq0+/3mAEXgRbQEMsd9qmT799rSm6c9w= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:14 +0200 Subject: [PATCH v5 01/10] media: rcar-vin: Link VINs on Gen3 to a single channel on each CSI-2 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: <20260311-rcar-streams-v5-1-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2436; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=pdZyak81e8CG8vI3htglWPevuPv2rJAraMngVPQe9+o=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPpr68/L8Pm5FCMdmSav/Ta7zCoBpb+GNmNd DLF23yR8NaJAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6QAKCRD6PaqMvJYe 9UjtD/96nP3CDORCHG/zsL1B1M2h/x1s0EZARDA1JUe16r9BWwNogd0nx4Boi8OofqTGd9vPlUi jZt3f7IPg70R8O+8QqZxijNC7BX7Eyf9WdPTs1KPvJKd3TMOBZcIj3X59lOQxstI+7UbD2N/ynu HibU+qHR/cEaL6Seq4HqHQonu3uacIZhWvHYKdp2WgIKzEAgbhMnvA8iOPtb9QF7mGL1KKR1Wmm Tb37lAnCWc3J8O/PeRMDjiLu0YhaxAz1QcDhyh62T69j/2LNi0+bUtrtllQBphDiRBI/2cOXoQu VHSQdfu4LTyPz2bXj/P97iafwfm/G7fEnXcN4LIVHBcW4kUcdBS+nCppEDX0OBkdoBe8IVa2LkN r8otridGWDl3Z7ApgzJt+fUDDO63YhpFBANDwwLxDqxp0XdSyH1T6UaHPMwA+tPA2/Ng7UwZXj/ ja3aRV0P1MQsfooqgxUV3kBmWz+SJQyPN1+hKNKeOyyNStX6nzN2OzhvUG/6qhtHCBOUySfrWJY qlUFhKPktUewgK0byyE581z84XplWOpKw6eNHNEWu8XZnCSQ7upskpuuNV/SedAWDRwlu6Wbl8r 1quAazcZ7Rw+AKOmKYgH68BJnwKAHus0yP2T4rQrnSH1X0Uyjd7GS5m15/t18vuFDZc9tqOCM7R r0pKkSkUu+Rl7fg== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 The stream routing will be fully configurable when we add full streams support to the rcar pipeline. Thus there is no need for the user to be able to link VINs to different CSI-2 channels. In fact, allowing e.g. VIN0 to be connected to CSI-2 channel 3 would be wrong, as the hardware doesn't allow that. Change rvin_csi2_create_link() so that it creates media links only between matching VINs and CSI-2 channels (VIN0 - channel 0, VIN1 - channel 1, etc.). Signed-off-by: Tomi Valkeinen Reviewed-by: Niklas S=C3=B6derlund --- .../media/platform/renesas/rcar-vin/rcar-core.c | 27 ++++++++++++------= ---- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-core.c b/drivers/= media/platform/renesas/rcar-vin/rcar-core.c index c8d564aa1eba..2fcea715101c 100644 --- a/drivers/media/platform/renesas/rcar-vin/rcar-core.c +++ b/drivers/media/platform/renesas/rcar-vin/rcar-core.c @@ -673,23 +673,26 @@ static int rvin_csi2_create_link(struct rvin_group *g= roup, unsigned int id, struct media_entity *source =3D &group->remotes[route->csi].subdev->entit= y; struct media_entity *sink =3D &group->vin[id]->vdev.entity; struct media_pad *sink_pad =3D &sink->pads[0]; + struct media_pad *source_pad; + unsigned int source_idx; unsigned int channel; - int ret; =20 - for (channel =3D 0; channel < 4; channel++) { - unsigned int source_idx =3D rvin_group_csi_channel_to_pad(channel); - struct media_pad *source_pad =3D &source->pads[source_idx]; + /* + * The channels from CSI-2 blocks and the VIN groups have a set of + * hardcoded routing options to choose from. We only support the routing + * where all VINs in a group are connected to the same CSI-2 block, + * and the Nth VIN in the group is connected to the Nth CSI-2 channel. + */ =20 - /* Skip if link already exists. */ - if (media_entity_find_link(source_pad, sink_pad)) - continue; + channel =3D id % 4; + source_idx =3D rvin_group_csi_channel_to_pad(channel); + source_pad =3D &source->pads[source_idx]; =20 - ret =3D media_create_pad_link(source, source_idx, sink, 0, 0); - if (ret) - return ret; - } + /* Skip if link already exists. */ + if (media_entity_find_link(source_pad, sink_pad)) + return 0; =20 - return 0; + return media_create_pad_link(source, source_idx, sink, 0, 0); } =20 static int rvin_parallel_setup_links(struct rvin_group *group) --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 94CCD30AD10; Wed, 11 Mar 2026 13:54:03 +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=1773237248; cv=none; b=EV6l6DN+fKgH2u9YCanqwbhTVMkIbREn4XUVy4Jj4+kkzHydBVJXKxPqHewT4VH4Ox3yTpQZxFmIuxFg8ofqf6CZ+if/ZpyvNUvAa3Vy+Q6skcDDrh5bRN2OEUfLoWNUdUrIQECfTI+XnYwsYC5fzeskKP/JkXTM4+F4uhfvMKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237248; c=relaxed/simple; bh=E1CJ0rQnAi0EUDChncm+qXC9IRTJno6m1t3x5jgRLOo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YvjNcknjw1CxDiJ+ZXvk2IYqjACHFl/5CnVOcS/hqNjWt2VdyKzN5TSjdtItfYGNVwJjxN3cvprBlSarJJHryHEGD6CSo63a2MHhE7bW4kPgSShYYTDRJ6PNiev0o38hZiDdXnRyEL7/KtKJAwzjrSrZCpT1jtkDP/bnzth8dqI= 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=IHIkBe0z; 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="IHIkBe0z" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3155482A; Wed, 11 Mar 2026 14:52:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237163; bh=E1CJ0rQnAi0EUDChncm+qXC9IRTJno6m1t3x5jgRLOo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IHIkBe0zt89usnMQEKPG0LEMgqLvMRxlry8QJaY6rP0G+S7aTitEYWtdgApopFk8c cZWFknIM9rWIgy/C7W2Swmf47kU4L8EgIS1aui5g80k1th+5LS863v0qpJSA2x5ibx XmtbYs/XPvNpiIqfFCc1lalZG09EelbzFzVzIo/0= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:15 +0200 Subject: [PATCH v5 02/10] media: rcar-isp: Move {enable|disable}_streams() calls 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: <20260311-rcar-streams-v5-2-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2882; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=E1CJ0rQnAi0EUDChncm+qXC9IRTJno6m1t3x5jgRLOo=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPpSql/XKpW0MiS6ZQgzQwm2PZvKRm7eIx7X FjLNiRM5X6JAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6QAKCRD6PaqMvJYe 9eDtD/4vPH9Ir0oSN/kUgoHrxPl//tf154k1DQVf61j8SI49eqbLgG8j8MXfo7ihEem/65owoZa AndGUJdAoVpm+zr84DXznV+bWzXrJXfQsrvYhyixyvuSz9YUtJDGaVw7ItmfgpyTtA4wyeKBNsJ SWh6P5Adtd+hibMMtchM+AwPfRkWoTnxFxJd6mao1XneMNbMbGYb/TjgOezSjIRNnsyBS8HKOlQ M9OTkuNjYsj0CnVzoN4CkHqHcdxxdKhZZHYwa/vAF2COXlYwAShjGYRLRRtpOtJhIrgw9ndfWtS 9oejXrzKfEKYOrDIsoB7eh+Jgm0yHIufq7BKO/bC58eCTaSm0U9N4HL0DUb21U90ZQoGNpeUF0T WG7+f2a82SimB2YuZU8NnfnP6MYPLBc5Nx5bIkOX8mXifzdA2zGwrVLvH5G8JxguNRhHpmXduWH DFa2uF1IEMOzhkX5UUJ9yhE0/rpNMtLg8pnsis1ZCYllMxrSnyL9FqYiPSz+PY4hu1hhRV3JTa8 3LxB0x8BKpVJLFBzEHXZVELGHKZCgdVmLaGD4cuHFZBoHo59SWOPAuub9x86tcxTDY03vmRljHY lh6A1adM92dr6oVLWDgdQVyALl+gC7wf0NlY9pXVDkghFPqVD2VMXvZswuDktCrkHhGmTy9act3 OHScUODrXjRKvUg== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 With multiple streams the operation to enable the ISP hardware and to call {enable|disable}_streams() on upstream subdev will need to be handled separately. Prepare for that by moving {enable|disable}_streams() calls out from risp_start() and risp_stop(). On Gen4, a side effect of this change is that if the sink side devices call .enable_streams() on rcar-isp multiple times, the second call will fail. This is because we always use stream ID 0, so the second call would attempt to enable the same stream again, leading to an error. In other words, a normal single-stream setup continues to work, but trying to use the current driver's custom VC based routing will fail. Signed-off-by: Tomi Valkeinen Reviewed-by: Laurent Pinchart --- drivers/media/platform/renesas/rcar-isp/csisp.c | 27 ++++++++++++++++-----= ---- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-isp/csisp.c b/drivers/medi= a/platform/renesas/rcar-isp/csisp.c index 8fb2cc3b5650..58a9a3bd9f75 100644 --- a/drivers/media/platform/renesas/rcar-isp/csisp.c +++ b/drivers/media/platform/renesas/rcar-isp/csisp.c @@ -268,18 +268,11 @@ static int risp_start(struct rcar_isp *isp, struct v4= l2_subdev_state *state) /* Start ISP. */ risp_write_cs(isp, ISPSTART_REG, ISPSTART_START); =20 - ret =3D v4l2_subdev_enable_streams(isp->remote, isp->remote_pad, - BIT_ULL(0)); - if (ret) - risp_power_off(isp); - - return ret; + return 0; } =20 static void risp_stop(struct rcar_isp *isp) { - v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, BIT_ULL(0)); - /* Stop ISP. */ risp_write_cs(isp, ISPSTART_REG, ISPSTART_STOP); =20 @@ -291,7 +284,7 @@ static int risp_enable_streams(struct v4l2_subdev *sd, u64 source_streams_mask) { struct rcar_isp *isp =3D sd_to_isp(sd); - int ret =3D 0; + int ret; =20 if (source_streams_mask !=3D 1) return -EINVAL; @@ -305,9 +298,17 @@ static int risp_enable_streams(struct v4l2_subdev *sd, return ret; } =20 + ret =3D v4l2_subdev_enable_streams(isp->remote, isp->remote_pad, + BIT_ULL(0)); + if (ret) { + if (isp->stream_count =3D=3D 0) + risp_stop(isp); + return ret; + } + isp->stream_count +=3D 1; =20 - return ret; + return 0; } =20 static int risp_disable_streams(struct v4l2_subdev *sd, @@ -315,6 +316,7 @@ static int risp_disable_streams(struct v4l2_subdev *sd, u64 source_streams_mask) { struct rcar_isp *isp =3D sd_to_isp(sd); + int ret; =20 if (source_streams_mask !=3D 1) return -EINVAL; @@ -322,6 +324,11 @@ static int risp_disable_streams(struct v4l2_subdev *sd, if (!isp->remote) return -ENODEV; =20 + ret =3D v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, + BIT_ULL(0)); + if (ret) + return ret; + if (isp->stream_count =3D=3D 1) risp_stop(isp); =20 --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 AD7C235F618; Wed, 11 Mar 2026 13:54:03 +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=1773237247; cv=none; b=ojOc+zJIZmPyVX9LKxtvhwz9rHVAWI466rWmT8ghWe0vbVqfzgK/qmZREpHxMOux6hgUEgUvkh6tIlZP4OoZwfPbaptMX2f24uMmhS9cstDn+YPA/0uClYVQjfNMb9xqUuWwZcdV+30RU4cQMHptyrf5iwLRK7MH1jLSZ0RAMc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237247; c=relaxed/simple; bh=e3GDDap0IFU4kE62sys31KdPbj/6dEOb3CokA1RneYI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sEU+6ybd34sG00/P1VJgKTKlj5eonzHNZE1rEEj6WLX/gzKhTdlpubau1owNRxgQTRBMaPugB5anRC7EerZcTCjyn7114pKLZVzOpCTVwJyBMIjtbb2n8n88x6pdWMTOdjgVNbBfaGhcD4ByhfnUBPXIGlv/VldJNt/lfjLaWe4= 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=oz2TVu6k; 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="oz2TVu6k" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DFB34981; Wed, 11 Mar 2026 14:52:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237164; bh=e3GDDap0IFU4kE62sys31KdPbj/6dEOb3CokA1RneYI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oz2TVu6kveXLvGvDrxECbv7QT8j4fBR26zXcdOEfKRnYhMbUR5ErH3GtMWbGlY25D wqtFz8gBvKsZEJcZ034Rg4dnr1fGLEmqAGCuyR0xwTzoqUIn6R1t3ryBxVcI/Ie1it ZX/B5EQVRCMjycbPebBk46TUqwPXDKBAO8ie4kPc= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:16 +0200 Subject: [PATCH v5 03/10] media: rcar-csi2: Move {enable|disable}_streams() calls 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: <20260311-rcar-streams-v5-3-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2831; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=e3GDDap0IFU4kE62sys31KdPbj/6dEOb3CokA1RneYI=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPpBjrV/8oq7ZuEqEU3DXmABMzyy86DlP+6o 28stAS9Yc6JAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6QAKCRD6PaqMvJYe 9aNsEACZTJdMGJNykXqO0n0sjJ0B8Ch0IUrbbDwOxA6ecYgUbTYW1Gq8GvOxsR2MkgXHDvV2/lq bXLexjdv/Y+FTQU1/TaHOW/AQRGc8MH//Cf5Io2sBgHBx6iRB42jYJLJB4PftuUTxzH1Z+/9SqY bKV7lxUV5IgiL4nz5cHi7v+LYGE40rPg355QuJ5erjJ02P/nFxVUxBnj1CWk7zzaWxMDEb3xTbB SWf6OP9mehJ1hRIgXAf8RpFYHtwM+vEf+tK/EH2UHiajCE32yCvlXdxzgXQk225+Nimg9aM7rpl Mf4Yng93RCRPO3HeaWBDl82CzltNLkrr22R6wvTHxvnX6k8cVkKv850lRMXsE+hPSK72y8XwoB+ S2WKIEuXRNu09a6HrNjbLCKS4XjMphL1TGob4ZPk8zqqdBUdIPGbwWjEOCj6xykuRdDbtMo5dqj BfZDRO8S8FQxmh6zIpVF/+Dh+WICg3iQdbVm2L3QHhgCn9aKtybn0qmt44DZfJgRMX05pX0qQ4a 0GeB/GxvaDY/rEKDPvLbQqu1gqpz/T2qcwQDTQq3/IF2tnDTM8Ca+XYg8Ul3CFqoe7MeLQbyhVi EGOqyqJiGysNzg5RhkfD6eupnA+nRprugnVpF3z45tSEeAxHpMeFkWPRUc51udGQRj44jGjC4Jt c3VtXpotdsqchAg== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 With multiple streams the operation to enable the CSI-2 hardware and to call {enable|disable}_streams() on upstream subdev will need to be handled separately. Prepare for that by moving {enable|disable}_streams() calls out from rcsi2_start() and rcsi2_stop(). On Gen3, a side effect of this change is that if the sink side devices call .enable_streams() on rcar-csi2 multiple times, the second call will fail. This is because we always use stream ID 0, so the second call would attempt to enable the same stream again, leading to an error. In other words, a normal single-stream setup continues to work, but trying to use the current driver's custom VC based routing will fail. On Gen4, this doesn't matter as the rcar-isp behaves in a similar way as described above, and thus rcar-csi2 will only get a single .enable_streams() call. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-csi2.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/pla= tform/renesas/rcar-csi2.c index 7305cc4a04cb..158fa447e668 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -1822,20 +1822,12 @@ static int rcsi2_start(struct rcar_csi2 *priv, stru= ct v4l2_subdev_state *state) return ret; } =20 - ret =3D v4l2_subdev_enable_streams(priv->remote, priv->remote_pad, - BIT_ULL(0)); - if (ret) { - rcsi2_enter_standby(priv); - return ret; - } - return 0; } =20 static void rcsi2_stop(struct rcar_csi2 *priv) { rcsi2_enter_standby(priv); - v4l2_subdev_disable_streams(priv->remote, priv->remote_pad, BIT_ULL(0)); } =20 static int rcsi2_enable_streams(struct v4l2_subdev *sd, @@ -1857,6 +1849,14 @@ static int rcsi2_enable_streams(struct v4l2_subdev *= sd, return ret; } =20 + ret =3D v4l2_subdev_enable_streams(priv->remote, priv->remote_pad, + BIT_ULL(0)); + if (ret) { + if (priv->stream_count =3D=3D 0) + rcsi2_stop(priv); + return ret; + } + priv->stream_count +=3D 1; =20 return ret; @@ -1867,7 +1867,7 @@ static int rcsi2_disable_streams(struct v4l2_subdev *= sd, u32 source_pad, u64 source_streams_mask) { struct rcar_csi2 *priv =3D sd_to_csi2(sd); - int ret =3D 0; + int ret; =20 if (source_streams_mask !=3D 1) return -EINVAL; @@ -1878,9 +1878,14 @@ static int rcsi2_disable_streams(struct v4l2_subdev = *sd, if (priv->stream_count =3D=3D 1) rcsi2_stop(priv); =20 + ret =3D v4l2_subdev_disable_streams(priv->remote, priv->remote_pad, + BIT_ULL(0)); + if (ret) + return ret; + priv->stream_count -=3D 1; =20 - return ret; + return 0; } =20 static int rcsi2_set_pad_format(struct v4l2_subdev *sd, --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 A3B00362149; Wed, 11 Mar 2026 13:54:09 +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=1773237253; cv=none; b=ttaBXd0OO6kYrFM0e+OHarllvxyhH/DC3x8jZ6DUpdsb2qi8DUkITfPKbDeokBw65f192O4oSUhbFRwOzpwGQ9LfNS2rl9QIACfeLdecWtQbQtWUK4+9u32AzdAb1V2MaFyyRXMgwBd+S67akhkBZc1MYmVZ6biiJDk4GHosb5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237253; c=relaxed/simple; bh=nxSpWhGGdK1V6xX1GVzD1gr52EzJI9+8vNCGE5j99T4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RsInV322jvQusTJKil1TOZ+8iba2Frmy4tRZHrqTrVxKYMnFTdDiMR0gjLTWRgDgKt7MHHrrZiELtIC9dBavv3wvf9YJj1TlAPTt6c2UU0RioH3KqabQ2+pIZ5f3fCGv+ZRVF8vMU4uDu/XsquYXw31prCzSq8ThhONL/mtm+LI= 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=mUsQH996; 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="mUsQH996" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9E61DC59; Wed, 11 Mar 2026 14:52:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237165; bh=nxSpWhGGdK1V6xX1GVzD1gr52EzJI9+8vNCGE5j99T4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mUsQH996O9IIIB9dxZ/AQOzOWT8WmclKGPjVHgUy0bkCSluwpVxZ+6JfA0Suadu7P P8HL3Vt5Xc0igf7ph4oIBvYW15J+wT+Y+3e90YYGub+HlmqGO8DETl6fwuc+0tNygX rQGukjPfXSn7uooEhtztUWVWS8BelUJ/eq7K68wg= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:17 +0200 Subject: [PATCH v5 04/10] media: rcar-csi2: Switch to Streams API 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: <20260311-rcar-streams-v5-4-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=5121; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=nxSpWhGGdK1V6xX1GVzD1gr52EzJI9+8vNCGE5j99T4=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPqBn/u/pYrIoavOmX7TEopTDr8Vtc1O1Jfd FgVg6PuRLiJAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6gAKCRD6PaqMvJYe 9ZZCD/0aHITAIqBi4G5zmYqfpp4ZPHa/UlE4BY7EhsBXqVcTW9qFLvyDiuSdNcCoHF9rSIY7aFS q1hrP7agNYuU6luEBMAeqP6X/XoBfvQBbyAFCBJckJ3xo9aJ+rU48FsQyp2O7CfGkhlNbdk62/V mHc/v4pJngQBRO83PkogeU8KI6hBNXdfw4XwuhPMMOXPEgtex0PV/C4O8MsEui8tph8y6iqfORl 14zFE/9PX+qJh9K4uxeXB01JTSflxd+lHzQShS0EalMxKxCOXmwNvFIVRyRBaGZQvJO3rE5/LxG mCTne9bRlrvFuCE7vNtaImQAY535mc/PdZa1Xg2kT25pmpH4ZsoFF0kN79RaEDFJOHo4MjKsjwQ EpkElzpMakD6rIwiaTAD6P7YnRN+aQOh42KPbzBZ+5u0Ju5DWXwTJafaxx2a7QppV0tO12ke6+U n2avpv4Lt7HyEyGjdOY9NvSkPeeAOS2IXvMHwfNuHwCMoY5G/uAPxSG1Ea1EVizyvrEq6cCb2kv Bn2iOg86ZkSRBXJqUiUZHGaSrVlQnaaXUEJqLaXOV7sk60slcwl8w82ixI1ObusN2o63uKcNuNy INc0nbu8aE426rIEtnezFOvQJQZirRHI+tXvmL/M7+AQ1gaqm9nQKB/PNto5JraV1Dems+K/4xg 3Y73IE7YKcxnXxg== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Switch to Streams API with a single hardcoded route. For single-stream use case there should be no change in behavior. Signed-off-by: Tomi Valkeinen Reviewed-by: Laurent Pinchart --- drivers/media/platform/renesas/rcar-csi2.c | 64 +++++++++++++++++++++++---= ---- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/pla= tform/renesas/rcar-csi2.c index 158fa447e668..ad62c95c8f9a 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -1023,17 +1023,24 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, */ freq =3D v4l2_get_link_freq(remote_pad, 0, 0); if (freq < 0) { + const struct v4l2_subdev_route *route; const struct rcar_csi2_format *format; const struct v4l2_mbus_framefmt *fmt; unsigned int lanes; unsigned int bpp; int ret; =20 + if (state->routing.num_routes !=3D 1) + return -EINVAL; + ret =3D rcsi2_get_active_lanes(priv, &lanes); if (ret) return ret; =20 - fmt =3D v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK); + route =3D &state->routing.routes[0]; + + fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, + route->sink_stream); if (!fmt) return -EINVAL; =20 @@ -1062,6 +1069,7 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv, struct v4l2_subdev_state *state) { + const struct v4l2_subdev_route *route; const struct rcar_csi2_format *format; u32 phycnt, vcdt =3D 0, vcdt2 =3D 0, fld =3D 0; const struct v4l2_mbus_framefmt *fmt; @@ -1070,7 +1078,16 @@ static int rcsi2_start_receiver_gen3(struct rcar_csi= 2 *priv, int mbps, ret; =20 /* Use the format on the sink pad to compute the receiver config. */ - fmt =3D v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK); + + if (state->routing.num_routes !=3D 1) + return -EINVAL; + + route =3D &state->routing.routes[0]; + + fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, + route->sink_stream); + if (!fmt) + return -EINVAL; =20 dev_dbg(priv->dev, "Input size (%ux%u%c)\n", fmt->width, fmt->height, @@ -1892,8 +1909,7 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *s= d, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct rcar_csi2 *priv =3D sd_to_csi2(sd); - unsigned int num_pads =3D rcsi2_num_pads(priv); + struct v4l2_mbus_framefmt *fmt; =20 if (format->pad > RCAR_CSI2_SINK) return v4l2_subdev_get_fmt(sd, state, format); @@ -1901,11 +1917,20 @@ static int rcsi2_set_pad_format(struct v4l2_subdev = *sd, if (!rcsi2_code_to_fmt(format->format.code)) format->format.code =3D rcar_csi2_formats[0].code; =20 - *v4l2_subdev_state_get_format(state, format->pad) =3D format->format; + /* Set sink format. */ + fmt =3D v4l2_subdev_state_get_format(state, format->pad, format->stream); + if (!fmt) + return -EINVAL; + + *fmt =3D format->format; + + /* Propagate the format to the source pad. */ + fmt =3D v4l2_subdev_state_get_opposite_stream_format(state, format->pad, + format->stream); + if (!fmt) + return -EINVAL; =20 - /* Propagate the format to the source pads. */ - for (unsigned int i =3D RCAR_CSI2_SOURCE_VC0; i < num_pads; i++) - *v4l2_subdev_state_get_format(state, i) =3D format->format; + *fmt =3D format->format; =20 return 0; } @@ -1925,8 +1950,15 @@ static const struct v4l2_subdev_ops rcar_csi2_subdev= _ops =3D { static int rcsi2_init_state(struct v4l2_subdev *sd, struct v4l2_subdev_state *state) { - struct rcar_csi2 *priv =3D sd_to_csi2(sd); - unsigned int num_pads =3D rcsi2_num_pads(priv); + static struct v4l2_subdev_route routes[] =3D { + { + .sink_pad =3D RCAR_CSI2_SINK, + .sink_stream =3D 0, + .source_pad =3D RCAR_CSI2_SOURCE_VC0, + .source_stream =3D 0, + .flags =3D V4L2_SUBDEV_ROUTE_FL_ACTIVE, + }, + }; =20 static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt =3D { .width =3D 1920, @@ -1939,10 +1971,13 @@ static int rcsi2_init_state(struct v4l2_subdev *sd, .xfer_func =3D V4L2_XFER_FUNC_DEFAULT, }; =20 - for (unsigned int i =3D RCAR_CSI2_SINK; i < num_pads; i++) - *v4l2_subdev_state_get_format(state, i) =3D rcar_csi2_default_fmt; + static const struct v4l2_subdev_krouting routing =3D { + .num_routes =3D ARRAY_SIZE(routes), + .routes =3D routes, + }; =20 - return 0; + return v4l2_subdev_set_routing_with_fmt(sd, state, &routing, + &rcar_csi2_default_fmt); } =20 static const struct v4l2_subdev_internal_ops rcar_csi2_internal_ops =3D { @@ -2599,7 +2634,8 @@ static int rcsi2_probe(struct platform_device *pdev) v4l2_set_subdevdata(&priv->subdev, &pdev->dev); snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %s", KBUILD_MODNAME, dev_name(&pdev->dev)); - priv->subdev.flags =3D V4L2_SUBDEV_FL_HAS_DEVNODE; + priv->subdev.flags =3D V4L2_SUBDEV_FL_HAS_DEVNODE | + V4L2_SUBDEV_FL_STREAMS; =20 priv->subdev.entity.function =3D MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; priv->subdev.entity.ops =3D &rcar_csi2_entity_ops; --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 4FFB7363088; Wed, 11 Mar 2026 13:54:10 +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=1773237254; cv=none; b=grOPg+6JUfoHnz24DIKbuyDlBD9xgqdjJsFsvis1H3kPOazYw/9qEeJ4/t9N6eG4/n9M60qpZNIJIm5koa8MYHeN9Vnlu7cp/Ak/n1GIwKvno5x7RaDayBgHbu/Lfvnbz9Z5Y2n0MtIl5SF+Q5u6Id89oOT+dCGRVP062zVflNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237254; c=relaxed/simple; bh=mZWCoESvX+k2ae2+IKwq0Qo52nPIskYlapwxCMGA4K8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fBV7FIrKuQgoM1QO5Bmtcjl2qUopI+cIyDo2bEyryEoJt4huWg6ehVK6dNDXNFnaUdimhdNux5aKf/HPHtbc5FOQJLCA/sS3anIQ903flAvVpbDEWLjIV8QX3bQmWNyytVqVMElzNn0iNfwyTJVRLQFj5wElF31IQ5USyFzKcCk= 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=OiR/AZzV; 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="OiR/AZzV" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5A4C2121A; Wed, 11 Mar 2026 14:52:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237165; bh=mZWCoESvX+k2ae2+IKwq0Qo52nPIskYlapwxCMGA4K8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=OiR/AZzVTO1VwIUxI2CP4SD0Q6ojB62ijOt5qSt3wI5ZsykB32oXcFgtdf0AFxl42 gymTA3dmkjrvf7AcE7zgUCWPXFSxIAO7SCCxndTctRlN+KwMvYkUDqoBYC06p4S4E6 Q0wADjh6hjTFfwrsaM4V8KYU9Y/pOeeSB6wv8IXo= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:18 +0200 Subject: [PATCH v5 05/10] media: rcar-isp: Switch to Streams API 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: <20260311-rcar-streams-v5-5-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=4413; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=mZWCoESvX+k2ae2+IKwq0Qo52nPIskYlapwxCMGA4K8=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPq+gBvYKgXzdsgeA/eomKShIjksktLBtluE LH9eVh3aSyJAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6gAKCRD6PaqMvJYe 9clTD/0f6fa1jqC+gAC/cvmXYxBFLJVDNWwFuMFDwYyPbISjUGBKprzGn85L/4aijkPnxOLJjSQ 3Rfi7aEfysKnI7vyZClD0CBdUtKD21bOLidIWjAYPBJ+YYc98kslZ4XSw3m5UBFT9Qrj8uC480h tIr5QV4YnHQLDkn3uJZnxxWOzg/N7eGeELt7vRX6g1I7a6qWnuOEgkmCfn9V6VJmBVxoIGsNaXk bg4QBkwATTilwa/DKhWthyDs0NMX+43yfMEEHHMA+F5mMe7KYdo/OcuKI7AOqet/ut4QJepSO+j Rc6I52am1zAsjUghnej8r3AwXMEL1DZ5qEJCvQB9oqPPzzqW7by1IjbDnN557hs8+K6R6Xcl/Tr 5XsU/7aVDpZ/TWsObLVyeqBbdhEiUrO9TzqgtA0N/7XtLrIXGC8VyS+K25k/x/DXh8m3Ug1rKJ8 3ndf7oPmYwhCXlOWRa0TJ/q5eVziQmD6bFs6zVaf6eoVeZBHouHJLFTnYVtWIZswcdOulKAqmT2 6PBniC3hI7vpuldeo06LfMbgU1nJhP0T9hLL/iDBzE4rcFiXIdLgOYZFqqTwDyGKOGQomAEX0l0 /W8DEX1od2xrGsw7tYKZkIsQ5/cR14cuE3momO7nBQ5Aja8BzqRIZBHX91sm+1Ial/3Pzq3w4/3 +FCIY2ogWBX/I0Q== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Switch to Streams API with a single hardcoded route. For single-stream use case there should be no change in behavior. Signed-off-by: Tomi Valkeinen Reviewed-by: Laurent Pinchart --- drivers/media/platform/renesas/rcar-isp/csisp.c | 69 +++++++++++++++++++++= +--- 1 file changed, 62 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-isp/csisp.c b/drivers/medi= a/platform/renesas/rcar-isp/csisp.c index 58a9a3bd9f75..8ac45516aa39 100644 --- a/drivers/media/platform/renesas/rcar-isp/csisp.c +++ b/drivers/media/platform/renesas/rcar-isp/csisp.c @@ -124,6 +124,17 @@ static const struct rcar_isp_format rcar_isp_formats[]= =3D { }, }; =20 +static const struct v4l2_mbus_framefmt risp_default_fmt =3D { + .width =3D 1920, + .height =3D 1080, + .code =3D MEDIA_BUS_FMT_RGB888_1X24, + .colorspace =3D V4L2_COLORSPACE_SRGB, + .field =3D V4L2_FIELD_NONE, + .ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT, + .quantization =3D V4L2_QUANTIZATION_DEFAULT, + .xfer_func =3D V4L2_XFER_FUNC_DEFAULT, +}; + static const struct rcar_isp_format *risp_code_to_fmt(unsigned int code) { unsigned int i; @@ -216,13 +227,20 @@ static void risp_power_off(struct rcar_isp *isp) =20 static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *stat= e) { + const struct v4l2_subdev_route *route; const struct v4l2_mbus_framefmt *fmt; const struct rcar_isp_format *format; unsigned int vc; u32 sel_csi =3D 0; int ret; =20 - fmt =3D v4l2_subdev_state_get_format(state, RCAR_ISP_SINK); + if (state->routing.num_routes !=3D 1) + return -EINVAL; + + route =3D &state->routing.routes[0]; + + fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, + route->sink_stream); if (!fmt) return -EINVAL; =20 @@ -341,7 +359,7 @@ static int risp_set_pad_format(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct v4l2_mbus_framefmt *framefmt; + struct v4l2_mbus_framefmt *fmt; =20 if (format->pad > RCAR_ISP_SINK) return v4l2_subdev_get_fmt(sd, state, format); @@ -349,10 +367,20 @@ static int risp_set_pad_format(struct v4l2_subdev *sd, if (!risp_code_to_fmt(format->format.code)) format->format.code =3D rcar_isp_formats[0].code; =20 - for (unsigned int i =3D 0; i < RCAR_ISP_NUM_PADS; i++) { - framefmt =3D v4l2_subdev_state_get_format(state, i); - *framefmt =3D format->format; - } + /* Set sink format. */ + fmt =3D v4l2_subdev_state_get_format(state, format->pad, format->stream); + if (!fmt) + return -EINVAL; + + *fmt =3D format->format; + + /* Propagate the format to the source pad. */ + fmt =3D v4l2_subdev_state_get_opposite_stream_format(state, format->pad, + format->stream); + if (!fmt) + return -EINVAL; + + *fmt =3D format->format; =20 return 0; } @@ -369,6 +397,32 @@ static const struct v4l2_subdev_ops rcar_isp_subdev_op= s =3D { .pad =3D &risp_pad_ops, }; =20 +static int risp_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state) +{ + static struct v4l2_subdev_route routes[] =3D { + { + .sink_pad =3D RCAR_ISP_SINK, + .sink_stream =3D 0, + .source_pad =3D RCAR_ISP_PORT0, + .source_stream =3D 0, + .flags =3D V4L2_SUBDEV_ROUTE_FL_ACTIVE, + }, + }; + + static const struct v4l2_subdev_krouting routing =3D { + .num_routes =3D ARRAY_SIZE(routes), + .routes =3D routes, + }; + + return v4l2_subdev_set_routing_with_fmt(sd, state, &routing, + &risp_default_fmt); +} + +static const struct v4l2_subdev_internal_ops risp_internal_ops =3D { + .init_state =3D risp_init_state, +}; + /* -----------------------------------------------------------------------= ------ * Async handling and registration of subdevices and links */ @@ -526,11 +580,12 @@ static int risp_probe(struct platform_device *pdev) =20 isp->subdev.owner =3D THIS_MODULE; isp->subdev.dev =3D &pdev->dev; + isp->subdev.internal_ops =3D &risp_internal_ops; v4l2_subdev_init(&isp->subdev, &rcar_isp_subdev_ops); v4l2_set_subdevdata(&isp->subdev, &pdev->dev); snprintf(isp->subdev.name, sizeof(isp->subdev.name), "%s %s", KBUILD_MODNAME, dev_name(&pdev->dev)); - isp->subdev.flags =3D V4L2_SUBDEV_FL_HAS_DEVNODE; + isp->subdev.flags =3D V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; =20 isp->subdev.entity.function =3D MEDIA_ENT_F_VID_MUX; isp->subdev.entity.ops =3D &risp_entity_ops; --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 4A746317161; Wed, 11 Mar 2026 13:54:15 +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=1773237259; cv=none; b=qj6GYcfOO5BzFDb4dBqeDmWGM2k3AbtgHmUbzBfTgcOnkzh2YppnKsrb3nPz/30IBV3X4Pbd4CoG5H9/do3WfrZN+hmw5dqXqoSaaC9S1FW3JscCPiGqzntlEzPT1IF4f+70h5XnEBlMi+EZ8KBnWtOopBGcFmSGVmxKm2h5z9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237259; c=relaxed/simple; bh=dhK3uD+Ut+8LJFD1lnLJkekf7X3cpMpIVzZnITUPmuc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AYK2VIrfDE2XeNSOECCUEGCDOFwDFGqSnAAxgzC69AxlBbxbGcSXiGfEDBfftm3BLE9muAoEngsOMgGJBSi/IjAQlp4cmWGPlBFf460wyNDOERY3Ql+dn0JZa64qFtEWjxM8tJEZoAnINhr2H1z30Cv47yWmbbEqH+5ajxNGUec= 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=h5rdd3cz; 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="h5rdd3cz" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 169C2128C; Wed, 11 Mar 2026 14:52:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237166; bh=dhK3uD+Ut+8LJFD1lnLJkekf7X3cpMpIVzZnITUPmuc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=h5rdd3czSzfAfHUs9WOj2UlsmnTWcy+tYdPad1DczEplw4etBF2YKJgHGD8eZU7I8 aQ/Wpl0uMbCob+8qxS0LTvJVtspavhXzn+iQdkVj42mpbLE6FpEF33I1Ui0MhSgqZe 5Z2K2DoboGeTHsGKiQILvyFnwbFJAATd7VnGpBFA= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:19 +0200 Subject: [PATCH v5 06/10] media: rcar-csi2: Add .get_frame_desc op 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: <20260311-rcar-streams-v5-6-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=2753; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=dhK3uD+Ut+8LJFD1lnLJkekf7X3cpMpIVzZnITUPmuc=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPrrTOLAUGOxedoQEbgj9MOVQz3DaNVjdbyb T/a2JxfMx2JAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6wAKCRD6PaqMvJYe 9frlEACcac8tUvrb4XW8UiiGPMsl4izz2BWsNP5i9RtUuhj3WEtGR18CX0Zcdt7fylxd7MpCl6R mKWuulRapCJbaO1Ds4KRwjmlDM/VLU0T8Dlhhv9m2DuQ6h2jWuZOLBaBaWXbCBQm/IGG3JOcchP jM7+CW10ARm4aUnETmmubVh33qDirAblK48BpHTs2kmKjIUmLr/gjzXytDeGY0EKR37XqNwQf8a jsW5bs4ztNumd2BVWwnnk+npneVcJNlv98daq6ZqR47rwvyjYH4Z+lhYvfXCjnYMD2ZwkSMDoor 0vulKRiF+B67HqY+ibI60qobbjxhhyNvCtmkpnnCqXVk5vuJvzvPeG0aiXYXCxyKKXhbqR1HtWr IYZJUc6NJlcl4EP0Rj74kDzSEVvD+vPy+75eQkr+cg4ujW3pm7TwlnFARzbr3keyFn7jgpTWioS w6dcb1js/AuHfI8ZWmpszrttWv1BjNtOqINLqwDJpLzuOtWcfKkhN5qpVI2NXh4QAnQYvvHZO/y wE8DpYgbxSu3wZWt/z9QYuqs/FmI4N8mkIZEADuUDt9ROfmjITffvbhlPPN+EaXAtveZhos86C5 4h1M//mzZT4+ztH72sGfCT2zlY9gRs2h7ggWlgb4MvTH1aIb4NQ6kGz7/uy/reFmQ+WjF1/JnGW Nkalc5qBHYvMclg== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Add v4l2_subdev_pad_ops.get_frame_desc() implementation. We also implement a fallback for the case where the upstream subdevice does not implement .get_frame_desc. It assumes a single stream with VC =3D 0 and DT based on the configured stream mbus format. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-csi2.c | 70 ++++++++++++++++++++++++++= ++++ 1 file changed, 70 insertions(+) diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/pla= tform/renesas/rcar-csi2.c index ad62c95c8f9a..b8baf7c65e90 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -1935,12 +1935,82 @@ static int rcsi2_set_pad_format(struct v4l2_subdev = *sd, return 0; } =20 +static int rcsi2_get_frame_desc_fallback(struct v4l2_subdev *sd, + unsigned int pad, + struct v4l2_mbus_frame_desc *fd) +{ + struct v4l2_subdev_route *route; + const struct rcar_csi2_format *format; + struct v4l2_subdev_state *state; + struct v4l2_mbus_framefmt *fmt; + int ret =3D 0; + + state =3D v4l2_subdev_lock_and_get_active_state(sd); + + if (state->routing.num_routes !=3D 1) { + ret =3D -EINVAL; + goto out; + } + + route =3D &state->routing.routes[0]; + + if (route->source_pad !=3D pad) { + ret =3D -EINVAL; + goto out; + } + + fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, + route->sink_stream); + if (!fmt) { + ret =3D -EINVAL; + goto out; + } + + format =3D rcsi2_code_to_fmt(fmt->code); + if (!format) { + ret =3D -EINVAL; + goto out; + } + + fd->num_entries =3D 1; + fd->type =3D V4L2_MBUS_FRAME_DESC_TYPE_CSI2; + fd->entry[0].stream =3D route->source_stream; + fd->entry[0].pixelcode =3D fmt->code; + fd->entry[0].bus.csi2.vc =3D 0; + fd->entry[0].bus.csi2.dt =3D format->datatype; + +out: + v4l2_subdev_unlock_state(state); + + return ret; +} + +static int rcsi2_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, + struct v4l2_mbus_frame_desc *fd) +{ + struct rcar_csi2 *priv =3D sd_to_csi2(sd); + int ret; + + if (WARN_ON(!priv->info->use_isp)) + return -ENOTTY; + + if (WARN_ON(pad !=3D RCAR_CSI2_SOURCE_VC0)) + return -EINVAL; + + ret =3D v4l2_subdev_get_frame_desc_passthrough(sd, pad, fd); + if (ret =3D=3D -ENOIOCTLCMD) + ret =3D rcsi2_get_frame_desc_fallback(sd, pad, fd); + return ret; +} + static const struct v4l2_subdev_pad_ops rcar_csi2_pad_ops =3D { .enable_streams =3D rcsi2_enable_streams, .disable_streams =3D rcsi2_disable_streams, =20 .set_fmt =3D rcsi2_set_pad_format, .get_fmt =3D v4l2_subdev_get_fmt, + + .get_frame_desc =3D rcsi2_get_frame_desc, }; =20 static const struct v4l2_subdev_ops rcar_csi2_subdev_ops =3D { --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 2856836309B; Wed, 11 Mar 2026 13:54:16 +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=1773237259; cv=none; b=aO6kc9h0SZjO9/YcsVa7B5gx54DQCoRYYxhmkpDRugzXG7mTAmSwJcloyCEHmhLIYzXxlEiQ114eIOAQv37OOB11YZH19kyg+VHle8/tNv4tqa0OlfSklmL5zgzLTUJQxrbH2mNIPRkiwsbNsMqc/myRpQh3uvMJFsI69w+Zf2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237259; c=relaxed/simple; bh=Iff4ud66u5yMU9jO70xyyuEbjXflyaiIAtTzW1C/x5c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZsJ1MQtUPVznKFBgGsV67N5SEnGBqrQzA/KA4j489a3z4lBbBZN5FfYjhqf6eBWugg86Dd1JLmUce9tdg5NwTyE2TWx7iiX87XEQ3MwnULUNGh1kNmwpQuzs4TkOIsqeBhJpaapLndMlKa3VfwVrb8MtaqRKgadWKGU9mEtGAqI= 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=OQKF6F4J; 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="OQKF6F4J" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C337712BB; Wed, 11 Mar 2026 14:52:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237167; bh=Iff4ud66u5yMU9jO70xyyuEbjXflyaiIAtTzW1C/x5c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=OQKF6F4JQ/3bODwURZgzSDe6NOO0madTFPCiFQ6hjm1t9Zs1mqbw8edkGU49ubKpc 5XGub6w3iNrTXivx2jWuGIomeRypZ6f0/GqmxB3zxICbR1Ktr0bmMsS+WlknmTWjcm nivhR0xE8oIcetcKmewfFNY6MzpVEhg0p03OqI3U= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:20 +0200 Subject: [PATCH v5 07/10] media: rcar-isp: Call get_frame_desc to find out VC & DT 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: <20260311-rcar-streams-v5-7-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=4963; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=Iff4ud66u5yMU9jO70xyyuEbjXflyaiIAtTzW1C/x5c=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPryjnJdi9KWXEqyLa/Fj2hooCfymXhXHgTI 7Gh1hau7T6JAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6wAKCRD6PaqMvJYe 9VB8D/sFjViv3UDevocZ8KVnv7Gwv4fIiH6yQA3/dHYhmnajqfxP3EPqHlJKvbge315qgPKViEY E8NGNohZC72HniJ7vdvDHOgpiCyzjnAoKLHo5QLVoN2WvW79WcFf7nvb0fN/19iFtKaTztLYJtk oVionhlZMaDfcC1e5ZEdTgarRmTIwA0F+TgDgHuA9XNpWCarQUCdloZ4oBJiu94mDJQB2Ah9er2 Jzv+YHkZhoUl+qrHH6WSmO+BRraq2p/LgP7rtjoC9FMPE3Q5S4qzrw6oQ7QoUOza9ETJAsPqOxp aUQzKiI9zVxmVXK80QrizcyoM0fgAhsf+fjWCb3ZZwFoPMSN71zgvPu/7AeJn0jBCANGxZpenIx LAcOg5H29cvUyhr5UFBwRNWs50XQDwLNna+55KocgduSS/M3dyYJwfx8inzHcd4csne6GRopPgU QmeMptXbJZp8XL0ltvQ/H7pQvygYBUyVyqAPXwrIPgzaDQ9Pdf/TdSl3xLIiTxknP7yFGILv77k gyX7nfeD0P4PW4RD86uBfw1hj89fPz18c6fmZ/1DbK3klLR0yK27c+1T6s7YvZKnNm3cmIuAavX lgG33orMPg0vYodI8wO2Hl1nFKf+5q5R+lTAWN5CH3lmLqlHr72N+3b3cnsK67WQN+2TwZ0dcI1 WOBNDf3sVVLznXA== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Call get_frame_desc to find out VC & DT, instead of hardcoding the VC routing and deducing the DT based on the mbus format. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-isp/csisp.c | 110 ++++++++++++++++----= ---- 1 file changed, 74 insertions(+), 36 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-isp/csisp.c b/drivers/medi= a/platform/renesas/rcar-isp/csisp.c index 8ac45516aa39..18d63731b6c0 100644 --- a/drivers/media/platform/renesas/rcar-isp/csisp.c +++ b/drivers/media/platform/renesas/rcar-isp/csisp.c @@ -42,6 +42,9 @@ #define ISPCS_DT_CODE03_EN0 BIT(7) #define ISPCS_DT_CODE03_DT0(dt) ((dt) & 0x3f) =20 +/* ISP has 12 channels, of which channels 4 to 11 are connected to VINs */ +#define ISPCS_NUM_CHANNELS 12 + struct rcar_isp_format { u32 code; unsigned int datatype; @@ -225,31 +228,82 @@ static void risp_power_off(struct rcar_isp *isp) pm_runtime_put(isp->dev); } =20 -static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *stat= e) +static int risp_configure_routing(struct rcar_isp *isp, + struct v4l2_subdev_state *state) { - const struct v4l2_subdev_route *route; - const struct v4l2_mbus_framefmt *fmt; - const struct rcar_isp_format *format; - unsigned int vc; - u32 sel_csi =3D 0; + struct v4l2_mbus_frame_desc source_fd; + struct v4l2_subdev_route *route; int ret; =20 - if (state->routing.num_routes !=3D 1) - return -EINVAL; + ret =3D v4l2_subdev_call(isp->remote, pad, get_frame_desc, + isp->remote_pad, &source_fd); + if (ret) + return ret; + + /* Clear the channel registers */ + for (unsigned int ch =3D 0; ch < ISPCS_NUM_CHANNELS; ++ch) { + risp_write_cs(isp, ISPCS_FILTER_ID_CH_REG(ch), 0); + risp_write_cs(isp, ISPCS_DT_CODE03_CH_REG(ch), 0); + } =20 - route =3D &state->routing.routes[0]; + for_each_active_route(&state->routing, route) { + struct v4l2_mbus_frame_desc_entry *source_entry =3D NULL; + const struct rcar_isp_format *format; + const struct v4l2_mbus_framefmt *fmt; + unsigned int i; + u8 vc, dt, ch; + u32 v; + + for (i =3D 0; i < source_fd.num_entries; i++) { + if (source_fd.entry[i].stream =3D=3D route->sink_stream) { + source_entry =3D &source_fd.entry[i]; + break; + } + } + + if (!source_entry) { + dev_err(isp->dev, + "Failed to find source frame desc entry for stream\n"); + return -EPIPE; + } + + vc =3D source_entry->bus.csi2.vc; + dt =3D source_entry->bus.csi2.dt; + /* Channels 4 - 11 go to VIN */ + ch =3D route->source_pad - 1 + 4; + + fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, + route->sink_stream); + if (!fmt) + return -EINVAL; + + format =3D risp_code_to_fmt(fmt->code); + if (!format) { + dev_err(isp->dev, "Unsupported bus format\n"); + return -EINVAL; + } + + /* VC Filtering */ + risp_write_cs(isp, ISPCS_FILTER_ID_CH_REG(ch), BIT(vc)); =20 - fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, - route->sink_stream); - if (!fmt) - return -EINVAL; + /* DT Filtering */ + risp_write_cs(isp, ISPCS_DT_CODE03_CH_REG(ch), + ISPCS_DT_CODE03_EN0 | ISPCS_DT_CODE03_DT0(dt)); =20 - format =3D risp_code_to_fmt(fmt->code); - if (!format) { - dev_err(isp->dev, "Unsupported bus format\n"); - return -EINVAL; + /* Proc mode */ + v =3D risp_read_cs(isp, ISPPROCMODE_DT_REG(dt)); + v |=3D ISPPROCMODE_DT_PROC_MODE_VCn(vc, format->procmode); + risp_write_cs(isp, ISPPROCMODE_DT_REG(dt), v); } =20 + return 0; +} + +static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *stat= e) +{ + u32 sel_csi =3D 0; + int ret; + ret =3D risp_power_on(isp); if (ret) { dev_err(isp->dev, "Failed to power on ISP\n"); @@ -263,25 +317,9 @@ static int risp_start(struct rcar_isp *isp, struct v4l= 2_subdev_state *state) risp_write_cs(isp, ISPINPUTSEL0_REG, risp_read_cs(isp, ISPINPUTSEL0_REG) | sel_csi); =20 - /* Configure Channel Selector. */ - for (vc =3D 0; vc < 4; vc++) { - u8 ch =3D vc + 4; - u8 dt =3D format->datatype; - - risp_write_cs(isp, ISPCS_FILTER_ID_CH_REG(ch), BIT(vc)); - risp_write_cs(isp, ISPCS_DT_CODE03_CH_REG(ch), - ISPCS_DT_CODE03_EN3 | ISPCS_DT_CODE03_DT3(dt) | - ISPCS_DT_CODE03_EN2 | ISPCS_DT_CODE03_DT2(dt) | - ISPCS_DT_CODE03_EN1 | ISPCS_DT_CODE03_DT1(dt) | - ISPCS_DT_CODE03_EN0 | ISPCS_DT_CODE03_DT0(dt)); - } - - /* Setup processing method. */ - risp_write_cs(isp, ISPPROCMODE_DT_REG(format->datatype), - ISPPROCMODE_DT_PROC_MODE_VCn(3, format->procmode) | - ISPPROCMODE_DT_PROC_MODE_VCn(2, format->procmode) | - ISPPROCMODE_DT_PROC_MODE_VCn(1, format->procmode) | - ISPPROCMODE_DT_PROC_MODE_VCn(0, format->procmode)); + ret =3D risp_configure_routing(isp, state); + if (ret) + return ret; =20 /* Start ISP. */ risp_write_cs(isp, ISPSTART_REG, ISPSTART_START); --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 4F16D35838B; Wed, 11 Mar 2026 13:54:21 +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=1773237265; cv=none; b=UABgn/dqMBuxAd0BuS/uze76vyh4sjx+jQogNGPQ03I8hhTGhT86ZE3gFuHfInGsvlPJ853OcxyiGJoPhOi6LptmDKLFaTY0FOJQRSg4OeZKMcVqNl0lPTIu1wAgKqCtVLmP3gOonttFUVwmw3BcBpoBTk7DV0V7ZYbwO6GPMe0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237265; c=relaxed/simple; bh=14Intlvp5GdTtMEvJXMxfu9GYJOwY69MsMo1wMxPhlM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FhStBhUsFvbqfKnkLGchbZcJTjD6JylNPHRm6h0Fy5uEWygPAdnn/ZVN0oUmOPh/CJip3KhNVq/u5ia3wMayLhik66PXi/V7TIta6qGFkhbhvmL/gXfkWxC6L2XJSqFgWaMm1v/smWtUMBVTvJjVcreaALMIvhIEC2vY7WBUDLM= 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=tw0qd7uj; 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="tw0qd7uj" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7A91512D6; Wed, 11 Mar 2026 14:52:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237168; bh=14Intlvp5GdTtMEvJXMxfu9GYJOwY69MsMo1wMxPhlM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tw0qd7ujs4x3aL4XGBJjLZUUNhAzej582Uim4t/JWfbP3WvqE+WZgjIoHh5BBqmAF PGc1WDCX2+GU9+TKXONwBJzeg4r1UTgW1pZKG8IzNsn0X6yqLyJi891/3jFIUgZ6kj eD9XjTQbAtpYbrbwlP4mP0UQ+iHKX2EvCFiw8fQc= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:21 +0200 Subject: [PATCH v5 08/10] media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3) 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: <20260311-rcar-streams-v5-8-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=4903; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=14Intlvp5GdTtMEvJXMxfu9GYJOwY69MsMo1wMxPhlM=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPrz7Co+FfxIfaG7q2NPVEENhpZEtQ2CKIdS J3w9SQpeh2JAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz6wAKCRD6PaqMvJYe 9RkKD/4+M/arhpeYkhMMGr31BqPzZmOZEP2TAtzskA88Q/FbYMM7ccE13XIAlAo6KepH7p8nzRt uuxnS7YEaUSh4pbTOLXQlg2KNKGrI8zGb5vPSWPjpQ43gx8t/UehHZcueimQIyjhZJgkXVj8FQ0 I8fMoVrL2rOd2wAOP+UV3ExRccwZismngG1jheJZpWMPZGIW6DVU3ZlUlUbzjkRa9DccZx742Z0 zz5cefJfiTwhEaO5TskdHNm0TDKRAzRJilhFhPMpcHVYAMYzD/8NTvkHB9CewJlp8XLA3+OduKb NzVqh5SRU/RCaYz204ze361kuNk6KcXRglOnZtumkiwVo7FjaNP/QVynpfuhKbLSsTx/Q4sfh24 KZgzs9aVtkaqhSpzyxWyz3487eDXMOAEobCg6Nev6XL8Uv1CLHGZ4pyD4G2dxJjzPSBSbyK5JAD YF4JeL72AaxJR+pyV7BdwsmcRQtkXZRrJG1tyP1RIXC0D0f7DtxjHFP2/GUs3jkPKsmdqDi/ik7 kkt6ac8YtgGL7qJLPy2mZrLaNJ7qCpkW9GX+vNIDIOC38rkIxa9uVt6JmTZ0+qHKtHIWAJhfjvw BB9s4E8QQhlUbWZLyCo1kfLK6V/1qnw7SC8xpgh9DrmtXRYm3eYx2mstQIfEI827RkSuKTnpaFV NxQ5EPvLFMqcKSg== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Call get_frame_desc to find out VC & DT, for Gen3 platforms, instead of hardcoding the VC routing and deducing the DT based on the mbus format. If the source subdevice doesn't implement .get_frame_desc, we use a fallback case where we assume there's a single stream with VC =3D 0 and DT based on the mbus format. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-csi2.c | 111 ++++++++++++++++++-------= ---- 1 file changed, 71 insertions(+), 40 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/pla= tform/renesas/rcar-csi2.c index b8baf7c65e90..831a5ec27233 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -1069,62 +1069,93 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv, struct v4l2_subdev_state *state) { - const struct v4l2_subdev_route *route; - const struct rcar_csi2_format *format; - u32 phycnt, vcdt =3D 0, vcdt2 =3D 0, fld =3D 0; - const struct v4l2_mbus_framefmt *fmt; + u32 phycnt, vcdt =3D 0, vcdt2 =3D 0; + u32 fld =3D FLD_DET_SEL(1); + struct v4l2_mbus_frame_desc source_fd; + struct v4l2_subdev_route *route; unsigned int lanes; - unsigned int i; int mbps, ret; + u8 ch =3D 0; =20 - /* Use the format on the sink pad to compute the receiver config. */ + ret =3D v4l2_subdev_call(priv->remote, pad, get_frame_desc, + priv->remote_pad, &source_fd); + if (ret && ret !=3D -ENOIOCTLCMD) + return ret; =20 - if (state->routing.num_routes !=3D 1) - return -EINVAL; + if (ret =3D=3D -ENOIOCTLCMD) { + /* Create a fallback source_fd */ + struct v4l2_mbus_frame_desc *fd =3D &source_fd; + const struct v4l2_subdev_route *route; + const struct rcar_csi2_format *format; + struct v4l2_mbus_framefmt *fmt; =20 - route =3D &state->routing.routes[0]; + if (state->routing.num_routes !=3D 1) + return -EINVAL; =20 - fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, - route->sink_stream); - if (!fmt) - return -EINVAL; + route =3D &state->routing.routes[0]; =20 - dev_dbg(priv->dev, "Input size (%ux%u%c)\n", - fmt->width, fmt->height, - fmt->field =3D=3D V4L2_FIELD_NONE ? 'p' : 'i'); + fmt =3D v4l2_subdev_state_get_format(state, route->sink_pad, + route->sink_stream); + if (!fmt) + return -EINVAL; =20 - /* Code is validated in set_fmt. */ - format =3D rcsi2_code_to_fmt(fmt->code); - if (!format) - return -EINVAL; + format =3D rcsi2_code_to_fmt(fmt->code); + if (!format) + return -EINVAL; =20 - /* - * Enable all supported CSI-2 channels with virtual channel and - * data type matching. - * - * NOTE: It's not possible to get individual datatype for each - * source virtual channel. Once this is possible in V4L2 - * it should be used here. - */ - for (i =3D 0; i < priv->info->num_channels; i++) { + memset(fd, 0, sizeof(*fd)); + + fd->num_entries =3D 1; + fd->type =3D V4L2_MBUS_FRAME_DESC_TYPE_CSI2; + fd->entry[0].stream =3D 0; + fd->entry[0].pixelcode =3D fmt->code; + fd->entry[0].bus.csi2.vc =3D 0; + fd->entry[0].bus.csi2.dt =3D format->datatype; + } + + for_each_active_route(&state->routing, route) { + const struct v4l2_mbus_frame_desc_entry *source_entry =3D NULL; + const struct v4l2_mbus_framefmt *fmt; + unsigned int i; u32 vcdt_part; =20 - if (priv->channel_vc[i] < 0) - continue; + for (i =3D 0; i < source_fd.num_entries; i++) { + if (source_fd.entry[i].stream =3D=3D route->sink_stream) { + source_entry =3D &source_fd.entry[i]; + break; + } + } =20 - vcdt_part =3D VCDT_SEL_VC(priv->channel_vc[i]) | VCDT_VCDTN_EN | - VCDT_SEL_DTN_ON | VCDT_SEL_DT(format->datatype); + if (!source_entry) { + dev_err(priv->dev, + "Failed to find stream from source frame desc\n"); + return -EPIPE; + } + + vcdt_part =3D VCDT_SEL_VC(source_entry->bus.csi2.vc) | + VCDT_VCDTN_EN | VCDT_SEL_DTN_ON | + VCDT_SEL_DT(source_entry->bus.csi2.dt); =20 /* Store in correct reg and offset. */ - if (i < 2) - vcdt |=3D vcdt_part << ((i % 2) * 16); + if (ch < 2) + vcdt |=3D vcdt_part << ((ch % 2) * 16); else - vcdt2 |=3D vcdt_part << ((i % 2) * 16); - } + vcdt2 |=3D vcdt_part << ((ch % 2) * 16); + + fmt =3D v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, + route->sink_stream); + if (!fmt) + return -EINVAL; + + dev_dbg(priv->dev, "Input size (%ux%u%c)\n", + fmt->width, fmt->height, + fmt->field =3D=3D V4L2_FIELD_NONE ? 'p' : 'i'); =20 - if (fmt->field =3D=3D V4L2_FIELD_ALTERNATE) - fld =3D FLD_DET_SEL(1) | FLD_FLD_EN(3) | FLD_FLD_EN(2) | - FLD_FLD_EN(1) | FLD_FLD_EN(0); + if (fmt->field =3D=3D V4L2_FIELD_ALTERNATE) + fld |=3D FLD_FLD_EN(ch); + + ch++; + } =20 /* * Get the number of active data lanes inspecting the remote mbus --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 4AE4E36DA1A; Wed, 11 Mar 2026 13:54:21 +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=1773237266; cv=none; b=BheiYdfTxSYID6Y+K6gOv4GCodfjOLs4Wl3NV9SGhZw4cKbeLdiCJFrCw+WOQ+Nkelzxme9IE66B2Vg2uy2Ny6QiU/AlnA0utAp/kXtIE68yX/ytQoQCKdtYkIsAbon/n5GqaMBM9OtQt8oe0pKhSqJz5Ng63bRm2OcLwof/w1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237266; c=relaxed/simple; bh=OJ0cPcpsl2j4Ke/j3qEGXccRhFAy5Qw4fqRwl/curv0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KSNTqe+M/6BBIMgG/4uDsZ85peXjaTiQJ6rXnDOW/W/9xNomYT6eFy9e7W+dFKhi4hAL6M3IWl7zDaT+f6Ls2gniVA2TQwABE7cOlsytZ3OMr1JIRC/fpReiQAdE16yHLyTAT83CX8PLgESHJ7GOeHqpiFWGQrx/2vnAhVTdiVk= 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=cikwbb8N; 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="cikwbb8N" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 370F613D9; Wed, 11 Mar 2026 14:52:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237168; bh=OJ0cPcpsl2j4Ke/j3qEGXccRhFAy5Qw4fqRwl/curv0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cikwbb8N3bPUFKxRibkX6NHoU+uzAlmIl7ie1rOdw4EfCqQXKBh4F+SoEf/GFzAwi LHbSE4zXeqpqJsZ523aUnF7m80tXwkxQI1ljsHcTu2lrW08UK6htHVftB6ke3GfNZk aygOk8Xv8GI5Gz9x+bl9pwi1hxfaRGyeGLp98zKc= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:22 +0200 Subject: [PATCH v5 09/10] media: rcar-csi2: Add full streams support 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: <20260311-rcar-streams-v5-9-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=4411; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=OJ0cPcpsl2j4Ke/j3qEGXccRhFAy5Qw4fqRwl/curv0=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPsAtTPHtVFFfVY5Vd0vjw1PyjrLEsNMdlx1 kMbGgLUl0SJAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz7AAKCRD6PaqMvJYe 9Z2DEACsr0edT7xFiLEPzf+AQ03s5JPeFYuXRxykM8pe1mNqQNdv7WxsoepM/M7O29+Dou5m7ds 0GBUJZJLxY1KPsYwyVeRpUBlrw/xYT30DPJ1Q8XdQlyrZbP8lq/IJ/c3ayum34CPzv74GVNvKkv rrAJjTpn575KOoOFKHSK2mlhUpxJkkH8xsIdx43u29WIsKNMduG3MROJOIc6ZMiIKzDrm7iYgSC 2q43T4+uUosDHff9TtImmMHWCcUWDhsPqrF4qrNpzGLyvUD9ElDImlM0t0wU5Xzk1i91JzpfmTP 0O6qUdtcR1qTa8MQKEHdHREtl5PuNzJQnT8LJHp/3OHkUZH/mr7M2uTEAYosTmxrqz/mX64bIQP xhCqTEcE+vy8XCw7G/cuQIT/0HlpiYRQm1FCwQvXJhnlXn1Jhn5GuY7MuxfruHWwc2W/WOazrs5 b0mHeX/DJj/2Sfo2C2kUCep/rtGcSBNFzgo4q8VcRga5BACHsbkN6n9ohVTVX1MaN8tqo96CtoI nc8XFYAMM8e8BEHHiPB8QfwdBenbOxlzPrPWEH2JlIKP1b03988k6B8YfnTxGF73AomiLoP76Xx cAfYNv7QE4LkS0ym7PLBY4VgJ414beLOJv4hdrpvs/z6Y1MYd/N27tdWJamVbNVx+8wSGPOBAYq 5MIToBnweftqXuw== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Add the missing pieces to enable full streams support: - Add set_routing - Drop the explicit uses of a single stream, and instead use the streams mask. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-csi2.c | 75 ++++++++++++++++++++++----= ---- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/pla= tform/renesas/rcar-csi2.c index 831a5ec27233..04afde4fe195 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -702,6 +702,17 @@ static const struct rcar_csi2_format rcar_csi2_formats= [] =3D { }, }; =20 +static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt =3D { + .width =3D 1920, + .height =3D 1080, + .code =3D MEDIA_BUS_FMT_RGB888_1X24, + .colorspace =3D V4L2_COLORSPACE_SRGB, + .field =3D V4L2_FIELD_NONE, + .ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT, + .quantization =3D V4L2_QUANTIZATION_DEFAULT, + .xfer_func =3D V4L2_XFER_FUNC_DEFAULT, +}; + static const struct rcar_csi2_format *rcsi2_code_to_fmt(unsigned int code) { unsigned int i; @@ -1883,10 +1894,8 @@ static int rcsi2_enable_streams(struct v4l2_subdev *= sd, u64 source_streams_mask) { struct rcar_csi2 *priv =3D sd_to_csi2(sd); - int ret =3D 0; - - if (source_streams_mask !=3D 1) - return -EINVAL; + u64 sink_streams; + int ret; =20 if (!priv->remote) return -ENODEV; @@ -1897,8 +1906,13 @@ static int rcsi2_enable_streams(struct v4l2_subdev *= sd, return ret; } =20 + sink_streams =3D v4l2_subdev_state_xlate_streams(state, + RCAR_CSI2_SOURCE_VC0, + RCAR_CSI2_SINK, + &source_streams_mask); + ret =3D v4l2_subdev_enable_streams(priv->remote, priv->remote_pad, - BIT_ULL(0)); + sink_streams); if (ret) { if (priv->stream_count =3D=3D 0) rcsi2_stop(priv); @@ -1915,19 +1929,22 @@ static int rcsi2_disable_streams(struct v4l2_subdev= *sd, u32 source_pad, u64 source_streams_mask) { struct rcar_csi2 *priv =3D sd_to_csi2(sd); + u64 sink_streams; int ret; =20 - if (source_streams_mask !=3D 1) - return -EINVAL; - if (!priv->remote) return -ENODEV; =20 if (priv->stream_count =3D=3D 1) rcsi2_stop(priv); =20 + sink_streams =3D v4l2_subdev_state_xlate_streams(state, + RCAR_CSI2_SOURCE_VC0, + RCAR_CSI2_SINK, + &source_streams_mask); + ret =3D v4l2_subdev_disable_streams(priv->remote, priv->remote_pad, - BIT_ULL(0)); + sink_streams); if (ret) return ret; =20 @@ -1966,6 +1983,34 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *= sd, return 0; } =20 +static int rcsi2_set_routing(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + enum v4l2_subdev_format_whence which, + struct v4l2_subdev_krouting *routing) +{ + struct rcar_csi2 *priv =3D sd_to_csi2(sd); + int ret; + + if (priv->info->use_isp) { + ret =3D v4l2_subdev_routing_validate(sd, routing, + V4L2_SUBDEV_ROUTING_ONLY_1_TO_1); + } else { + ret =3D v4l2_subdev_routing_validate(sd, routing, + V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 | + V4L2_SUBDEV_ROUTING_NO_SOURCE_MULTIPLEXING); + } + + if (ret) + return ret; + + ret =3D v4l2_subdev_set_routing_with_fmt(sd, state, routing, + &rcar_csi2_default_fmt); + if (ret) + return ret; + + return 0; +} + static int rcsi2_get_frame_desc_fallback(struct v4l2_subdev *sd, unsigned int pad, struct v4l2_mbus_frame_desc *fd) @@ -2041,6 +2086,7 @@ static const struct v4l2_subdev_pad_ops rcar_csi2_pad= _ops =3D { .set_fmt =3D rcsi2_set_pad_format, .get_fmt =3D v4l2_subdev_get_fmt, =20 + .set_routing =3D rcsi2_set_routing, .get_frame_desc =3D rcsi2_get_frame_desc, }; =20 @@ -2061,17 +2107,6 @@ static int rcsi2_init_state(struct v4l2_subdev *sd, }, }; =20 - static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt =3D { - .width =3D 1920, - .height =3D 1080, - .code =3D MEDIA_BUS_FMT_RGB888_1X24, - .colorspace =3D V4L2_COLORSPACE_SRGB, - .field =3D V4L2_FIELD_NONE, - .ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT, - .quantization =3D V4L2_QUANTIZATION_DEFAULT, - .xfer_func =3D V4L2_XFER_FUNC_DEFAULT, - }; - static const struct v4l2_subdev_krouting routing =3D { .num_routes =3D ARRAY_SIZE(routes), .routes =3D routes, --=20 2.43.0 From nobody Tue Apr 7 22:10:52 2026 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 2EAD83BADA0; Wed, 11 Mar 2026 13:54:26 +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=1773237271; cv=none; b=HgqE908Sako+ayyW6cPWzpwkhFSYwLgSdua/2xgt3EVambvmpjzPNfPgaYdlTw0+gRtyLGrhp/uS84FBfT3+xQyVdb1lbnRVbcpZ3U9gdNm41+XM0kxWPpwLYHXj9MDguumFJbI23IMbdG3z8ctQDNv2WfbKr++20leEowaWKEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773237271; c=relaxed/simple; bh=embxSZM+qI3VcYvBtFLYUs5JuQl17I6GNG7H3/7KSKk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=i5HSGxY2ThbTqrk6VzMc+KUyH6C+4UH5mezGd+OWZxGj4Mrhx9jFIwYmYri9ELbbpAVSwfiKKfY5UxXHoGbtgxaZC/ilGUd8Z43SZHHtV1tAArcxjQ96e53IzBMfys4qFHCwK/FyWX4S+pNJ26tXJTOplKf8YRi2q4ZjTwYW0Fs= 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=tdVkXUHC; 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="tdVkXUHC" Received: from [127.0.1.1] (91-158-153-178.elisa-laajakaista.fi [91.158.153.178]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E70E4191A; Wed, 11 Mar 2026 14:52:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1773237169; bh=embxSZM+qI3VcYvBtFLYUs5JuQl17I6GNG7H3/7KSKk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tdVkXUHCxu0qOJI5i/jj/aLgA94EzXAJ8PlHCnA3WrbbJw4frfRZ65rN2TYwXQ5RD OZchqattXqp2XTdR4TIX6cX07LrXiSfPr1BKCbxsbU/THHX7zpX0pyOIg4mDUSoEgk Vs4D5NemeOlM0a3cjvY8L7F78CxnelIvbmzOHZ0k= From: Tomi Valkeinen Date: Wed, 11 Mar 2026 15:53:23 +0200 Subject: [PATCH v5 10/10] media: rcar-isp: Add full streams support 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: <20260311-rcar-streams-v5-10-3e6c957d7567@ideasonboard.com> References: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> In-Reply-To: <20260311-rcar-streams-v5-0-3e6c957d7567@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Laurent Pinchart , Jacopo Mondi , Tomi Valkeinen X-Mailer: b4 0.15-dev-c25d1 X-Developer-Signature: v=1; a=openpgp-sha256; l=3025; i=tomi.valkeinen+renesas@ideasonboard.com; h=from:subject:message-id; bh=embxSZM+qI3VcYvBtFLYUs5JuQl17I6GNG7H3/7KSKk=; b=owEBbQKS/ZANAwAIAfo9qoy8lh71AcsmYgBpsXPsrDWN10TX3pm7T4HOaSE7tK0T7FYOyjVEk +fMTcCedr2JAjMEAAEIAB0WIQTEOAw+ll79gQef86f6PaqMvJYe9QUCabFz7AAKCRD6PaqMvJYe 9chxEACBKMdF9ygz+FxiOjIl+xGI7vsuv/MBK+54fTqxSf0Zf0DdPggFzSLSSwIK4UNBzD2USRW b9DldzG+3RluPyL1YwmTrbHPmEoBCxR1tkyJSAqMqKnVE6DXkRGzXKukrpdnkCaiwE75wWvw0D8 9JA16v9UCV0GMxgkytAyQDi/bPXfRQVj12fs9uzQ9lhlfQxXjRmDmRP8rXwkME7B7l8TKxD/Y0z 5bRrJtAhE6NzACSRw77gxJWtKBF9nwuVGQ59CLiWaoqAoI0F42mB9zp+F2u7P0qgXl9pF5bwrTV G6SlE4/jCzLVBUPqQPAJb8QqOvKkB6u2ZGyx+81P8Bv9aBp2Oa9OWEo9s718mpI79NhQYur1Yn/ of5B7Xy/TcoUiYgkEdRcD8vhjQfvud7+pe0LG0XhfHkKEQ/s/Bi4hzISREtclHDmFtrWSrql0Ot z4YrX2Tup+o6F8jdHnbdm+VTdc+hGumX3A9aw6IUBFEKsZPR07J7EByOa3EWTEbcWoXlKjmUv9d JgTY/ZUzlSTeP+lJf+98jn0bnEJwoE5CVoNm4hEQsErkmTcSKvCfDV2/FMHoJYYTdskmtemGvj9 QH+GjHN4W1AfBs5FkbH8sgu/lD8VNc9Saz3jRC/EQ5R2uAKlcPsCG8FTXoG1iB/5S6COm7cldqB ANUqaXT6kKAJERQ== X-Developer-Key: i=tomi.valkeinen+renesas@ideasonboard.com; a=openpgp; fpr=C4380C3E965EFD81079FF3A7FA3DAA8CBC961EF5 Add the missing pieces to enable full streams support: - Add set_routing - Drop the explicit uses of a single stream, and instead use the streams mask. Signed-off-by: Tomi Valkeinen --- drivers/media/platform/renesas/rcar-isp/csisp.c | 39 +++++++++++++++++++++= ++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-isp/csisp.c b/drivers/medi= a/platform/renesas/rcar-isp/csisp.c index 18d63731b6c0..e4b9a6204815 100644 --- a/drivers/media/platform/renesas/rcar-isp/csisp.c +++ b/drivers/media/platform/renesas/rcar-isp/csisp.c @@ -340,6 +340,7 @@ static int risp_enable_streams(struct v4l2_subdev *sd, u64 source_streams_mask) { struct rcar_isp *isp =3D sd_to_isp(sd); + u64 sink_streams; int ret; =20 if (source_streams_mask !=3D 1) @@ -354,8 +355,13 @@ static int risp_enable_streams(struct v4l2_subdev *sd, return ret; } =20 + sink_streams =3D v4l2_subdev_state_xlate_streams(state, + source_pad, + RCAR_ISP_SINK, + &source_streams_mask); + ret =3D v4l2_subdev_enable_streams(isp->remote, isp->remote_pad, - BIT_ULL(0)); + sink_streams); if (ret) { if (isp->stream_count =3D=3D 0) risp_stop(isp); @@ -372,6 +378,7 @@ static int risp_disable_streams(struct v4l2_subdev *sd, u64 source_streams_mask) { struct rcar_isp *isp =3D sd_to_isp(sd); + u64 sink_streams; int ret; =20 if (source_streams_mask !=3D 1) @@ -380,8 +387,12 @@ static int risp_disable_streams(struct v4l2_subdev *sd, if (!isp->remote) return -ENODEV; =20 - ret =3D v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, - BIT_ULL(0)); + sink_streams =3D v4l2_subdev_state_xlate_streams(state, + source_pad, + RCAR_ISP_SINK, + &source_streams_mask); + + ret =3D v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, sink_st= reams); if (ret) return ret; =20 @@ -423,12 +434,34 @@ static int risp_set_pad_format(struct v4l2_subdev *sd, return 0; } =20 +static int risp_set_routing(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + enum v4l2_subdev_format_whence which, + struct v4l2_subdev_krouting *routing) +{ + int ret; + + ret =3D v4l2_subdev_routing_validate(sd, routing, + V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 | + V4L2_SUBDEV_ROUTING_NO_SOURCE_MULTIPLEXING); + if (ret) + return ret; + + ret =3D v4l2_subdev_set_routing_with_fmt(sd, state, routing, + &risp_default_fmt); + if (ret) + return ret; + + return 0; +} + static const struct v4l2_subdev_pad_ops risp_pad_ops =3D { .enable_streams =3D risp_enable_streams, .disable_streams =3D risp_disable_streams, .set_fmt =3D risp_set_pad_format, .get_fmt =3D v4l2_subdev_get_fmt, .link_validate =3D v4l2_subdev_link_validate_default, + .set_routing =3D risp_set_routing, }; =20 static const struct v4l2_subdev_ops rcar_isp_subdev_ops =3D { --=20 2.43.0