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]