struct isc_buffer *buf;
        int ret;
 
+       mutex_lock(&isc->awb_mutex);
        v4l2_ctrl_activate(isc->do_wb_ctrl, false);
 
        isc->stop = true;
                v4l2_err(&isc->v4l2_dev,
                         "Timeout waiting for end of the capture\n");
 
+       mutex_unlock(&isc->awb_mutex);
+
        /* Disable DMA interrupt */
        regmap_write(isc->regmap, ISC_INTDIS, ISC_INT_DDONE);
 
        u32 min, max;
        int ret;
 
-       /* streaming is not active anymore */
-       if (isc->stop)
-               return;
-
        if (ctrls->hist_stat != HIST_ENABLED)
                return;
 
        }
        regmap_write(regmap, ISC_HIS_CFG + isc->offsets.his,
                     hist_id | baysel | ISC_HIS_CFG_RAR);
+
+       /*
+        * We have to make sure the streaming has not stopped meanwhile.
+        * ISC requires a frame to clock the internal profile update.
+        * To avoid issues, lock the sequence with a mutex
+        */
+       mutex_lock(&isc->awb_mutex);
+
+       /* streaming is not active anymore */
+       if (isc->stop) {
+               mutex_unlock(&isc->awb_mutex);
+               return;
+       };
+
        isc_update_profile(isc);
+
+       mutex_unlock(&isc->awb_mutex);
+
        /* if awb has been disabled, we don't need to start another histogram */
        if (ctrls->awb)
                regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_HISREQ);
 
                isc_update_awb_ctrls(isc);
 
+               mutex_lock(&isc->awb_mutex);
                if (vb2_is_streaming(&isc->vb2_vidq)) {
                        /*
                         * If we are streaming, we can update profile to
                         */
                        v4l2_ctrl_activate(isc->do_wb_ctrl, false);
                }
+               mutex_unlock(&isc->awb_mutex);
 
                /* if we have autowhitebalance on, start histogram procedure */
                if (ctrls->awb == ISC_WB_AUTO &&
 {
        struct isc_device *isc = container_of(notifier->v4l2_dev,
                                              struct isc_device, v4l2_dev);
+       mutex_destroy(&isc->awb_mutex);
        cancel_work_sync(&isc->awb_work);
        video_unregister_device(&isc->video_dev);
        v4l2_ctrl_handler_free(&isc->ctrls.handler);
        isc->current_subdev = container_of(notifier,
                                           struct isc_subdev_entity, notifier);
        mutex_init(&isc->lock);
+       mutex_init(&isc->awb_mutex);
+
        init_completion(&isc->comp);
 
        /* Initialize videobuf2 queue */
        return 0;
 
 isc_async_complete_err:
+       mutex_destroy(&isc->awb_mutex);
        mutex_destroy(&isc->lock);
        return ret;
 }