wake_up(&fimc->irq_queue);
        }
 
-       if (fimc->out_path != FIMC_IO_DMA)
+       if (atomic_read(&fimc->out_path) != FIMC_IO_DMA)
                goto done;
 
        if ((intsrc & FLITE_REG_CISTATUS_IRQ_SRC_FRMSTART) &&
        mutex_lock(&me->parent->graph_mutex);
 
        mutex_lock(&fimc->lock);
-       if (fimc->out_path != FIMC_IO_DMA) {
+       if (atomic_read(&fimc->out_path) != FIMC_IO_DMA) {
                ret = -EBUSY;
                goto done;
        }
        if (ret < 0)
                goto done;
 
-       if (++fimc->ref_count == 1 && fimc->out_path == FIMC_IO_DMA) {
+       if (++fimc->ref_count == 1 &&
+           atomic_read(&fimc->out_path) == FIMC_IO_DMA) {
                ret = fimc_pipeline_call(fimc, open, &fimc->pipeline,
                                         &fimc->vfd.entity, true);
                if (ret < 0) {
 
        mutex_lock(&fimc->lock);
 
-       if (--fimc->ref_count == 0 && fimc->out_path == FIMC_IO_DMA) {
+       if (--fimc->ref_count == 0 &&
+           atomic_read(&fimc->out_path) == FIMC_IO_DMA) {
                clear_bit(ST_FLITE_IN_USE, &fimc->state);
                fimc_lite_stop_capture(fimc, false);
                fimc_pipeline_call(fimc, close, &fimc->pipeline);
 
        case FLITE_SD_PAD_SOURCE_DMA:
                if (!(flags & MEDIA_LNK_FL_ENABLED))
-                       fimc->out_path = FIMC_IO_NONE;
+                       atomic_set(&fimc->out_path, FIMC_IO_NONE);
                else if (remote_ent_type == MEDIA_ENT_T_DEVNODE)
-                       fimc->out_path = FIMC_IO_DMA;
+                       atomic_set(&fimc->out_path, FIMC_IO_DMA);
                else
                        ret = -EINVAL;
                break;
 
        case FLITE_SD_PAD_SOURCE_ISP:
                if (!(flags & MEDIA_LNK_FL_ENABLED))
-                       fimc->out_path = FIMC_IO_NONE;
+                       atomic_set(&fimc->out_path, FIMC_IO_NONE);
                else if (remote_ent_type == MEDIA_ENT_T_V4L2_SUBDEV)
-                       fimc->out_path = FIMC_IO_ISP;
+                       atomic_set(&fimc->out_path, FIMC_IO_ISP);
                else
                        ret = -EINVAL;
                break;
                v4l2_err(sd, "Invalid pad index\n");
                ret = -EINVAL;
        }
+       mb();
 
        mutex_unlock(&fimc->lock);
        return ret;
        mf->colorspace = V4L2_COLORSPACE_JPEG;
        mutex_lock(&fimc->lock);
 
-       if ((fimc->out_path == FIMC_IO_ISP && sd->entity.stream_count > 0) ||
-           (fimc->out_path == FIMC_IO_DMA && vb2_is_busy(&fimc->vb_queue))) {
+       if ((atomic_read(&fimc->out_path) == FIMC_IO_ISP &&
+           sd->entity.stream_count > 0) ||
+           (atomic_read(&fimc->out_path) == FIMC_IO_DMA &&
+           vb2_is_busy(&fimc->vb_queue))) {
                mutex_unlock(&fimc->lock);
                return -EBUSY;
        }
         */
        fimc->sensor = __find_remote_sensor(&sd->entity);
 
-       mutex_lock(&fimc->lock);
-       if (fimc->out_path != FIMC_IO_ISP) {
-               mutex_unlock(&fimc->lock);
+       if (atomic_read(&fimc->out_path) != FIMC_IO_ISP)
                return -ENOIOCTLCMD;
-       }
 
+       mutex_lock(&fimc->lock);
        if (on) {
                flite_hw_reset(fimc);
                ret = fimc_lite_hw_init(fimc, true);
        memset(vfd, 0, sizeof(*vfd));
 
        fimc->fmt = &fimc_lite_formats[0];
-       fimc->out_path = FIMC_IO_DMA;
+       atomic_set(&fimc->out_path, FIMC_IO_DMA);
 
        snprintf(vfd->name, sizeof(vfd->name), "fimc-lite.%d.capture",
                 fimc->index);
        INIT_LIST_HEAD(&fimc->active_buf_q);
        fimc_pipeline_call(fimc, open, &fimc->pipeline,
                           &fimc->vfd.entity, false);
-       fimc_lite_hw_init(fimc, fimc->out_path == FIMC_IO_ISP);
+       fimc_lite_hw_init(fimc, atomic_read(&fimc->out_path) == FIMC_IO_ISP);
        clear_bit(ST_FLITE_SUSPENDED, &fimc->state);
 
        for (i = 0; i < fimc->reqbufs_count; i++) {