]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: rzg2l-cru: Remove locking from start/stop routines
authorJacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
Thu, 12 Feb 2026 14:38:11 +0000 (15:38 +0100)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 19 May 2026 07:01:49 +0000 (09:01 +0200)
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 <jacopo.mondi+renesas@ideasonboard.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Tested-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/renesas/rzg2l-cru/rzg2l-video.c

index 75928b0f48be6a45cada6b14af5175c82c667ceb..96c71f1357f8067591f4fdea655e0cf87f5d471d 100644 (file)
@@ -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));