On Mon Aug 17 12:22:02 2026 +0530, Balakrishnan Sambath wrote:
> isc_s_awb_ctrl() called isc_update_awb_ctrls() unconditionally, writing
> the white balance registers even when the device is runtime suspended;
> on many ARM platforms accessing the unclocked registers is an external
> abort. The write was also done without awb_lock, racing isc_awb_work(),
> which holds it so the DMA done IRQ cannot latch a half-updated pipeline.
> 
> Write the registers only while streaming and not stopping, under
> awb_lock, and update the profile there. The isc->stop check covers the
> window where isc_stop_streaming() has gated the clocks but vb2 still
> reports streaming. Otherwise the new values stay cached and
> isc_configure() programs them at the next stream start.
> 
> Fixes: 4e52889f48fe ("media: atmel: atmel-isc-base: expose white balance as 
> v4l2 controls")
> Cc: [email protected]
> Reviewed-by: Eugen Hristev <[email protected]>
> Signed-off-by: Balakrishnan Sambath <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 .../media/platform/microchip/microchip-isc-base.c    | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

---

diff --git a/drivers/media/platform/microchip/microchip-isc-base.c 
b/drivers/media/platform/microchip/microchip-isc-base.c
index 0f486dd5bd82..cf4611443fd1 100644
--- a/drivers/media/platform/microchip/microchip-isc-base.c
+++ b/drivers/media/platform/microchip/microchip-isc-base.c
@@ -1511,20 +1511,24 @@ static int isc_s_awb_ctrl(struct v4l2_ctrl *ctrl)
                if (ctrl->cluster[ISC_CTRL_GB_OFF]->is_new)
                        ctrls->offset[ISC_HIS_CFG_MODE_GB] = 
isc->gb_off_ctrl->val;
 
-               isc_update_awb_ctrls(isc);
-
                mutex_lock(&isc->awb_mutex);
-               if (vb2_is_streaming(&isc->vb2_vidq)) {
+               if (vb2_is_streaming(&isc->vb2_vidq) && !isc->stop) {
+                       unsigned long flags;
+
                        /*
-                        * If we are streaming, we can update profile to
-                        * have the new settings in place.
+                        * awb_lock keeps the DMA done IRQ from latching a
+                        * partially written WB pipeline.
                         */
+                       spin_lock_irqsave(&isc->awb_lock, flags);
+                       isc_update_awb_ctrls(isc);
+                       spin_unlock_irqrestore(&isc->awb_lock, flags);
+
                        isc_update_profile(isc);
                } else {
                        /*
-                        * The auto cluster will activate automatically this
-                        * control. This has to be deactivated when not
-                        * streaming.
+                        * Not streaming: keep the cached values for the next
+                        * stream start and deactivate the cluster-activated
+                        * do_white_balance button.
                         */
                        v4l2_ctrl_activate(isc->do_wb_ctrl, false);
                }
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to