From nobody Thu Apr 2 15:42:26 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 066233783AA; Fri, 27 Mar 2026 17:10:40 +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=1774631442; cv=none; b=nc8e9kdGPq1tskYFEwur6k3Czbb64pSTz1u49dq/dGm3D7l2Vrm5pNrAt3iQNJl7uPLLAyy66UBeG9G8ViQTdB07S/klmStwwSuK4nd8lvEBuUhh4j2KDt74Js48o/kfUzuiE7lGPfifsG+wlhy7IqsF74d3kFha5w88aKDjRu4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631442; c=relaxed/simple; bh=6Cd2K6dLKZ3zuzWnWJ6JjOXVt6ngUet31cvKhNwhtFk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YbfNoWGuFIf6fVrLp+OuBpiOGMBKQzlX5V6ImFZYcxKabCniKCw8RzpeMd+ATQLLJjyCtN6gaJg7dHkzL+0v40nc6xkjDtD5/jdZ0IZNiiwalipgupH1o+Sv5p7pZvdCuQs2ogiEckhZ9CZP0yWEDUjY8V0dCSulxm5XhkFqgfU= 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=CjKEySTp; 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="CjKEySTp" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CB1A821D0; Fri, 27 Mar 2026 18:09:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631357; bh=6Cd2K6dLKZ3zuzWnWJ6JjOXVt6ngUet31cvKhNwhtFk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=CjKEySTpjha/xlgnn4Ag6KDW+9fB/WHbQQUo+Ho6fmnnnAq3Aua7S7k+IVS8tQ45+ Z18RsFWg/qh8EnasXSaoe/8wS+7EU7m07Wxy2NAWbl+so3AC+zQd0P6ahcJuvozkDw 4G0wtDS6QoEvPRpqNDrBUPrzk7X0TerSHMcPy/PA= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:06 +0100 Subject: [PATCH 01/14] media: rzg2l-cru: Skip ICnMC configuration when ICnSVC is used 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: <20260327-b4-cru-rework-v1-1-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , stable@vger.kernel.org, Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2644; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=D1KBUVsVhQdrytLBtX5FtOsJvMx7kkKZJo71L6YH7Kg=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroJOZj7020XjctDOYMfyDy2BlS3YKc9PJ9L+ +yhTw0btDuJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CQAKCRByNAaPFqFW PBRFD/0d8FBI76dUrJ85X3NfoDGojJlNhYLEynqaXxC6TwgZNusMjd2C1a9o4gTSJ2CS9QAb+na FZPcJCOLRyvD9VzoM3ZQpc9BYLH565MAHvlbMLldPY4m1gghhTJ/mP6NRV6s0tKxECJk5ExqW8p FLz00Rsil2gksEOjqlEaZefKXSJAMTj46+p/xrGnCCK9pJ79mRiu90XtvcF9fy4fbuKwyM1PuSK Kg0gR7S5DrHnO9MM8HbwXCFRSff8Q6ju7d564IHJb9p2FYfVBuT/U0bff7fERD3V2O6b38mZc2Q Ot8b10f73pWhgpCklFGL/1rOFxqk1PwkFzNx2L+T+JUiHpnOYofPvcs+DzVW/2bmsrCINXaWhUZ y9EmVSj8On6HMzCjv2h57nramZnVAjdiSpeUfVk9L/b7XcFeLe5Ocq7j15HwLj8cVlQOdWPSQkf miJFKdGAE+mxl/WxAUrxEEMRs+mTQzsquVTEcx8EIby4okp3n50acRJz9CKqsqOOFGmZiR3Mmi0 XXHfA5Sk+nCkpfElgEyZCK/Pko7be1eB12h44nZt/cz68wfYZb/NInr3dOXTPS0IB+BA40kpWNW fS7ZTq0R2cRKzPppnh4Fwwfty22x0Fo4Pabz0wvUEUlX/go6pZjoHIdBm+BN+LUEU1z2s9TYtvA rVCkIDM0W8Uh35w== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Tommaso Merciai When the CRU is configured to use ICnSVC for virtual channel mapping, as on the RZ/{G3E, V2H/P} SoC, the ICnMC register must not be programmed. Return early after setting up ICnSVC to avoid overriding the ICnMC register, which is not applicable in this mode. This prevents unintended register programming when ICnSVC is enabled. Fixes: 3c5ca0a48bb0 ("media: rzg2l-cru: Drop function pointer to configure = CSI") Cc: stable@vger.kernel.org Signed-off-by: Tommaso Merciai [Rework to not break image format programming] Signed-off-by: Jacopo Mondi Reviewed-by: Lad Prabhakar --- .../media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h | 1 + drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 17 +++++++++++--= ---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h b/dr= ivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h index a5a57369ef0e..10e62f2646d0 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h @@ -60,6 +60,7 @@ #define ICnMC_CSCTHR BIT(5) #define ICnMC_INF(x) ((x) << 16) #define ICnMC_VCSEL(x) ((x) << 22) +#define ICnMC_VCSEL_MASK GENMASK(23, 22) #define ICnMC_INF_MASK GENMASK(21, 16) =20 #define ICnMS_IA BIT(2) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 162e2ace6931..6aea7c244df1 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -262,19 +262,24 @@ static void rzg2l_cru_csi2_setup(struct rzg2l_cru_dev= *cru, u8 csi_vc) { const struct rzg2l_cru_info *info =3D cru->info; - u32 icnmc =3D ICnMC_INF(ip_fmt->datatype); + u32 icnmc =3D rzg2l_cru_read(cru, info->image_conv) & ~(ICnMC_INF_MASK | + ICnMC_VCSEL_MASK); + icnmc |=3D ICnMC_INF(ip_fmt->datatype); =20 + /* + * VC filtering goes through SVC register on G3E/V2H. + * + * FIXME: virtual channel filtering is likely broken and only VC=3D0 + * works. + */ if (cru->info->regs[ICnSVC]) { rzg2l_cru_write(cru, ICnSVCNUM, csi_vc); rzg2l_cru_write(cru, ICnSVC, ICnSVC_SVC0(0) | ICnSVC_SVC1(1) | ICnSVC_SVC2(2) | ICnSVC_SVC3(3)); + } else { + icnmc |=3D ICnMC_VCSEL(csi_vc); } =20 - icnmc |=3D rzg2l_cru_read(cru, info->image_conv) & ~ICnMC_INF_MASK; - - /* Set virtual channel CSI2 */ - icnmc |=3D ICnMC_VCSEL(csi_vc); - rzg2l_cru_write(cru, info->image_conv, icnmc); } =20 --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 CDF6E37880A; Fri, 27 Mar 2026 17:10:41 +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=1774631443; cv=none; b=iaO7O+pkXbiefsued/Ac3LmRsVKhPywsUvVKzvLjDmAbFeCL/8wOprhUaYv5FznM/CM5OBKuD5F29ze1CdxeyEWIvM2NhxWLsCGQp3tUE7oS9CrKawUrtlsF+FRotAvD7O2kwSvxi3BXVT5nBs2ZQcADl4MDSDXHXXy/sl3q2Bg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631443; c=relaxed/simple; bh=hyxIgbS0ksdduwZ5rmcnHJuSmMt+tqN5LMFSwZj36u8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fVQx3YgQlASgIdiuzo1Ro9zTVshLAghTzJYEgwVkvmAohcfBJxs6d8VvG4i74dVhNlZ8PdJHuj5mfKlpTWiJq8HjBS8oG+l9XWkqGkzlvSSn8F28ebPIhN1cdNRUEleVmwvuqgOT2ay+hVqJCrysMSUtvWkaJfKRMBbNpSO/S1w= 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=goQxBrEt; 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="goQxBrEt" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 763C82664; Fri, 27 Mar 2026 18:09:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631357; bh=hyxIgbS0ksdduwZ5rmcnHJuSmMt+tqN5LMFSwZj36u8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=goQxBrEttUPOCv4J/lUjISoHrjVcfzrDe84liiT7qlj03wnGMO/E6um3jVdttYsVa YXmoXj7toQoqKnDMdxdz5o6BTqZ/vr4RiF5CcQ5mp5p9Le7U+/L+j64SKMDA4GfVRU NADforzV/MS/SNPbpSHFbqbW+k8tAeGSrxXjVf5Y= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:07 +0100 Subject: [PATCH 02/14] media: rzg2l-cru: Use only frame end interrupts 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: <20260327-b4-cru-rework-v1-2-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2652; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=PNpmp4iW823YzhydOXvGlJgfC5bJODk7pvJyX7lu7aA=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroJLi/cr4hF+7atJRq4JUWkHDFFtmrLTdpWk uCfKd10VG+JAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CQAKCRByNAaPFqFW PMxeD/9QQv4JHapnZu73Nl6X5Oehv18BdrUwshtWjYvIiQ9mUH3v9YEO+/bvsTGwW6Zq/v6gssZ tKdaKE/CZ6P2jTfjpM00lul8a89XvRxEigWNMQ7RFWVGYaxuI2cB62atSJOpzcumnfalkIV3t1W ncaaqlnU9YRPnf93hZqEnGIbigOzy/N1W30kxtPJRN4DkUDmjAozK7LxpmDAA4oXLDrg+sHk0ra mreCJhJOPVPDKA3ZWrqo5ZsGnaNd0tjl89ByK9fnj0RQFB8EwtegDakstEd+f+W/qSbsGIeNUxm 72lRqbBePUJj8r08WLotYQ5xTMhSZMiSkE4QZpxabe2iPd1gF2pPvmrugK+wHpjg/1Maavaz4Zr NO8axXHsvTbnS9pFY96xU+b5jnJgsGiINu/cpVDr7S1TMEfOLtn+52KarjpmRPy1yo4+hKQLgX4 dzh7jgL/OQTWP/UJi5woMM+P26qGUGy8h8jIKbUwAtBi54+5ZgXtQ5VQbzrMKxNsw6+rBxWOWdE rlE+j1qeaMZ0ivOXHvOiNrBGRo2sDsRYMCUjG4aPOvH/qLXtQG+q1oQsPWK8DbkFMngKVL+d5i9 98cZ3SllxTnd1sQzZoV4Sz4pfhZJdv1bdojbsQmmOgEyN6tFAKU1OwzB65F8unQZRw8CwOmL1zu wYfVxWIhSAFCIcw== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Tommaso Merciai On RZ/G3E the CRU driver relies on the frame end interrupt to detect the completion of an active frame transfer when stopping DMA. Update the driver to enable only frame end interrupts (CRUnIE2_FExE), dropping the usage of the frame start interrupts, which is not required for this operations flow. Fix the interrupt status handling in the DMA stopping state by checking the correct frame end status bits (FExS) instead of the frame start one (FSxS). Add a dedicated CRUnINTS2_FExS() macro to reflect the actual register bit layout. This ensures that DMA stopping is triggered by the intended frame end events and avoids incorrect interrupt handling. Signed-off-by: Tommaso Merciai Signed-off-by: Jacopo Mondi Reviewed-by: Lad Prabhakar --- drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h | 1 + drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h b/dr= ivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h index 10e62f2646d0..5a6ac9cb09a4 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs.h @@ -19,6 +19,7 @@ =20 #define CRUnINTS_SFS BIT(16) =20 +#define CRUnINTS2_FExS(x) BIT(((x) * 3) + 1) #define CRUnINTS2_FSxS(x) BIT(((x) * 3)) =20 #define CRUnRST_VRESETN BIT(0) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 6aea7c244df1..98b6afbc708d 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -440,7 +440,6 @@ static int rzg2l_cru_get_virtual_channel(struct rzg2l_c= ru_dev *cru) =20 void rzg3e_cru_enable_interrupts(struct rzg2l_cru_dev *cru) { - rzg2l_cru_write(cru, CRUnIE2, CRUnIE2_FSxE(cru->svc_channel)); rzg2l_cru_write(cru, CRUnIE2, CRUnIE2_FExE(cru->svc_channel)); } =20 @@ -700,10 +699,10 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) } =20 if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPING) { - if (irq_status & CRUnINTS2_FSxS(0) || - irq_status & CRUnINTS2_FSxS(1) || - irq_status & CRUnINTS2_FSxS(2) || - irq_status & CRUnINTS2_FSxS(3)) + if (irq_status & CRUnINTS2_FExS(0) || + irq_status & CRUnINTS2_FExS(1) || + irq_status & CRUnINTS2_FExS(2) || + irq_status & CRUnINTS2_FExS(3)) dev_dbg(cru->dev, "IRQ while state stopping\n"); return IRQ_HANDLED; } --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 1E2D038B7DE; Fri, 27 Mar 2026 17:10:43 +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=1774631447; cv=none; b=JRoJMJF75UNF+yfFT8RRkTNivS6C7GT0zcZiCwXl78n9m3EKzqq4Dnzq2FM9UjXawjHY+HhQOa+bAv5YFRZEZBgmuqSRwz7BfDGmmtAyNHl+jFsM0e4NMwHszR8Q8XukSqs6bpOqFwyK1cbTTpI0k2zhWup+Sxm8q/cvOXXTRYM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631447; c=relaxed/simple; bh=MxvJxr3tjV6KouUxD2dM4s/fwnpeEv5SUNCOEJn7yEM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aPgAVKpKqM56icO3KXe4zBUpDUlzuzyjKI3U9+JuWcK+UhCSQNxJvJJMk7BJJz0wone7PncpOu/x9HjWZ7vFVD/ZzjQ+hMN+QMR/tcd1fVuQLZuZrzbNWCsH9YcsMscOqwN/8azFbUg+SaJoIXBskyvKon0+0u62swc5ZlRbyKA= 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=v3V8GpDl; 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="v3V8GpDl" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 146A52F85; Fri, 27 Mar 2026 18:09:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631358; bh=MxvJxr3tjV6KouUxD2dM4s/fwnpeEv5SUNCOEJn7yEM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=v3V8GpDlH1fSVZ2TMvzlOEZC2H0pnThpOlEn0lm1ITi0V2iBeRxnmyg/6hiURhEGy l9OxspKHtS+1oQHNoRrMerE1t2HOpviLpnHfXBWoVVinL4C2MS1Bjke035oO9Sm9lM ilrFbQ2DT2B1LIjdMfJyL9dxJo6bROZkXoJZJwVI= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:08 +0100 Subject: [PATCH 03/14] media: rzg2l-cru: Modernize spin_lock usage with cleanup.h 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: <20260327-b4-cru-rework-v1-3-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4664; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=Kpy40z4eXxLX6E90WDM9lgvUSvCSjh+mGWRH1VWJQ6c=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroJprL+CuO4cNzJ9I7F1LdJJgUKLrrUE3KbQ QrW5cXQnzWJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CQAKCRByNAaPFqFW PKowD/9M0GhE7CH5Xau+NbCq7FFFb6nPiD1QJj5y5qLpqN1Nx4EF/lOtUQJvcvBOD44kzsiPsVX mow/4E0bkzHhhMD2Ur2oY01ia0l7I7KndONglXy5wg5C7Smo+xRoPbOiaEGDBg0mAz+AQzAqmE+ AR1P9/zpeW6OmRSFqdyobsS00F1IyLKH07de6aO0eDmL+SdEluBUajpQjsKWrkg5/+aF35N+Eyz hFz/CyQSk21EpBEBPalIrIW9YEvQNLYjZZkS/YyczNAQrIPZhwsQXFFL99a0uD8lLe+7n20j8UA C4kHpeJ9gZidgCvAq1Je8Q8wL9REtfK+sXMUqCpLCGsIefSyZwduyaRxJNLcRB836QCRAMbgu/G ZOhPj3GIOEqAq0mBuSmUiTrFyAZ2TAC4bad4HaN+LnEMYuIrwxyQByN1zE0fUxnhH8x1SfO9oP+ 77jJQ0DE+fAelQHs3Kq9b2p5HiUliibdbMWpRAgvYkal42w/Fvrsw6hsz0DrU2jRjkX1N9gC6A7 fUvIE72oGkcFblDvh7cVxN6Wa75KkdTj0dQyiNi4G7YyNd9YrEZTRDpNRTh9wKtabrchJ+aMCAt 87WYOkXv02rcNTRVjr7kpM+kTvgSy72Y5JZ61vVae0N5tzePJm8IcSA9XEdJs/QKfJSFZYUfs+Y VO6M+iQBDnf9tTQ== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi Use more modern constructs from cleanup.h to express the locking sequences in the rzg2l driver. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Lad Prabhakar Reviewed-by: Tommaso Merciai Tested-by: Tommaso Merciai --- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 32 +++++++-----------= ---- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 98b6afbc708d..2d7ac9f37291 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -11,6 +11,7 @@ * Copyright (C) 2008 Magnus Damm */ =20 +#include #include #include #include @@ -110,10 +111,10 @@ static void return_unused_buffers(struct rzg2l_cru_de= v *cru, enum vb2_buffer_state state) { struct rzg2l_cru_buffer *buf, *node; - unsigned long flags; unsigned int i; =20 - spin_lock_irqsave(&cru->qlock, flags); + guard(spinlock_irqsave)(&cru->qlock); + for (i =3D 0; i < cru->num_buf; i++) { if (cru->queue_buf[i]) { vb2_buffer_done(&cru->queue_buf[i]->vb2_buf, @@ -126,7 +127,6 @@ static void return_unused_buffers(struct rzg2l_cru_dev = *cru, vb2_buffer_done(&buf->vb.vb2_buf, state); list_del(&buf->list); } - spin_unlock_irqrestore(&cru->qlock, flags); } =20 static int rzg2l_cru_queue_setup(struct vb2_queue *vq, unsigned int *nbuff= ers, @@ -165,13 +165,9 @@ static void rzg2l_cru_buffer_queue(struct vb2_buffer *= vb) { struct vb2_v4l2_buffer *vbuf =3D to_vb2_v4l2_buffer(vb); struct rzg2l_cru_dev *cru =3D vb2_get_drv_priv(vb->vb2_queue); - unsigned long flags; - - spin_lock_irqsave(&cru->qlock, flags); =20 + guard(spinlock_irqsave)(&cru->qlock); list_add_tail(to_buf_list(vbuf), &cru->buf_list); - - spin_unlock_irqrestore(&cru->qlock, flags); } =20 static void rzg2l_cru_set_slot_addr(struct rzg2l_cru_dev *cru, @@ -465,7 +461,6 @@ void rzg2l_cru_disable_interrupts(struct rzg2l_cru_dev = *cru) int rzg2l_cru_start_image_processing(struct rzg2l_cru_dev *cru) { struct v4l2_mbus_framefmt *fmt =3D rzg2l_cru_ip_get_src_fmt(cru); - unsigned long flags; u8 csi_vc; int ret; =20 @@ -475,7 +470,7 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_d= ev *cru) csi_vc =3D ret; cru->svc_channel =3D csi_vc; =20 - spin_lock_irqsave(&cru->qlock, flags); + guard(spinlock_irqsave)(&cru->qlock); =20 /* Select a video input */ rzg2l_cru_write(cru, CRUnCTRL, CRUnCTRL_VINSEL(0)); @@ -492,7 +487,6 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_d= ev *cru) /* Initialize image convert */ ret =3D rzg2l_cru_initialize_image_conv(cru, fmt, csi_vc); if (ret) { - spin_unlock_irqrestore(&cru->qlock, flags); return ret; } =20 @@ -502,8 +496,6 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_d= ev *cru) /* Enable image processing reception */ rzg2l_cru_write(cru, ICnEN, ICnEN_ICEN); =20 - spin_unlock_irqrestore(&cru->qlock, flags); - return 0; } =20 @@ -573,16 +565,15 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) { struct rzg2l_cru_dev *cru =3D data; unsigned int handled =3D 0; - unsigned long flags; u32 irq_status; u32 amnmbs; int slot; =20 - spin_lock_irqsave(&cru->qlock, flags); + guard(spinlock_irqsave)(&cru->qlock); =20 irq_status =3D rzg2l_cru_read(cru, CRUnINTS); if (!irq_status) - goto done; + return IRQ_RETVAL(handled); =20 handled =3D 1; =20 @@ -591,14 +582,14 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) /* Nothing to do if capture status is 'RZG2L_CRU_DMA_STOPPED' */ if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPED) { dev_dbg(cru->dev, "IRQ while state stopped\n"); - goto done; + return IRQ_RETVAL(handled); } =20 /* Increase stop retries if capture status is 'RZG2L_CRU_DMA_STOPPING' */ if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPING) { if (irq_status & CRUnINTS_SFS) dev_dbg(cru->dev, "IRQ while state stopping\n"); - goto done; + return IRQ_RETVAL(handled); } =20 /* Prepare for capture and update state */ @@ -621,7 +612,7 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) if (cru->state =3D=3D RZG2L_CRU_DMA_STARTING) { if (slot !=3D 0) { dev_dbg(cru->dev, "Starting sync slot: %d\n", slot); - goto done; + return IRQ_RETVAL(handled); } =20 dev_dbg(cru->dev, "Capture start synced!\n"); @@ -646,9 +637,6 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) /* Prepare for next frame */ rzg2l_cru_fill_hw_slot(cru, slot); =20 -done: - spin_unlock_irqrestore(&cru->qlock, flags); - return IRQ_RETVAL(handled); } =20 --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 C4434378821; Fri, 27 Mar 2026 17:10:44 +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=1774631446; cv=none; b=r7BZSVCJXJUpRStegQWbWic9okfVZ1ic7d75eqpOWcka3atBo+slWltgKOKYxiabgz/fA6Uydp/4QMgYA+FPiJhpoNzTQ4VLyFwpSoXWNoZcsdJ3uLiPlgpYUSpGoHe7mMtrCxBNZuSNRt9NIKvCGzBhpkpbSCmiDRiT6UDw/DI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631446; c=relaxed/simple; bh=a8k3H7vZ9QOrPOBqIcGdLUleWexFOI1HoCBd5CaHisA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nRUGVSXajbnaXjiDrTA0hcCwuEEiup3Vt2kVixtKgMJLAkUHwRmLXuclJlfD0pcxaFDE4QBv1ZaSsXxUqi9co1k4R3M483p++ccAPz2AthvWK0RKdto8Dfak3fWK8QwWlYzIgonVku+gG2AdCdoyM/iIq9oD8gMPY0Qmm/VbatE= 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=DqEtW8NE; 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="DqEtW8NE" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id AAC323026; Fri, 27 Mar 2026 18:09:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631359; bh=a8k3H7vZ9QOrPOBqIcGdLUleWexFOI1HoCBd5CaHisA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DqEtW8NEdbtdMfOResH6o7yEIloTBVRP96rQ42bEXIoRyw51O7DSRynynM0Jt92Js hL+QcoXzQ7cDQFxNTg1etOUrpz/ryzrncH/bDDDw54y1Art2w++dzA78Y/pnAxKgeP 2u1iFVc3F3dRokoqyCO9WVYlVZ2MKeUsGdMJ1UD8= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:09 +0100 Subject: [PATCH 04/14] media: rzg2l-cru: Use proper guard() in irq handler 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: <20260327-b4-cru-rework-v1-4-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4506; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=ATRTxSt143KObiy2/iwP7rOhh1jLna5JlBP7Bra3N1Q=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroJY93sZQXMvc6cia/Xr6dAfl1jjS4O2i9Iz h4ILolFg4qJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CQAKCRByNAaPFqFW PKAsEADAVLSzdAZXfV+LD0y7i5nwjxfvrUjL8bqmm0SBUtXx4XyYSlliVcE+kjRaUP1kjBvdhBK sQ/tDkVK526qpJq0XvAkUnQ4hJcWlDjEl6uFfae/BUCvf8iCAgveYualUkWVVSpPqyhvPxnwR+W A9r2KO/1Gup4zcedVSHN+p1BqqpJs8H28tuDZgCtH9yYDWXKJA4XX3Y3DS5F/d4nGclyXbVzkZM /c/R23Ja8LTxZ0/ZrBVYTULxzZ1Sz99RYBuTEWztJYMvXmu2u5hgBGNy072sgXcG7/A7IKMmZ52 ARi9vIDVYhO91cVuSLHiw/ip9bHU0RFNI1CEoEbabAkczbHBYfT2Ldc1ABcueAAFrxP8YA0MEC6 GSoileW9DXmTtPvVIySfksp9iSYXWmp925zyte+dFvfn2H6CIYO5FhQNVZeMsAFzKy3pZt04Flk 4h+2jqmVnPgvkPCf1QTLSW6jEQd/dTEjwi74F8crqbGvj5R92n5oGyQ5N9/qbH2L68n0XK2oy8X 9NeRpXZEIxhc40BTTv4YacwTDLIZGaPtRzObyDFSgstE66R0r+UmEflUewvwf716EBlF/8rpsaO /W6+Oki/dtvh+gU66JUbT3RPNglkPjatKgiZ9Gm7RKFETB1b8lpyUoutYN/CIPwU+/ls/kiC4HU ni7Hn2/WHY7Dbww== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The irq handler uses a scoped_guard() that covers the whole function body. Replace it with a more appropriate guard() and reduce the indentation. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Lad Prabhakar Reviewed-by: Tommaso Merciai Tested-by: Tommaso Merciai --- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 104 ++++++++++-------= ---- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 2d7ac9f37291..b041c72837c6 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -671,70 +671,70 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) u32 irq_status; int slot; =20 - scoped_guard(spinlock, &cru->qlock) { - irq_status =3D rzg2l_cru_read(cru, CRUnINTS2); - if (!irq_status) - return IRQ_NONE; + guard(spinlock)(&cru->qlock); =20 - dev_dbg(cru->dev, "CRUnINTS2 0x%x\n", irq_status); + irq_status =3D rzg2l_cru_read(cru, CRUnINTS2); + if (!irq_status) + return IRQ_NONE; =20 - rzg2l_cru_write(cru, CRUnINTS2, rzg2l_cru_read(cru, CRUnINTS2)); + dev_dbg(cru->dev, "CRUnINTS2 0x%x\n", irq_status); =20 - /* Nothing to do if capture status is 'RZG2L_CRU_DMA_STOPPED' */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPED) { - dev_dbg(cru->dev, "IRQ while state stopped\n"); - return IRQ_HANDLED; - } + rzg2l_cru_write(cru, CRUnINTS2, rzg2l_cru_read(cru, CRUnINTS2)); =20 - if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPING) { - if (irq_status & CRUnINTS2_FExS(0) || - irq_status & CRUnINTS2_FExS(1) || - irq_status & CRUnINTS2_FExS(2) || - irq_status & CRUnINTS2_FExS(3)) - dev_dbg(cru->dev, "IRQ while state stopping\n"); - return IRQ_HANDLED; - } + /* Nothing to do if capture status is 'RZG2L_CRU_DMA_STOPPED' */ + if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPED) { + dev_dbg(cru->dev, "IRQ while state stopped\n"); + return IRQ_HANDLED; + } =20 - slot =3D rzg3e_cru_get_current_slot(cru); - if (slot < 0) - return IRQ_HANDLED; + if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPING) { + if (irq_status & CRUnINTS2_FExS(0) || + irq_status & CRUnINTS2_FExS(1) || + irq_status & CRUnINTS2_FExS(2) || + irq_status & CRUnINTS2_FExS(3)) + dev_dbg(cru->dev, "IRQ while state stopping\n"); + return IRQ_HANDLED; + } =20 - dev_dbg(cru->dev, "Current written slot: %d\n", slot); - cru->buf_addr[slot] =3D 0; - - /* - * To hand buffers back in a known order to userspace start - * to capture first from slot 0. - */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STARTING) { - if (slot !=3D 0) { - dev_dbg(cru->dev, "Starting sync slot: %d\n", slot); - return IRQ_HANDLED; - } - dev_dbg(cru->dev, "Capture start synced!\n"); - cru->state =3D RZG2L_CRU_DMA_RUNNING; - } + slot =3D rzg3e_cru_get_current_slot(cru); + if (slot < 0) + return IRQ_HANDLED; =20 - /* Capture frame */ - if (cru->queue_buf[slot]) { - struct vb2_v4l2_buffer *buf =3D cru->queue_buf[slot]; - - buf->field =3D cru->format.field; - buf->sequence =3D cru->sequence; - buf->vb2_buf.timestamp =3D ktime_get_ns(); - vb2_buffer_done(&buf->vb2_buf, VB2_BUF_STATE_DONE); - cru->queue_buf[slot] =3D NULL; - } else { - /* Scratch buffer was used, dropping frame. */ - dev_dbg(cru->dev, "Dropping frame %u\n", cru->sequence); + dev_dbg(cru->dev, "Current written slot: %d\n", slot); + cru->buf_addr[slot] =3D 0; + + /* + * To hand buffers back in a known order to userspace start + * to capture first from slot 0. + */ + if (cru->state =3D=3D RZG2L_CRU_DMA_STARTING) { + if (slot !=3D 0) { + dev_dbg(cru->dev, "Starting sync slot: %d\n", slot); + return IRQ_HANDLED; } + dev_dbg(cru->dev, "Capture start synced!\n"); + cru->state =3D RZG2L_CRU_DMA_RUNNING; + } =20 - cru->sequence++; + /* Capture frame */ + if (cru->queue_buf[slot]) { + struct vb2_v4l2_buffer *buf =3D cru->queue_buf[slot]; =20 - /* Prepare for next frame */ - rzg2l_cru_fill_hw_slot(cru, slot); + buf->field =3D cru->format.field; + buf->sequence =3D cru->sequence; + buf->vb2_buf.timestamp =3D ktime_get_ns(); + vb2_buffer_done(&buf->vb2_buf, VB2_BUF_STATE_DONE); + cru->queue_buf[slot] =3D NULL; + } else { + /* Scratch buffer was used, dropping frame. */ + dev_dbg(cru->dev, "Dropping frame %u\n", cru->sequence); } =20 + cru->sequence++; + + /* Prepare for next frame */ + rzg2l_cru_fill_hw_slot(cru, slot); + return IRQ_HANDLED; } =20 --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 D41A73C3C1E; Fri, 27 Mar 2026 17:10:47 +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=1774631449; cv=none; b=oEUb2+tF6gg1u9/4Ndbx2iLWNjiTJiWsO8p5OfMIeg+vgM8REI6uClJlX9CKyluJuofCCAaKfPK70Q5m4ogvdPZ25MwYn0qfMkEvRbCDPTQWM2MIcbcE11rCwUEXY7yI0H7oqC28PIMZGMjfaIg5flM681i7Us02fF9YSaXYBnc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631449; c=relaxed/simple; bh=qYNVJErGbpDMrNMDY0tRycGjHWbALYmvbRwfv/gRKvs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cieK1pyIe5c0AQ9hwpazHCvjKRutAg41F4NT3bCTfwuwf7ZWJu8ieyMCmO4Z3djtAqwraKVyDFbYT5m1KOPe8B3C+V8SS2qvchemLySE3iLvsIKUY6GayJA5nixLxXppFnR1pPF1XnFq3fWTpwxY72ArMP867hg1BneDVG9Degw= 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=QHWxbcOt; 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="QHWxbcOt" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4B44C3040; Fri, 27 Mar 2026 18:09:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631359; bh=qYNVJErGbpDMrNMDY0tRycGjHWbALYmvbRwfv/gRKvs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QHWxbcOtHniFytO7Wv6i2m18FzT5C/zCrepBGDMECZr/8kmx5x0LfgtGLIcb71HMl bIysu1JKZ5pfprJEzzq830cwzvlsmAR5M5aVeucepkh/KvlrjMOacKYGgaabHsufbW Ukg5GP/Q8Waj5j3T7dg+Mptgh/pWrMdfKy4hOeGg= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:10 +0100 Subject: [PATCH 05/14] media: rzg2l-cru: Remove locking from start/stop routines 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: <20260327-b4-cru-rework-v1-5-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2479; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=rDJiPzdHrlyY1cOGAeuzTJ0dhKGoLcCuHePAhuQK1sE=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroJMlRhPcgp8xIoRJhQw9zKxd7KeaN/szIVM SoGTJ0qPuOJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CQAKCRByNAaPFqFW PAgCEACbZdq/cT0GhFCHMNgl9sKfILIQsuNlVTMF7wxWW07MhMeGl+pAvlQh4cUECl16g7QSfjB 0UD+xmAMsHUazy0vMVej2y20RyF7ataIi8NRT6UdpGfu3svaIaTZX1M1wYflCXP/TVj6mnTXB/c n6fZHBFlxviVV9Wz9n7EmKhwaNQURqakPnNEUJqkhacB2xnHeXr9dYfAvBgendtMnUNriCbMH/N xX4HrGeRoFMq5umC4AonaFiv/x89EWUaqToes7nvwKgX8reamPDD1K+hSXsFu3YS+1fFzBtQwCF bCYbORPgvM4FBoA6NdDY5b3mertSF2ayp+tYBUr3dQScrlV8EqAtM7XTIsftrjMk7pkj/VKsozD ORCmnhuAqrieUiGJjbQDlBxUf3HuIB2P2UudOKlkHeKtkCxgq57PYerNppNQpDaCkKC/3E2jrIH DY8uJsJUWIM+038xdH6ifnFyjJVIwv6P8lavfk29SV9Zpo0H9WDGxVWyICcyV2o1PVtXtIB13/q xYYOK3efn+mMBUVnBWtr6ulmWTrvx6w9QOPFuot5hKhVFj78h9Cf4s72P/l6UZfA0RJc8DxNAah 3lp3h0844mbqv5qiV4vBV+N5t9pLDudp3Sq2i29cJs1IPvVik2kxAPdhSo0AMjLOHqhVxFcvOTR zf5u1C2IK0M/GKQ== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The start/stop streaming routines do not need to lock the whole function body against possible concurrent accesses to the CRU buffers or hardware registers. The stop function starts by disabling interrupts, and only this portion needs to be protected not to race against a possible IRQ. Once interrupts are disabled, nothing in the video device driver can race and once the peripheral has been disabled we can release all pending buffers. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Lad Prabhakar Reviewed-by: Tommaso Merciai Tested-by: Tommaso Merciai --- drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 18 +++++---------= ---- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index b041c72837c6..43b1d35fb963 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -341,23 +341,19 @@ bool rzg2l_fifo_empty(struct rzg2l_cru_dev *cru) void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev *cru) { unsigned int retries =3D 0; - unsigned long flags; u32 icnms; =20 - spin_lock_irqsave(&cru->qlock, flags); - - /* Disable and clear the interrupt */ - cru->info->disable_interrupts(cru); + scoped_guard(spinlock_irq, &cru->qlock) { + /* Disable and clear the interrupt */ + cru->info->disable_interrupts(cru); + } =20 /* Stop the operation of image conversion */ rzg2l_cru_write(cru, ICnEN, 0); =20 /* Wait for streaming to stop */ - while ((rzg2l_cru_read(cru, ICnMS) & ICnMS_IA) && retries++ < RZG2L_RETRI= ES) { - spin_unlock_irqrestore(&cru->qlock, flags); + while ((rzg2l_cru_read(cru, ICnMS) & ICnMS_IA) && retries++ < RZG2L_RETRI= ES) msleep(RZG2L_TIMEOUT_MS); - spin_lock_irqsave(&cru->qlock, flags); - } =20 icnms =3D rzg2l_cru_read(cru, ICnMS) & ICnMS_IA; if (icnms) @@ -401,8 +397,6 @@ void rzg2l_cru_stop_image_processing(struct rzg2l_cru_d= ev *cru) =20 /* Resets the image processing module */ rzg2l_cru_write(cru, CRUnRST, 0); - - spin_unlock_irqrestore(&cru->qlock, flags); } =20 static int rzg2l_cru_get_virtual_channel(struct rzg2l_cru_dev *cru) @@ -470,8 +464,6 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_d= ev *cru) csi_vc =3D ret; cru->svc_channel =3D csi_vc; =20 - guard(spinlock_irqsave)(&cru->qlock); - /* Select a video input */ rzg2l_cru_write(cru, CRUnCTRL, CRUnCTRL_VINSEL(0)); =20 --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 0DD1E3783C1; Fri, 27 Mar 2026 17:10:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631450; cv=none; b=qzS2RB00/w3doef8F2edU5KVz3x6dzmj+NMm2gBaaURJISaYMPE99yEsHKUWQF1bUt+t6lpxWJawXPxXuFxW1JoU8cWZ0TxP2dXpfDcgwNtx2dU4kbjRi9dr4NiewqUQ+XGklP8H07tPyirXQR7xVI//bdQzPVS2iM49OYi8+4o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631450; c=relaxed/simple; bh=MQiAPF1tif77KMDMhwXiTjAr/WzA0OTXN4b2NjGMcMo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LSFCgbsAbBS/iwKT7/VRVw5SDDjJ6v78QtrSvZVOkHQ/WiyVL6LE/ekOL1D6l10dAD1MPPIEsgvQvcfEAswuYXM9UlnunCD3Ijm8vmYtNlwffT/0sxnBpRg5CjrYvuwlMkjE8QVgycu2M5zToPi7C7v2jWAMoAM6a9qoLsg7LRQ= 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=O9fLSfv6; 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="O9fLSfv6" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DDED6304F; Fri, 27 Mar 2026 18:09:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631360; bh=MQiAPF1tif77KMDMhwXiTjAr/WzA0OTXN4b2NjGMcMo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O9fLSfv61KFKskYmk9Wvnm3kfaeN8wzeKz++vh6E2dOCDVIs8P+SB1mzIPcjD6/e8 3w816CyYdTP6JWhKUpCJ1vzCsrMK+ofogXq/c+LYr6RgLKrydDOCO6echakneiS2nu 77SV2IUt7E9fJPwYw0gInUShLuwz+RQGtEUx/ONo= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:11 +0100 Subject: [PATCH 06/14] media: rzg2l-cru: Do not use irqsave when not needed 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: <20260327-b4-cru-rework-v1-6-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1328; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=bF40rZD3TQUHYDp7/ut1kp/JjJgaqy4ZgCBLyzy2Fgw=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroJz/+q75G02YrIYat6AXa6xwPNfcBVeeM2R TIrTbv71u2JAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CQAKCRByNAaPFqFW PGwLD/wKDFYM2658ug8Cs3QWkR5cjIgm6H8qbVc4yidppiKxTDqLp9sy4p64zq10+D1aVu47ltd uey3PzUpu9xlML0Z0SqZbjqKhO1kzVEza3qYxvLdtPA5+c9yK5wM6RRflP1dorPTSXKRJYXYkeo 5xFGn5AOjQODSaTxvYchgtiFW0ULNI5Y+yalWmvB3+f0mxWopLif7Q8PR8Aa7SfvJ57/EE1FODp ChmwE8agEi/EsORrB2oIEIcZ+smyOk2S0sHd7ua5AJhxMwJ22IP+cwIKrfxVzdNzRczXzLoFBPb GGmgBOyWeBgj9HGFMTChtqy3+P9cRrIJ4U8POS35+gpG+oO7TJT1BpM9cZ/rEGtNcBAHNW1hGTK 3eiwug7+w7B/hy+7rbln+cS9blUT9Zp91du0WAVve0hTKvly9cCj1OvR4q5fUlCsQ16eaKj9SH2 Y/pLjXdhihQK4IuwcMoCZ0mWI8woka60zCiy14UwruMR3mFQX9ndIbrs6w+BdYue4Oh0e3ULuUk MCeTYRhdADwNG7MiXx/eahUTanCfKLUeiuOgvHThC1CaIWnpQ68c2GDnfCH885fON9NThGAZscN 9FAexQT4XCRi/PnKi5C9/aeSufY3Kv+q9fGzADTp8IYUwArIPkhLjeqWzbBcosHnq3E3/j9PFkT 5yFCAgu1z7+vZAg== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The return_unused_buffers() and rzg2l_cru_buffer_queue() functions are never called from an interrupt context, hence they do not need to use the irqsave version of the spinlock primitives. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Lad Prabhakar Reviewed-by: Tommaso Merciai Tested-by: Tommaso Merciai --- drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 43b1d35fb963..2e94788c3a13 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -113,7 +113,7 @@ static void return_unused_buffers(struct rzg2l_cru_dev = *cru, struct rzg2l_cru_buffer *buf, *node; unsigned int i; =20 - guard(spinlock_irqsave)(&cru->qlock); + guard(spinlock_irq)(&cru->qlock); =20 for (i =3D 0; i < cru->num_buf; i++) { if (cru->queue_buf[i]) { @@ -166,7 +166,7 @@ static void rzg2l_cru_buffer_queue(struct vb2_buffer *v= b) struct vb2_v4l2_buffer *vbuf =3D to_vb2_v4l2_buffer(vb); struct rzg2l_cru_dev *cru =3D vb2_get_drv_priv(vb->vb2_queue); =20 - guard(spinlock_irqsave)(&cru->qlock); + guard(spinlock_irq)(&cru->qlock); list_add_tail(to_buf_list(vbuf), &cru->buf_list); } =20 --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 EB5233EE1F3; Fri, 27 Mar 2026 17:10:50 +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=1774631452; cv=none; b=hvKCfcCGg9Dm484TdS6ukBACE/mZOb2JAaKP8KNnbxMCScWuWTeD2GFfBZ9+wTA4VpHiGJGN77UlY6GwHX2cgzrN1+QT4fRUueHFyUzJbPhnPvghepADuT/+HUV0VT88JSnu1sObaFraRdwWEOQ2FGT33f0Lv9ZuM4m8uorQaSM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631452; c=relaxed/simple; bh=ejjY5o1THUXOBdpXj5+JhlFmYEiZ/OKeAoYKCJGVMOY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KZJ8UMKd2yTX9KGSAhM+NdhTg8VlmM1VXyRVNZKg1o7gV08J4Uep9cSAmyHiHbvsfOy/ycV2oLm/rqzsElal86UIj26O+MNCVztWN9TQHzxcFlQKsgsJiePfUyztg8ManK6aP05BH0S3ZwwfOnCog2fk+q2FPNC7zmcKbAu3Kg0= 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=IpRr5tol; 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="IpRr5tol" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7C0A53054; Fri, 27 Mar 2026 18:09:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631360; bh=ejjY5o1THUXOBdpXj5+JhlFmYEiZ/OKeAoYKCJGVMOY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IpRr5tolisKmPnH2gZXNcxW4+2xxqeeZRn9QzK7hSUnzMjITViY6kuKvhm6V3wEJD MhdMS+xBTV5OHN44/dxk7sZLWhwsOgjxJ8LTtqzVtxljGVI6rEf6/kpnS4B2byVVs/ KZnqU2vz/MMR5PBKGMKKu6VumVU84BwJIXAp75tU= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:12 +0100 Subject: [PATCH 07/14] media: rzg2l-cru: Remove wrong locking comment 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: <20260327-b4-cru-rework-v1-7-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=981; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=Zb+8YHkGzFZu7MeDtgqkgA+gLo6zhgam9aT6SMy13jA=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroKppn8BIOCxux9kNo5ftNZgqJDnWxgVRmah pbMS29IDhuJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW PGivD/4zoGv8B1Lm5yV/7Ekhbo354c1WNiz8NE2O7u8tQVlLuOofJgS+HCEDxCFhaOnZOdF3i4K nNwgf4B21znsSHQkRDyV4w9e0vsBSXCPkE7gGGflgwpdazNivl5Ph25/iWLPUi/kzcE6tA/JHOi 8+FJ9h8sFLadWT4m9ITkakq8ztChCKjWpxdThpGr7hF6avitUV3Q68Vuihl9Soe8SnZI7hsuKYG VdiIuxYaNnklPCs5xpV4tzJ7GQcE2e9jBZZGn3HfvB+FH2wHy4omXzzcq3Hn2hkAEGtMtyhjaV4 wstNZUh5RD+0vlF7R9Ov9hpfktuzfMjh2jEvNPqC2WsKpbwzwXw9t/1694g7oti1sbDiuqhf9SC wMcm0+6Jgm1sgTHEHW2miZAueuasK83tsAhXfPcxBja4+ak8yVIBISI8w8RJ5Logde32s4CeZ6M fDMhCT8yud9fKEeDCduT4iwS8nYQuoMTBERJwsoqgP6F9Nr2y2rA0RNqn2Hb9BODN7U3/r3+GYF qjREZHKiV1rmg+u08qDs8l+8s6w3n9R2oWYR3JzeW9PdwGXqpfiO6PplPIdegJSXckWW9Q3J6tS dGYrR0Neo2CyTIWvmqFLC9e/sUFfHK928pAmtSFFwnvR9y3SSDg3oFPu1u986mKUQprbhjBd1Qn aaH6OAO46UtzMNA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi A function documented as "need to hold qlock before calling" actually takes the lock itself. Drop the comment and prepare to replace it with proper annotations where appropriate. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Lad Prabhakar Reviewed-by: Tommaso Merciai --- drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 2e94788c3a13..27079c17a54c 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -106,7 +106,6 @@ __rzg2l_cru_read_constant(struct rzg2l_cru_dev *cru, u3= 2 offset) __rzg2l_cru_read_constant(cru, offset) : \ __rzg2l_cru_read(cru, offset)) =20 -/* Need to hold qlock before calling */ static void return_unused_buffers(struct rzg2l_cru_dev *cru, enum vb2_buffer_state state) { --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 DF0003F0740; Fri, 27 Mar 2026 17:10:51 +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=1774631453; cv=none; b=LKDbdvNOB2RdTHdepKMaZvglBnVL/FeHHO6LwBVFSPvLdMVWujye0WuGfYIDkfJS2kFHzJjRFMAdDUGyO2Ec4R0AQSRVrSRJozLprPxKsbjUJ78pFr+TSIW5MoiUwUaMlQsUjHwNPLlxObe42bwHYfoJNRh0Kb73ao2KUGXyc3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631453; c=relaxed/simple; bh=cl61fNPJBp++BWHDqrDv1ygEYOHC+TdkZIzydBRn42g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MiA9Jn6sVPTRl46nRaIPHFahYmjquSb1h2NNUjNACxeftdT+oQXhfig1cSyKzcbZ36oBcVho1Z+Ge4Itwno6puGxIPFRHFxH1ImmKonU6OlK4Mc7esMocThyQwB/TJ4khENFJ0HXZMmP8aEF23GJCu/CDsUsKQ8JVb4OLFhBi0Q= 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=v/lOC5G2; 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="v/lOC5G2" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 229B0305E; Fri, 27 Mar 2026 18:09:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631361; bh=cl61fNPJBp++BWHDqrDv1ygEYOHC+TdkZIzydBRn42g=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=v/lOC5G2BhSRESFhRQGxB6Fhj0C/cRK7Mxx+DQimC3w2rGDyXBlXZUm3M6xqNLgD7 /CtXIEeGe+1/zJuqasOK4YNgxQw/IC6RL3BJnwIMHqBJlL98Bc7tTJWyLE+cYss3hA TkksGesWMU4kPLAGAdI+lBq9b1jgXGgCODeVRPp4= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:13 +0100 Subject: [PATCH 08/14] media: rz2gl-cru: Introduce a spinlock for hw operations 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: <20260327-b4-cru-rework-v1-8-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2854; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=E2wRecVvgJDLQ31Uuw0vGBwA55sVXQ5VxSxj1NSvhM8=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroK2p1jidtOCO7+ln3buUvnn28T5UjBleXhB JnHykw7ugKJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW PMfPEACcy1Qczz8Sy8O1v061ZRR0AFRsJOERIDK8BhLKt/gM7JGlFBVb+efxUopJc53LO9qnOAo W/u2IxU0fXKxnTRkN27e/pXhF4/GMuo+Gxfz37VrKa7G81GtW6T7MBwTS8UU1DKcukhx1Wq2+Dd m01YKVs4VWXtXShryx6ZA0XT4UhF8wT7YwUWKH76sGyvM7mGAPru3fv3+9BTGH3DDIgEISrCOG2 lTL3Ga0lSAC5BG94gA81pS28NvAW6hJGsAVaZRWdMXj7Qo32J88Tb2BmlmsI/r/u+MnHNFcr3Qd B5LbkXCmZObaYwtQHbgYja2iJNqA8rEukSE10F9jHTWb144FOuXWNV5hCGqrlhVkjDLWqPcY4eP fMKNN+QWsyyFueCBaQIXs68VARczIEYw4B56AxijWRn9RwWAoaWuvswqY2oSbPVPK3tc4IlBVyE 7wS1rIDHrRru9z9J4zaomQBq8muqyrlQhNulM0GIP2kczYSVAy6fLAyTkYCIOFVf8jMmj4RKVc+ 7cq/VbFLaJDbSTS+peEiLXeUGEf5NJqCPECT0Cu5wH2AA+0X1nlDozSMFwYnjLX/3ZGqrRmyCnx H6Fbp7T+0XJcybv9QRQRc/MZkJUgJt2sT9VWPZQNrU0DR9uhQqpelOoa4R9cCsuWcx2JmgaN88Y 8HCJGDhyk8IobFA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The CRU driver uses a single spinlock to protect the buffers queue and the hardware operations. This single spinlock is held for the whole duration of the interrupt handler, causing all other driver's operations to freeze. Under heavy system stress conditions with userspace not providing buffers fast enough, this causes loss of frames. Prepare to re-work the driver locking by introducing (but not using yet) a new spinlock to protect the hardware registers programming. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Tommaso Merciai --- drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h | 10 +++++++--- drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h b/drivers= /media/platform/renesas/rzg2l-cru/rzg2l-cru.h index 3a200db15730..b46696a0012b 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h @@ -109,7 +109,6 @@ struct rzg2l_cru_info { * @v4l2_dev: V4L2 device * @num_buf: Holds the current number of buffers enabled * @svc_channel: SVC0/1/2/3 to use for RZ/G3E - * @buf_addr: Memory addresses where current video data is written. * @notifier: V4L2 asynchronous subdevs notifier * * @ip: Image processing subdev info @@ -118,6 +117,10 @@ struct rzg2l_cru_info { * @mdev_lock: protects the count, notifier and csi members * @pad: media pad for the video device entity * + * @hw_lock: protects the slot counter, hardware programming of + * slot addresses and the @buf_addr[] list + * @buf_addr: Memory addresses where current video data is written + * * @lock: protects @queue * @queue: vb2 buffers queue * @scratch: cpu address for scratch buffer @@ -147,8 +150,6 @@ struct rzg2l_cru_dev { u8 num_buf; =20 u8 svc_channel; - dma_addr_t buf_addr[RZG2L_CRU_HW_BUFFER_DEFAULT]; - struct v4l2_async_notifier notifier; =20 struct rzg2l_cru_ip ip; @@ -157,6 +158,9 @@ struct rzg2l_cru_dev { struct mutex mdev_lock; struct media_pad pad; =20 + spinlock_t hw_lock; + dma_addr_t buf_addr[RZG2L_CRU_HW_BUFFER_DEFAULT]; + struct mutex lock; struct vb2_queue queue; void *scratch; diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 27079c17a54c..a79b17e146bf 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -844,6 +844,7 @@ int rzg2l_cru_dma_register(struct rzg2l_cru_dev *cru) mutex_init(&cru->lock); INIT_LIST_HEAD(&cru->buf_list); =20 + spin_lock_init(&cru->hw_lock); spin_lock_init(&cru->qlock); =20 cru->state =3D RZG2L_CRU_DMA_STOPPED; --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 E33BA21CC5B; Fri, 27 Mar 2026 17:10:53 +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=1774631455; cv=none; b=MLGI7Frkpo/gEmgtDYQ5u8ivfEcbFxPVAbIsb9Jw1BN3LhjSaQhYM1wCJJ1iAiT4ONeAt+wtwzAP4p9ThSLG8SeiiuCXUeN0Ydzft/VLqud5I04uWiPYYbcJD7EYifZwZOW9vAPBdNo1X3LZknWjPOB3MBIXBqMHcNCZxGUFuKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631455; c=relaxed/simple; bh=R+2mK3t/QVDAP2+Dgp7a5Zjp2Q6cKFLuzmt0S7JOz0s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZDkP659A/ttPHbIpeAUx1EtDySti4mL7i3ogNqvYZFe9t3OR7gwqrZWd2+Fc8ieHsY2fz0lHr6ChFZwq4SBxUCfoebRLf33UhihP/dcyazO8SNJO7L4f0/o/3VtiDNIo9v0XVHtgG5cVYNcBTmR9ICwfAFo2cwGRGiwe2DUzuQU= 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=dGQNpZW7; 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="dGQNpZW7" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BD479305F; Fri, 27 Mar 2026 18:09:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631362; bh=R+2mK3t/QVDAP2+Dgp7a5Zjp2Q6cKFLuzmt0S7JOz0s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=dGQNpZW7FxctYhBHStHsTaBuU7JFGxacgy5gXj79mQi/bBfcz7OBoxX7hNuZyzZEm rLyq0QCrqq3Z3y6EsvcPG6TrCVkplaASuJ1RV3qFMtyH4EbE3jy/vOKmvk/rF9FHFq HUibh44+SLfmY7Az50hxpXbjUAPK0aeLqQN0rNLc= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:14 +0100 Subject: [PATCH 09/14] media: rzg2l-cru: Split hw locking from buffers 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: <20260327-b4-cru-rework-v1-9-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3029; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=//y9fvbItoS5LDzM9eGoIrQQBvpvCqsMu4nybreAVgc=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroKpW/Z66S6UX1RaW9QRPfOAKuJhk5QZgC+R EAq76pknXqJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW PF4XEACMqTmPziwcgeQyek+QWSp/UlmwZPcvMXBpyd9SZI8y7Eqk+34bVbng/Buk0kXt2xVtCvp Y0V2SPSQEyI17arlQHnJbq9iZ9YIzjN5YWT3VY7ITpuQ0qxNNVkPq4faWCJ3BEy4TG5NgvEtc/9 p9HVW5xTAlMUGh8MEYhSL6ThiJUNpMw9fU920mVgKjPuMwxC+9n0ZZdmdW3sde1xIOKGnQjm8xP a4pZjuNo0SDuFelgWMJcSwVujlZFvJAAW24TnVKrNDdicnTq5WmjuL9ZXMsMAm2X2G9a7YFVR9c Ia6gMUXJanQkebIuNY2qg1TedCmpH2lILD/4FBXyi2U1FH7neB5BiGHHJKSaeDR9m99q2DBd+h0 DhGpXfHAthrRjdg0udxFAJkmUuv2ZLtaQT34HaUKPfKTmzO5kPSjtCyB7vNTVeeNGfOipBFqQv0 mK4/fJ7w2VK25pd6Q3HrBu6PsC/GGMeKHy7OGyPgAYczeECZcZLYXqD6r6XJ0sqn1G+ZRJrW5EV sRa6AG+yZ5m7f0wzUZ4FpGnK3pXwBgixn1Y8V/lxyn0EHpmf/35w/bWj7mAOHih0rbfDOlUhjtr LQrobi7PBl8RlmHazpX/oN2NoKdxlTGIgDpM2E5tB9sw+Px9A/ly8sO7EfHwL1+UJK698MhbaS6 3RkfaJ8rJIvjU0A== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi Split the locking between a spinlock dedicated to protect the hardware slots programming (hw_lock) and one lock (qlock) to protect the queue of buffers submitted by userspace. Do not rework the locking strategy yet but start simply by splitting the locking in two. Signed-off-by: Jacopo Mondi --- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 32 +++++++++++++-----= ---- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index a79b17e146bf..9406a089ec9f 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -112,19 +112,21 @@ static void return_unused_buffers(struct rzg2l_cru_de= v *cru, struct rzg2l_cru_buffer *buf, *node; unsigned int i; =20 - guard(spinlock_irq)(&cru->qlock); - - for (i =3D 0; i < cru->num_buf; i++) { - if (cru->queue_buf[i]) { - vb2_buffer_done(&cru->queue_buf[i]->vb2_buf, - state); - cru->queue_buf[i] =3D NULL; + scoped_guard(spinlock_irq, &cru->hw_lock) { + for (i =3D 0; i < cru->num_buf; i++) { + if (cru->queue_buf[i]) { + vb2_buffer_done(&cru->queue_buf[i]->vb2_buf, + state); + cru->queue_buf[i] =3D NULL; + } } } =20 - list_for_each_entry_safe(buf, node, &cru->buf_list, list) { - vb2_buffer_done(&buf->vb.vb2_buf, state); - list_del(&buf->list); + scoped_guard(spinlock_irq, &cru->qlock) { + list_for_each_entry_safe(buf, node, &cru->buf_list, list) { + vb2_buffer_done(&buf->vb.vb2_buf, state); + list_del(&buf->list); + } } } =20 @@ -198,12 +200,16 @@ static void rzg2l_cru_fill_hw_slot(struct rzg2l_cru_d= ev *cru, int slot) struct rzg2l_cru_buffer *buf; dma_addr_t phys_addr; =20 + lockdep_assert_held(&cru->hw_lock); + /* A already populated slot shall never be overwritten. */ if (WARN_ON(cru->queue_buf[slot])) return; =20 dev_dbg(cru->dev, "Filling HW slot: %d\n", slot); =20 + guard(spinlock)(&cru->qlock); + if (list_empty(&cru->buf_list)) { cru->queue_buf[slot] =3D NULL; phys_addr =3D cru->scratch_phys; @@ -342,7 +348,7 @@ void rzg2l_cru_stop_image_processing(struct rzg2l_cru_d= ev *cru) unsigned int retries =3D 0; u32 icnms; =20 - scoped_guard(spinlock_irq, &cru->qlock) { + scoped_guard(spinlock_irq, &cru->hw_lock) { /* Disable and clear the interrupt */ cru->info->disable_interrupts(cru); } @@ -560,7 +566,7 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) u32 amnmbs; int slot; =20 - guard(spinlock_irqsave)(&cru->qlock); + guard(spinlock_irqsave)(&cru->hw_lock); =20 irq_status =3D rzg2l_cru_read(cru, CRUnINTS); if (!irq_status) @@ -662,7 +668,7 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) u32 irq_status; int slot; =20 - guard(spinlock)(&cru->qlock); + guard(spinlock)(&cru->hw_lock); =20 irq_status =3D rzg2l_cru_read(cru, CRUnINTS2); if (!irq_status) --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 CDA203F65FB; Fri, 27 Mar 2026 17:10:54 +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=1774631456; cv=none; b=pCn+TrIJ2SMfwtdaQ0kRSbZjuo3D7fzHr1qe/Rl3IrVSix2beMCWAmE6l/VLBMqg4SU7Bqh5TTpPn2UeCB5EltSKcZfGoDxxu8cEsoYkfdRWbweMDI9mf/KYpAK/v/VEVjlilahfvYofYGH3KXN68GyALtidFeY+8mTGCgmBWBs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631456; c=relaxed/simple; bh=ceaSnwh8NoSX8ekOEAuahaszMYRXyaQyRiTjVZJgMzA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QEcivTeSDk1tuJWu7EkQfvS4Lf+m4TZs0yc3w7vFXSLL986uJG7fZjuoQnDJPv7vwimzTFXwCWLpm4o6a+rtltJ7GTTDEZLnhfuiW+Cx7AjAAyrlvIjah+BgPKV5wlpQmxdBDAWkmYoc24wfQlFmKnxvCxXeHPeWDuAY9sWwBjw= 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=RPZs3fi6; 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="RPZs3fi6" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 5DD0F3064; Fri, 27 Mar 2026 18:09:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631362; bh=ceaSnwh8NoSX8ekOEAuahaszMYRXyaQyRiTjVZJgMzA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RPZs3fi6lFIyNsg/wyNa6lhS6VZ3MbF3qzh1hPQTEloA7bbIxM/jWPb176SPBt17W 81twPZr2V5h3G7BqL+ocKfXbHhe8JlDXktgbOHE7PQkoXZ10awDQlKvPsclCLqre9L x/U+F49cozUYxnKQ9EdGzpJ+CFeW3tpscn6WoxJE= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:15 +0100 Subject: [PATCH 10/14] media: rzg2l-cru: Manually track active slot number 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: <20260327-b4-cru-rework-v1-10-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4536; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=OwCS22/wqDTWTDo8qWv/0SBvFxPmMPCRk9TtT/IQsPk=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroKPIG67klLC5uJJ/NgMgN1f49X9AEQB2jAn WF72R4nQJmJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW PEKwD/4wSrS3gA7f3LHQ7gdbhPlCeO2OCBsxmSvBwiyf2zrI/35xVGBwiXhPQzkUxW+pnui+TRg /nyGjRVtsBzJJ2b1TDhwlE1Ae9xv023i9aJy5LhEcY23sCyUUGfO3bGkFn9WU1swjnxN29CJC82 lLyQQ2jlxyfHqlMeP/mhcX5ibmJOinfsRqIyIrPXl4vvm38VGTkMezhzTjfyvFumbb3Ev/KpbYN u8c6xYqELZYGySYMxNhsuzz1G1DXkUKWb7DV4fikUNvMZFQBRkbiKdHqU5Gb8urrHjYrhp8HlWs H6EnUu1uCg+2dzy8XXHLIkFXodHbtXTQXCNUZEGgV9kMhHrznbKajWSjGKJ9KYuUCwkU7A6xGpp HUDMXiDAY4ORb91ptYqjCUWupZKz0zdW3hBxxc/WLsh/yevyuP2ZLgnEE/BY/oUrNRW9gRemMw+ BMU18AVirfZdSLxcpy+iwOY1ptKi0R2a8rKYltAtd8nah4W4dAzTtek83IlIz5Q0gERlGm8wZkR GR4UQWUTfrt499G2zB9CSFhaUAHwC4m1s650D0nu9LB0wovtLiks/nEy1wnkIe5lxIB/jaAT/Va 1DXYHN0RHg5MPcQw3VLU6Pi2FpBEebBGnZT75ymXcckUjOB/46o/8KGoaHW8xagU7P8dci5nxPP XvYr83Mcf1BTTSA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The CRU cycles over the hardware slots where the destination address for the next frame has to be programmed. The RZ/G2L version of the IP has a register that tells which is the last used slot by the hardware but, unfortunately, such register is not available on RZ/G3E and RZ/V2H(P). The driver currently compares the value of the AMnMADRSL/H register which report "the memory address which the current video data was written to" and compares it with the address programmed in the slots. This heuristic requires a bit of book keeping and proper locking. As the driver handles the FrameEnd interrupt, it's way easier to keep track of the slot that has been used by ourselves with a driver variable. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Lad Prabhakar Reviewed-by: Tommaso Merciai Tested-by: Tommaso Merciai --- .../media/platform/renesas/rzg2l-cru/rzg2l-cru.h | 7 +++-- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 35 ++++--------------= ---- 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h b/drivers= /media/platform/renesas/rzg2l-cru/rzg2l-cru.h index b46696a0012b..bc66b0c8c15e 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h @@ -108,6 +108,7 @@ struct rzg2l_cru_info { * @vdev: V4L2 video device associated with CRU * @v4l2_dev: V4L2 device * @num_buf: Holds the current number of buffers enabled + * * @svc_channel: SVC0/1/2/3 to use for RZ/G3E * @notifier: V4L2 asynchronous subdevs notifier * @@ -117,9 +118,10 @@ struct rzg2l_cru_info { * @mdev_lock: protects the count, notifier and csi members * @pad: media pad for the video device entity * - * @hw_lock: protects the slot counter, hardware programming of - * slot addresses and the @buf_addr[] list + * @hw_lock: protects the @active_slot counter, hardware programming + * of slot addresses and the @buf_addr[] list * @buf_addr: Memory addresses where current video data is written + * @active_slot: The slot in use * * @lock: protects @queue * @queue: vb2 buffers queue @@ -160,6 +162,7 @@ struct rzg2l_cru_dev { =20 spinlock_t hw_lock; dma_addr_t buf_addr[RZG2L_CRU_HW_BUFFER_DEFAULT]; + unsigned int active_slot; =20 struct mutex lock; struct vb2_queue queue; diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 9406a089ec9f..17e0153052e1 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -637,31 +637,6 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) return IRQ_RETVAL(handled); } =20 -static int rzg3e_cru_get_current_slot(struct rzg2l_cru_dev *cru) -{ - u64 amnmadrs; - int slot; - - /* - * When AMnMADRSL is read, AMnMADRSH of the higher-order - * address also latches the address. - * - * AMnMADRSH must be read after AMnMADRSL has been read. - */ - amnmadrs =3D rzg2l_cru_read(cru, AMnMADRSL); - amnmadrs |=3D (u64)rzg2l_cru_read(cru, AMnMADRSH) << 32; - - /* Ensure amnmadrs is within this buffer range */ - for (slot =3D 0; slot < cru->num_buf; slot++) { - if (amnmadrs >=3D cru->buf_addr[slot] && - amnmadrs < cru->buf_addr[slot] + cru->format.sizeimage) - return slot; - } - - dev_err(cru->dev, "Invalid MB address 0x%llx (out of range)\n", amnmadrs); - return -EINVAL; -} - irqreturn_t rzg3e_cru_irq(int irq, void *data) { struct rzg2l_cru_dev *cru =3D data; @@ -693,9 +668,8 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) return IRQ_HANDLED; } =20 - slot =3D rzg3e_cru_get_current_slot(cru); - if (slot < 0) - return IRQ_HANDLED; + slot =3D cru->active_slot; + cru->active_slot =3D (cru->active_slot + 1) % cru->num_buf; =20 dev_dbg(cru->dev, "Current written slot: %d\n", slot); cru->buf_addr[slot] =3D 0; @@ -762,6 +736,9 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queu= e *vq, unsigned int count goto assert_aresetn; } =20 + cru->active_slot =3D 0; + cru->sequence =3D 0; + /* Allocate scratch buffer */ cru->scratch =3D dma_alloc_coherent(cru->dev, cru->format.sizeimage, &cru->scratch_phys, GFP_KERNEL); @@ -772,8 +749,6 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queu= e *vq, unsigned int count goto assert_presetn; } =20 - cru->sequence =3D 0; - ret =3D rzg2l_cru_set_stream(cru, 1); if (ret) { return_unused_buffers(cru, VB2_BUF_STATE_QUEUED); --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 B3EB13FB055; Fri, 27 Mar 2026 17:10:56 +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=1774631458; cv=none; b=ZkNJh34Ac7mSXa4hHOTafC4qSoq367cU0wS4olN40QTP0KHYj2nbrtFeqPLHasHt5H69uX5Ul/vyVqetFBkzvtgsXCepObpnBuI7OQtnjU30FlEWMzf1g90cwne5xwqu4pmKsV8OuXR9nEM0J7h9BSKA7ize+RwxHP5gWAkIHiI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631458; c=relaxed/simple; bh=iN2Wy6geSH+knCf6TG3v9TkTqs3wsC8eIVZNoXgi0Ac=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y8R8fJAE4av9FEmRnD9utH8sEi1BMt+8SHgfkBgUxxtlEZC9lbfhbslC2vddXT8SmZLlQNPhaQ9f83G92DJMEJTcf8LollgHMdbMqgEeI3RDcPMO6bTllL9zfPGUvgvy6ysd4Y7+wVL+pTkgSDDW73VPOY9iB/jSP0hT3Ed73+c= 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=jZUu3Pf5; 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="jZUu3Pf5" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F04803076; Fri, 27 Mar 2026 18:09:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631363; bh=iN2Wy6geSH+knCf6TG3v9TkTqs3wsC8eIVZNoXgi0Ac=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jZUu3Pf5E5Ad6usCvlz7iR9Cf6OTiXjgLdEyfqmLq5AyvLVfd4prc58GxruI+snmO 9AuHw8CQYvN7soIbZGNIl48Z8+zvGvaANgecSKufm5umCw1cnKSxFyKW4K+/W11sbL 13RAPNvK2vBnBbavwpvVOCvM2rITKdo1bDMvNdBc= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:16 +0100 Subject: [PATCH 11/14] media: rz2gl-cru: Return pending buffers in order 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: <20260327-b4-cru-rework-v1-11-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5723; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=tXe3D3lbbO6/HkgUeaXe9Bvy9iek0BebayovSWN6yA4=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroKCioQmaQZEn09224oaCFUE43UzmphvK9Ve 6BEje2xk1eJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW PDzdEADAdwJB+EAVCwYj7qONQl3RNFSCCDqdeGutgNyHTSj4L4do3tNM8VKc6qOXSi6je2GStRo 9HHsKw1T7JG2N+olYi69xyStTf5NVSP8wjQaR/q0wSAMIl7gYoSmdQXiKy6kMxiwTsc9tSVxeA4 Aq2fXBsKaJRcnwvZNZSDSyy8cGiZAeeS5dd+shj4K8QY3WJdBDrPD+q3Q7q5rmugOAtC7iGSXha UPZl0HWUbBIODYFpmpmHARGBOHThRx7uDW/UXKEIe1uNHvpmb7Kl+02/YFQuzwVHfDCcuvfd8pG GKR/TFbOPuQAWuhqcs5Uc4xx7rP2N54WP7yWLaCfLNX1JdNoB372zZXCPN00qfpmDB2MJqtolxQ ClG1sKeJd1lW+Guut07SIfcLVhJANiqfSc5YoE56ZCRR+LDutqKmT5ZD1sfqGFSReeUEByirDdl bSjaUVuDpXBP9hSj4oZnSa9sZWuLloXk97vCh2jCgw1FtLv38KrOUr5GuIDQeSFStxkkzLIEPas QaCuvqmaSotIAMCZpU7960i1eJWhw2v1mb+d5IG7Ia+COxUrbfa4ZeDtZ3PlKzkpyhsTxtJU50W 1WWpwvhFwejB7C00g8Rk/P5HbdX2N16DFYz90gfeXz9MYJjOMZnyGOXv/+M0DbIniB4Qq8+btlw pqmGlHMDf6V3gvw== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi Buffers are programmed into slots in queueing order. When returning pending buffers we can't simply start from the first slot but we should actually iterate slots starting from the one is use. The rzg3e_cru_irq() handler already uses 'active_slot', make rzg2l_cru_irq() use it as well to know where to start iterating from. As the pattern of iterating over slots in order will be used for slots programming in the next patches, provide an helper macro to do that. While at it, rename return_unused_buffers() to rzg2l_cru_return_buffers(). Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Tested-by: Tommaso Merciai --- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 68 +++++++++++++++---= ---- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 17e0153052e1..a6b606c63f90 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -43,6 +43,24 @@ struct rzg2l_cru_buffer { #define to_buf_list(vb2_buffer) \ (&container_of(vb2_buffer, struct rzg2l_cru_buffer, vb)->list) =20 +/* + * The CRU hardware cycles over its slots when transferring frames. All dr= ivers + * structure that contains programming data for the slots, such as the mem= ory + * destination addresses have to be iterated as they were circular buffers. + * + * Provide here utilities to iterate over slots and the associated data. + */ +static inline unsigned int rzg2l_cru_slot_next(struct rzg2l_cru_dev *cru, + unsigned int slot) +{ + return (slot + 1) % cru->num_buf; +} + +/* Start cycling on cru slots from the one after 'start'. */ +#define for_each_cru_slot_from(cru, slot, start) \ + for (slot =3D rzg2l_cru_slot_next(cru, start); \ + slot !=3D start; slot =3D rzg2l_cru_slot_next(cru, slot)) + /* -----------------------------------------------------------------------= ------ * DMA operations */ @@ -106,28 +124,36 @@ __rzg2l_cru_read_constant(struct rzg2l_cru_dev *cru, = u32 offset) __rzg2l_cru_read_constant(cru, offset) : \ __rzg2l_cru_read(cru, offset)) =20 -static void return_unused_buffers(struct rzg2l_cru_dev *cru, - enum vb2_buffer_state state) +static void rzg2l_cru_return_buffers(struct rzg2l_cru_dev *cru, + enum vb2_buffer_state state) { struct rzg2l_cru_buffer *buf, *node; - unsigned int i; =20 scoped_guard(spinlock_irq, &cru->hw_lock) { - for (i =3D 0; i < cru->num_buf; i++) { - if (cru->queue_buf[i]) { - vb2_buffer_done(&cru->queue_buf[i]->vb2_buf, - state); - cru->queue_buf[i] =3D NULL; - } + /* Return the buffer in progress first, if not completed yet. */ + unsigned int slot =3D cru->active_slot; + + if (cru->queue_buf[slot]) { + vb2_buffer_done(&cru->queue_buf[slot]->vb2_buf, state); + cru->queue_buf[slot] =3D NULL; } - } =20 - scoped_guard(spinlock_irq, &cru->qlock) { - list_for_each_entry_safe(buf, node, &cru->buf_list, list) { - vb2_buffer_done(&buf->vb.vb2_buf, state); - list_del(&buf->list); + /* Return all the pending buffers after the active one. */ + for_each_cru_slot_from(cru, slot, cru->active_slot) { + if (!cru->queue_buf[slot]) + continue; + + vb2_buffer_done(&cru->queue_buf[slot]->vb2_buf, state); + cru->queue_buf[slot] =3D NULL; } } + + guard(spinlock_irq)(&cru->qlock); + + list_for_each_entry_safe(buf, node, &cru->buf_list, list) { + vb2_buffer_done(&buf->vb.vb2_buf, state); + list_del(&buf->list); + } } =20 static int rzg2l_cru_queue_setup(struct vb2_queue *vq, unsigned int *nbuff= ers, @@ -591,16 +617,16 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) =20 /* Prepare for capture and update state */ amnmbs =3D rzg2l_cru_read(cru, AMnMBS); - slot =3D amnmbs & AMnMBS_MBSTS; + cru->active_slot =3D amnmbs & AMnMBS_MBSTS; =20 /* * AMnMBS.MBSTS indicates the destination of Memory Bank (MB). * Recalculate to get the current transfer complete MB. */ - if (slot =3D=3D 0) + if (cru->active_slot =3D=3D 0) slot =3D cru->num_buf - 1; else - slot--; + slot =3D cru->active_slot - 1; =20 /* * To hand buffers back in a known order to userspace start @@ -669,7 +695,7 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) } =20 slot =3D cru->active_slot; - cru->active_slot =3D (cru->active_slot + 1) % cru->num_buf; + cru->active_slot =3D rzg2l_cru_slot_next(cru, cru->active_slot); =20 dev_dbg(cru->dev, "Current written slot: %d\n", slot); cru->buf_addr[slot] =3D 0; @@ -743,7 +769,7 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queu= e *vq, unsigned int count cru->scratch =3D dma_alloc_coherent(cru->dev, cru->format.sizeimage, &cru->scratch_phys, GFP_KERNEL); if (!cru->scratch) { - return_unused_buffers(cru, VB2_BUF_STATE_QUEUED); + rzg2l_cru_return_buffers(cru, VB2_BUF_STATE_QUEUED); dev_err(cru->dev, "Failed to allocate scratch buffer\n"); ret =3D -ENOMEM; goto assert_presetn; @@ -751,7 +777,7 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queu= e *vq, unsigned int count =20 ret =3D rzg2l_cru_set_stream(cru, 1); if (ret) { - return_unused_buffers(cru, VB2_BUF_STATE_QUEUED); + rzg2l_cru_return_buffers(cru, VB2_BUF_STATE_QUEUED); goto out; } =20 @@ -788,7 +814,7 @@ static void rzg2l_cru_stop_streaming_vq(struct vb2_queu= e *vq) dma_free_coherent(cru->dev, cru->format.sizeimage, cru->scratch, cru->scratch_phys); =20 - return_unused_buffers(cru, VB2_BUF_STATE_ERROR); + rzg2l_cru_return_buffers(cru, VB2_BUF_STATE_ERROR); =20 reset_control_assert(cru->presetn); clk_disable_unprepare(cru->vclk); --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 CE0AC3FB7EB; Fri, 27 Mar 2026 17:10:57 +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=1774631459; cv=none; b=X2m/pondBa2qSf0Lq4ZLR9fE4E21nO3ihHMdfunNQ6HeXguxG/ZPVqaXNexIZdjlD1Tw1TYgpBIvunT+BC9kY/IyayT6PJ4ZnRAlN8IAghdZAmukI/WvlPJFbS76cg/4a+DL2lszfU6Ai7uUtmCnM5EWIbx4H0KY6JXpEl36/sk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631459; c=relaxed/simple; bh=stnYVSqBIs3TCyw3XnxM+KWKwzzvVsoFPE1+nZnHlY0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cKEq1om7i55Pl6zn/pnx5DKR4tpLHDgOa1NR8n0fAsxkas8Ga7hVzwIoGme6rBvtZff78gzqo0jddpeYlGaXF/tBZf4dcLEL2gopFTVak+XtI6n9t4fwFnxWwnSK+IBJQveY3y3SSC6Nn5oNHwXGARrKt07HLLT15rsV577uCHc= 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=IvS+Gw28; 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="IvS+Gw28" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 91FCB307F; Fri, 27 Mar 2026 18:09:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631364; bh=stnYVSqBIs3TCyw3XnxM+KWKwzzvVsoFPE1+nZnHlY0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IvS+Gw28St5nn1kmeCR6uCZsfOchivkT+trRBn5vHasU+EQBkGIV8BhlzBbXGnk/C Cg0+CJhsm/bbLUeLSTMOjo9aHdRDpmXuSWlhSfYBPG8dLVCB9i0y66IP8RmDEIPnIl IJvm0FKm1isSb+50zo3Uf1mv7GOz9/mB8LmBlWEM= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:17 +0100 Subject: [PATCH 12/14] media: rzg2l-cru: Rework rzg2l_cru_fill_hw_slot() 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: <20260327-b4-cru-rework-v1-12-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Daniel Scally , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4915; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=y/KNXji9b3BMk21cTyXg4JVTlo63mcVF5HC/4y5ov2Y=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroKUnwMmKOV3cwFF5zqtNf5GxhNKsgor6OeD e8IJfcVt7WJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW POaRD/9jpXM0xYqYQDQUriFgnVaIDnvgFSL/46U4sho3u/zWCU0mYnjMsJT6QPG/RRKMxkyY11x forv50kpcfKon8FZQ2T0hFNUC4owMI6/0A374AmK/Ora2MO/lezgrYMncxLXQJ/cwXdV82jrjZl 3XkjPbKflqa5HA+VrMXpEKAYYJdSwH3+9GjzDVANi7zlBfLgt1dOBO+qoexBwqVv5v3izyOvy0u 56/HU2SKR2aI3kdeuk0xU7/uq2nLp7KaKHvA4nFQ3T4FbKb+SSqkpTZYYMj3rk/LK/6TBvX3iWO wN2itGPy6HwrKvZVUzFRujow7OYOkMoW4jNQQwHdJam1w+6GtHLEkWpBzYY4QX5VjwiG8IrQZqU VfvGT5b1IY9MQsrF5LF7vxmxtBsx/xlA+7Qfo6ytcMAJ7b0OBJPfiYNGl+kz26FemXuDO49ocs4 8sKGg3rQhP6PwsdF9sj86wdoRPFlLX+8B/ZE17rZAInpb/+R5uOkt3pfXyYj3gNXiHz6aVQA3pH Pj5bNRZ5o8LJHyVaBLcqrKU0qCx36fGKGfuQAI7jmCtUgYWXH9sedcGEvR0TuiZNZ3XAyayN4/q rkHy/HQO1xzuyZOSqn5zUlXAH07pe0EWtJHQgFImDdQ0M0Qhuv6L+vgK0YIz2oku6hdW4fFIARG RkNPw8EwiXk4Bhg== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Daniel Scally The current implementation of rzg2l_cru_fill_hw_slot() results in the artificial loss of frames. At present whenever a frame-complete IRQ is received the driver fills the hardware slot that was just written to with the address of the next buffer in the driver's queue. If the queue is empty, that hardware slot's address is set to the address of the scratch buffer to enable the capture loop to keep running. There is a minimum of a two-frame delay before that slot will be written to however, and in the intervening period userspace may queue more buffers which could be used. To resolve the issue rework rzg2l_cru_fill_hw_slot() so that it iteratively fills all slots from the queue which currently do not have a buffer assigned, until the queue is empty. The scratch buffer is only resorted to in the event that the queue is empty and the next slot that will be written to does not already have a buffer assigned. Signed-off-by: Daniel Scally Signed-off-by: Jacopo Mondi --- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 62 ++++++++++++------= ---- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index a6b606c63f90..45b58e2183bf 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -215,49 +215,52 @@ static void rzg2l_cru_set_slot_addr(struct rzg2l_cru_= dev *cru, } =20 /* - * Moves a buffer from the queue to the HW slot. If no buffer is - * available use the scratch buffer. The scratch buffer is never - * returned to userspace, its only function is to enable the capture - * loop to keep running. + * Move as many buffers as possible from the queue to HW slots If no buffe= r is + * available use the scratch buffer. The scratch buffer is never returned = to + * userspace, its only function is to enable the capture loop to keep runn= ing. + * + * @cru: the CRU device + * @slot: the slot that has just completed */ static void rzg2l_cru_fill_hw_slot(struct rzg2l_cru_dev *cru, int slot) { - struct vb2_v4l2_buffer *vbuf; struct rzg2l_cru_buffer *buf; + struct vb2_v4l2_buffer *vbuf; + unsigned int next_slot; dma_addr_t phys_addr; =20 lockdep_assert_held(&cru->hw_lock); =20 - /* A already populated slot shall never be overwritten. */ - if (WARN_ON(cru->queue_buf[slot])) - return; + /* Find the next slot which hasn't a valid address programmed. */ + for_each_cru_slot_from(cru, next_slot, slot) { + if (cru->queue_buf[next_slot]) + continue; =20 - dev_dbg(cru->dev, "Filling HW slot: %d\n", slot); + scoped_guard(spinlock_irqsave, &cru->qlock) { + buf =3D list_first_entry_or_null(&cru->buf_list, + struct rzg2l_cru_buffer, list); + if (buf) + list_del_init(&buf->list); + } =20 - guard(spinlock)(&cru->qlock); + if (!buf) { + /* Direct frames to the scratch buffer. */ + phys_addr =3D cru->scratch_phys; + cru->queue_buf[next_slot] =3D NULL; + rzg2l_cru_set_slot_addr(cru, next_slot, phys_addr); + return; + } =20 - if (list_empty(&cru->buf_list)) { - cru->queue_buf[slot] =3D NULL; - phys_addr =3D cru->scratch_phys; - } else { - /* Keep track of buffer we give to HW */ - buf =3D list_entry(cru->buf_list.next, - struct rzg2l_cru_buffer, list); vbuf =3D &buf->vb; - list_del_init(to_buf_list(vbuf)); - cru->queue_buf[slot] =3D vbuf; - - /* Setup DMA */ + cru->queue_buf[next_slot] =3D vbuf; phys_addr =3D vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, 0); + rzg2l_cru_set_slot_addr(cru, next_slot, phys_addr); } - - rzg2l_cru_set_slot_addr(cru, slot, phys_addr); } =20 static void rzg2l_cru_initialize_axi(struct rzg2l_cru_dev *cru) { const struct rzg2l_cru_info *info =3D cru->info; - unsigned int slot; u32 amnaxiattr; =20 /* @@ -266,8 +269,14 @@ static void rzg2l_cru_initialize_axi(struct rzg2l_cru_= dev *cru) */ rzg2l_cru_write(cru, AMnMBVALID, AMnMBVALID_MBVALID(cru->num_buf - 1)); =20 - for (slot =3D 0; slot < cru->num_buf; slot++) - rzg2l_cru_fill_hw_slot(cru, slot); + /* + * Program slot#0 with the first available buffer, if any. Pass to the + * function 'num_buf - 1' as rzg2l_cru_fill_hw_slot() calculates which + * is the next slot to program. + */ + scoped_guard(spinlock_irq, &cru->hw_lock) { + rzg2l_cru_fill_hw_slot(cru, cru->num_buf - 1); + } =20 if (info->has_stride) { u32 stride =3D cru->format.bytesperline; @@ -698,7 +707,6 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) cru->active_slot =3D rzg2l_cru_slot_next(cru, cru->active_slot); =20 dev_dbg(cru->dev, "Current written slot: %d\n", slot); - cru->buf_addr[slot] =3D 0; =20 /* * To hand buffers back in a known order to userspace start --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 75A783FCB02; Fri, 27 Mar 2026 17:10:59 +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=1774631461; cv=none; b=RjHPbML5D/8KRFahJOEsB54YufUS7iX0GZzwARLlP8AZVc+Tnpyh0W3sdwGDhuzXFuSLl+OAfAOVEK1E2N3XjPLEq5WNzZl/ecGtUkQVBJj1p+F4fKrmae7ebfzssHzWBsw7KFsvX1MWvGTJyUghU1FC1sjS8tpJx+dz5r11v94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631461; c=relaxed/simple; bh=Qb3tqpAyzwaVkziy1vZhmQ0Ppg+QtpMKLAkSM/eIhH0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fX69XmFJBYISzz9LxLswRXgtwUeSjqUqZIeeXgqVgYOA0qD2FtVqMurIo7wudw9AC1ev8Su/TMl09w1QIl6SvENKAdd57rUtZpmKO7ISi+NlFoydTz3nyY0MojyiS9kMZFkyK+p/f1wAW1aMs9h8d07Fhmn4ZHHDgswnsZm1/+I= 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=Ni68RzW3; 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="Ni68RzW3" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3B96631A3; Fri, 27 Mar 2026 18:09:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631364; bh=Qb3tqpAyzwaVkziy1vZhmQ0Ppg+QtpMKLAkSM/eIhH0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Ni68RzW3iR7xS1qMv9ZRB5yi8vGxzay/OWzV9WqrlIKI5cGbS5wdtdK00hdmKos24 Fl1FLkITYZLguHnQI/11BaODiBkopb8De42vO287wpJ265bQGu7st0dOiET8tRQHYw Mb7YqrrmhYkzOJecL8VCo+9GG3TAm8NrE48Ji3P8= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:18 +0100 Subject: [PATCH 13/14] media: rzg2l-cru: Remove the 'state' variable 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: <20260327-b4-cru-rework-v1-13-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6649; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=LZozLAu666sEG2pxrWd3ABjylrlsRX+4kPnVmBg/vqE=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroKRRpdLYUvHR9vNvJEoiKOCFH1tBUYc1kBA 8H+7HcBoE6JAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CgAKCRByNAaPFqFW PA+WD/9JUIUeS+qIhCFEWM9lENKO+jjkDPaQp8T3dik011UiR2RN8jMn3eZf4HmJl5FslDR2wvG LYlzpUIR5e9CdmEvVbpcimcf0K+8ovHka/a9abqoCjFhAMwhAWbA+jy95uzUnE3U2LMcrzW60PC cjyIjwhlhlAZxkgyNovqNqyoMiMVGzNVduTVGR2487n0vxy32N/ik5ibfL9RCNoufRAtta96g0l lfKb/Q9e7uDnT+syT3weexXjcKntXfRnL4vPLzajbYfeWdjzbwUdktwRDNzeKxusg9cPnjZy14Y GQ+cBdLLfSQ/HpjszGH5hR5qfsPoObkUDHIdHBheQXRZVrukILXlfWqoMfBFBMtCdgVgoerQJB5 lzoiQYmn75YnFk01JEB26uqvY+FiXJxYlXfXLSV2uFQrKN8s1WEdLFL9htaEAXKKTXiKQw2W+xx 2NVmbYvugZZ2EB2svaUvzngckGihUjF1YHmIBkgTE97vtCUUMyKdmVKOCDQB7cwQFws7JEXiRQn YQrq5ZcpbzXhI+2d4qW6GSb+f5XyFiu0VOgQYpx1jC6Uq1L8f2eO4hljVNb3aAEBnjnDJkz64Qs gj23ujkE/zdig0HDJFe8Mhkuw+DJQ/hxFC1L/LdzV4r7yIIGkavwrsx56A2OVJMcrF9j10UFHGZ mtDOztBS7RvB+DA== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The cru driver uses a 'state' variable for debugging purpose in the interrupt handler. The state is used to detect invalid usage conditions that are not meant to happen unless the driver has a bug in handling the stop and start conditions. Remove the state variable which seems to be a debugging leftover. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally --- .../media/platform/renesas/rzg2l-cru/rzg2l-cru.h | 15 ----- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 74 +-----------------= ---- 2 files changed, 3 insertions(+), 86 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h b/drivers= /media/platform/renesas/rzg2l-cru/rzg2l-cru.h index bc66b0c8c15e..56359491739e 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru.h @@ -36,20 +36,6 @@ enum rzg2l_csi2_pads { =20 struct rzg2l_cru_dev; =20 -/** - * enum rzg2l_cru_dma_state - DMA states - * @RZG2L_CRU_DMA_STOPPED: No operation in progress - * @RZG2L_CRU_DMA_STARTING: Capture starting up - * @RZG2L_CRU_DMA_RUNNING: Operation in progress have buffers - * @RZG2L_CRU_DMA_STOPPING: Stopping operation - */ -enum rzg2l_cru_dma_state { - RZG2L_CRU_DMA_STOPPED =3D 0, - RZG2L_CRU_DMA_STARTING, - RZG2L_CRU_DMA_RUNNING, - RZG2L_CRU_DMA_STOPPING, -}; - struct rzg2l_cru_csi { struct v4l2_async_connection *asd; struct v4l2_subdev *subdev; @@ -173,7 +159,6 @@ struct rzg2l_cru_dev { struct vb2_v4l2_buffer *queue_buf[RZG2L_CRU_HW_BUFFER_MAX]; struct list_head buf_list; unsigned int sequence; - enum rzg2l_cru_dma_state state; =20 struct v4l2_pix_format format; }; diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 45b58e2183bf..30424e2b6cc0 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -399,8 +399,6 @@ void rzg2l_cru_stop_image_processing(struct rzg2l_cru_d= ev *cru) if (icnms) dev_err(cru->dev, "Failed stop HW, something is seriously broken\n"); =20 - cru->state =3D RZG2L_CRU_DMA_STOPPED; - /* Wait until the FIFO becomes empty */ for (retries =3D 5; retries > 0; retries--) { if (cru->info->fifo_empty(cru)) @@ -588,8 +586,6 @@ static int rzg2l_cru_set_stream(struct rzg2l_cru_dev *c= ru, int on) =20 static void rzg2l_cru_stop_streaming(struct rzg2l_cru_dev *cru) { - cru->state =3D RZG2L_CRU_DMA_STOPPING; - rzg2l_cru_set_stream(cru, 0); } =20 @@ -601,8 +597,6 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) u32 amnmbs; int slot; =20 - guard(spinlock_irqsave)(&cru->hw_lock); - irq_status =3D rzg2l_cru_read(cru, CRUnINTS); if (!irq_status) return IRQ_RETVAL(handled); @@ -611,20 +605,9 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) =20 rzg2l_cru_write(cru, CRUnINTS, rzg2l_cru_read(cru, CRUnINTS)); =20 - /* Nothing to do if capture status is 'RZG2L_CRU_DMA_STOPPED' */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPED) { - dev_dbg(cru->dev, "IRQ while state stopped\n"); - return IRQ_RETVAL(handled); - } - - /* Increase stop retries if capture status is 'RZG2L_CRU_DMA_STOPPING' */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPING) { - if (irq_status & CRUnINTS_SFS) - dev_dbg(cru->dev, "IRQ while state stopping\n"); - return IRQ_RETVAL(handled); - } + /* Calculate slot and prepare for new capture. */ + guard(spinlock_irqsave)(&cru->hw_lock); =20 - /* Prepare for capture and update state */ amnmbs =3D rzg2l_cru_read(cru, AMnMBS); cru->active_slot =3D amnmbs & AMnMBS_MBSTS; =20 @@ -637,20 +620,6 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) else slot =3D cru->active_slot - 1; =20 - /* - * To hand buffers back in a known order to userspace start - * to capture first from slot 0. - */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STARTING) { - if (slot !=3D 0) { - dev_dbg(cru->dev, "Starting sync slot: %d\n", slot); - return IRQ_RETVAL(handled); - } - - dev_dbg(cru->dev, "Capture start synced!\n"); - cru->state =3D RZG2L_CRU_DMA_RUNNING; - } - /* Capture frame */ if (cru->queue_buf[slot]) { cru->queue_buf[slot]->field =3D cru->format.field; @@ -678,49 +647,18 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) u32 irq_status; int slot; =20 - guard(spinlock)(&cru->hw_lock); - irq_status =3D rzg2l_cru_read(cru, CRUnINTS2); if (!irq_status) return IRQ_NONE; =20 - dev_dbg(cru->dev, "CRUnINTS2 0x%x\n", irq_status); - rzg2l_cru_write(cru, CRUnINTS2, rzg2l_cru_read(cru, CRUnINTS2)); =20 - /* Nothing to do if capture status is 'RZG2L_CRU_DMA_STOPPED' */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPED) { - dev_dbg(cru->dev, "IRQ while state stopped\n"); - return IRQ_HANDLED; - } - - if (cru->state =3D=3D RZG2L_CRU_DMA_STOPPING) { - if (irq_status & CRUnINTS2_FExS(0) || - irq_status & CRUnINTS2_FExS(1) || - irq_status & CRUnINTS2_FExS(2) || - irq_status & CRUnINTS2_FExS(3)) - dev_dbg(cru->dev, "IRQ while state stopping\n"); - return IRQ_HANDLED; - } - + guard(spinlock)(&cru->hw_lock); slot =3D cru->active_slot; cru->active_slot =3D rzg2l_cru_slot_next(cru, cru->active_slot); =20 dev_dbg(cru->dev, "Current written slot: %d\n", slot); =20 - /* - * To hand buffers back in a known order to userspace start - * to capture first from slot 0. - */ - if (cru->state =3D=3D RZG2L_CRU_DMA_STARTING) { - if (slot !=3D 0) { - dev_dbg(cru->dev, "Starting sync slot: %d\n", slot); - return IRQ_HANDLED; - } - dev_dbg(cru->dev, "Capture start synced!\n"); - cru->state =3D RZG2L_CRU_DMA_RUNNING; - } - /* Capture frame */ if (cru->queue_buf[slot]) { struct vb2_v4l2_buffer *buf =3D cru->queue_buf[slot]; @@ -730,9 +668,6 @@ irqreturn_t rzg3e_cru_irq(int irq, void *data) buf->vb2_buf.timestamp =3D ktime_get_ns(); vb2_buffer_done(&buf->vb2_buf, VB2_BUF_STATE_DONE); cru->queue_buf[slot] =3D NULL; - } else { - /* Scratch buffer was used, dropping frame. */ - dev_dbg(cru->dev, "Dropping frame %u\n", cru->sequence); } =20 cru->sequence++; @@ -789,7 +724,6 @@ static int rzg2l_cru_start_streaming_vq(struct vb2_queu= e *vq, unsigned int count goto out; } =20 - cru->state =3D RZG2L_CRU_DMA_STARTING; dev_dbg(cru->dev, "Starting to capture\n"); return 0; =20 @@ -862,8 +796,6 @@ int rzg2l_cru_dma_register(struct rzg2l_cru_dev *cru) spin_lock_init(&cru->hw_lock); spin_lock_init(&cru->qlock); =20 - cru->state =3D RZG2L_CRU_DMA_STOPPED; - for (i =3D 0; i < RZG2L_CRU_HW_BUFFER_MAX; i++) cru->queue_buf[i] =3D NULL; =20 --=20 2.53.0 From nobody Thu Apr 2 15:42:26 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 B8F743FCB10; Fri, 27 Mar 2026 17:11:00 +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=1774631462; cv=none; b=UAMVW35rKYdBzodm89dBeXn1Y9LQttrnXF9pvPQsKlWWZ8V3UPjfnLsWYJfJGPeX9V6feZHWYk3QtmP2xy5KYHV25U5G5YCk8fWQmOHtqQ4pw+vn9ydfZfHoEb6iRQCCedgSmsodmf6WXEdXq/lI4kIR0fFNZSskZ02Z+tGAFwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631462; c=relaxed/simple; bh=4o5zJI28AsNHv2VmUBkAcTfvZzbIhJhaMp4vF1yGmb4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lECklFugywDTcvzVqDJqpcLm9owXn2UR0+O67vpquoYflFYk3ZPzfSygohK4bSfmi2gkxAlMMxq/vA47EfCAtwBMwuaBJWuEaWgYAdX68/2ZCUFneNzVsC/XTsY+kFcDjI6RIshwn0bYCDB439f42KjCl+4aWBczj68wahpMoX4= 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=U5QHUnQ6; 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="U5QHUnQ6" Received: from [100.93.44.16] (net-93-65-100-155.cust.vodafonedsl.it [93.65.100.155]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CCE9931A7; Fri, 27 Mar 2026 18:09:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1774631365; bh=4o5zJI28AsNHv2VmUBkAcTfvZzbIhJhaMp4vF1yGmb4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=U5QHUnQ6XLLYMseDt4CJxJ8B2Yi88A+/fqmke4G9+MqwQ+y0U24LKxgQNvILeyNPF oM9Fxvi1T9dq6jXhJ4vVMby+sHYqMmsjLH8JTVTRYMvyOahlW+ToXNhkr9phW7c1oZ +goL1UbmtYWt5NRRQNqFKdcld4oFRFf571xci/hE= From: Jacopo Mondi Date: Fri, 27 Mar 2026 18:10:19 +0100 Subject: [PATCH 14/14] media: rzg2l-cru: Simplify irq return value handling 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: <20260327-b4-cru-rework-v1-14-3b7d0430f538@ideasonboard.com> References: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> In-Reply-To: <20260327-b4-cru-rework-v1-0-3b7d0430f538@ideasonboard.com> To: Mauro Carvalho Chehab , Laurent Pinchart , Biju Das , Hans Verkuil , Sakari Ailus , Tommaso Merciai Cc: Daniel Scally , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Lad Prabhakar , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Jacopo Mondi , Jacopo Mondi X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1362; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=cyK9WQN1mHuE/llxrzRplL9jBJgVhDooTev1uqVgSUs=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpxroLLWtALRsYqxz6cV/B4pS/NJAaiFxXZyOQX pxAWEkzFvSJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaca6CwAKCRByNAaPFqFW PCcmD/9gtNkRQav3WFqlx9SVwvyNFLcJMhz9Jvm+F1W+qri7g+kOp6WnltrLEjJQjdpfvjNtZEJ hfdp1n9G5KSs1m90Ay9Br4x1Wb5nIbiTxrH2ZIGgKeNYY7Q+YZPwWItgMYKgU8FAtX4JD7hZLO2 WTRIJM++Xon2LjXR49c1hKE1dxYF1ZX9wMoP5uEgaWypC7i7TrpOwzrYLZZupgh1FboOVBQvNcs eU5UkSBLSk9T0lGF1oH9DINRoB5eQiPr3ponihjRoSdWogWIZURAnItSbNt1q+AlwuCXKFbw1ya Y/tVs7QP0dwarw1C7qXkbf1nJD2MvjvNh0ax+LT0s6xmFUY7jO+cRFNGBzKO8GMQfTZ6L0TDWss vMIHl46pPUwc/l4X9Zj9VKg0R/O1d+o8sDFN2+x/qP40G8iYx/lq6voNBK9yc/LyFMlytKR24WK 7AYsBbuX6jnTQzg9n4j9Pb765rJt7FANAuyNYyqK2gMQTgWIrS+4AjhoBD1PPhuEYJ6c50Q2Rzd 3Ouh77+e8YAoNKL5/nuEgOcHdWK5jXzLvFQZiEdOkiDGsPIwNTzd2D/m1SsjMdEs2h7s7Zx8UW0 3DtVuhqIUZpEjyljGhLi8+8pDUqmP6yMdfIC9NRNh7EdGvwDe1ZFJN3ID2VrT47NosaC7ppqgm/ 5ZCl2ec5kmk7cTg== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B From: Jacopo Mondi The rzg2l_cru_irq() irq handler uses a local variable to store the handler return value. Simplify it by using IRQ_NONE and IRQ_HANDLED. Signed-off-by: Jacopo Mondi Reviewed-by: Daniel Scally Reviewed-by: Tommaso Merciai --- drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c b/drive= rs/media/platform/renesas/rzg2l-cru/rzg2l-video.c index 30424e2b6cc0..e81573d0a84c 100644 --- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c +++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c @@ -592,16 +592,13 @@ static void rzg2l_cru_stop_streaming(struct rzg2l_cru= _dev *cru) irqreturn_t rzg2l_cru_irq(int irq, void *data) { struct rzg2l_cru_dev *cru =3D data; - unsigned int handled =3D 0; u32 irq_status; u32 amnmbs; int slot; =20 irq_status =3D rzg2l_cru_read(cru, CRUnINTS); if (!irq_status) - return IRQ_RETVAL(handled); - - handled =3D 1; + return IRQ_NONE; =20 rzg2l_cru_write(cru, CRUnINTS, rzg2l_cru_read(cru, CRUnINTS)); =20 @@ -638,7 +635,7 @@ irqreturn_t rzg2l_cru_irq(int irq, void *data) /* Prepare for next frame */ rzg2l_cru_fill_hw_slot(cru, slot); =20 - return IRQ_RETVAL(handled); + return IRQ_HANDLED; } =20 irqreturn_t rzg3e_cru_irq(int irq, void *data) --=20 2.53.0