On Thu Feb 12 15:38:11 2026 +0100, Jacopo Mondi wrote:
> 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 <[email protected]>
> Reviewed-by: Lad Prabhakar <[email protected]>
> Reviewed-by: Daniel Scally <[email protected]>
> Tested-by: Tommaso Merciai <[email protected]>
> Reviewed-by: Tommaso Merciai <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>
Patch committed.
Thanks,
Hans Verkuil
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/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c
index 75928b0f48be..96c71f1357f8 100644
--- a/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c
+++ b/drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c
@@ -340,23 +340,19 @@ bool rzg2l_fifo_empty(struct rzg2l_cru_dev *cru)
void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev *cru)
{
unsigned int retries = 0;
- unsigned long flags;
u32 icnms;
- 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);
+ }
/* Stop the operation of image conversion */
rzg2l_cru_write(cru, ICnEN, 0);
/* Wait for streaming to stop */
- while ((rzg2l_cru_read(cru, ICnMS) & ICnMS_IA) && retries++ <
RZG2L_RETRIES) {
- spin_unlock_irqrestore(&cru->qlock, flags);
+ while ((rzg2l_cru_read(cru, ICnMS) & ICnMS_IA) && retries++ <
RZG2L_RETRIES)
msleep(RZG2L_TIMEOUT_MS);
- spin_lock_irqsave(&cru->qlock, flags);
- }
icnms = rzg2l_cru_read(cru, ICnMS) & ICnMS_IA;
if (icnms)
@@ -400,8 +396,6 @@ void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev
*cru)
/* Resets the image processing module */
rzg2l_cru_write(cru, CRUnRST, 0);
-
- spin_unlock_irqrestore(&cru->qlock, flags);
}
static int rzg2l_cru_get_virtual_channel(struct rzg2l_cru_dev *cru)
@@ -469,8 +463,6 @@ int rzg2l_cru_start_image_processing(struct rzg2l_cru_dev
*cru)
csi_vc = ret;
cru->svc_channel = csi_vc;
- guard(spinlock_irqsave)(&cru->qlock);
-
/* Select a video input */
rzg2l_cru_write(cru, CRUnCTRL, CRUnCTRL_VINSEL(0));
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]