/* No device driver attached */
                return -ENODEV;
 
+       /*
+        * Don't mess with the host during probe: wait until the loop in
+        * scan_add_host() completes
+        */
+       if (mutex_lock_interruptible(&list_lock))
+               return -ERESTARTSYS;
        ici = to_soc_camera_host(icd->parent);
+       mutex_unlock(&list_lock);
 
        if (mutex_lock_interruptible(&icd->video_lock))
                return -ERESTARTSYS;
                if (icl->reset)
                        icl->reset(icd->pdev);
 
-               /* Don't mess with the host during probe */
                mutex_lock(&ici->host_lock);
                ret = ici->ops->add(icd);
                mutex_unlock(&ici->host_lock);
 eresume:
        __soc_camera_power_off(icd);
 epower:
+       mutex_lock(&ici->host_lock);
        ici->ops->remove(icd);
+       mutex_unlock(&ici->host_lock);
 eiciadd:
        icd->use_count--;
        module_put(ici->ops->owner);
 
                if (ici->ops->init_videobuf2)
                        vb2_queue_release(&icd->vb2_vidq);
+               mutex_lock(&ici->host_lock);
                ici->ops->remove(icd);
+               mutex_unlock(&ici->host_lock);
 
                __soc_camera_power_off(icd);
        }
 {
        struct soc_camera_device *icd;
 
-       mutex_lock(&ici->host_lock);
+       mutex_lock(&list_lock);
 
        list_for_each_entry(icd, &devices, list) {
                if (icd->iface == ici->nr) {
                }
        }
 
-       mutex_unlock(&ici->host_lock);
+       mutex_unlock(&list_lock);
 }
 
 #ifdef CONFIG_I2C_BOARDINFO
        if (icl->reset)
                icl->reset(icd->pdev);
 
+       mutex_lock(&ici->host_lock);
        ret = ici->ops->add(icd);
+       mutex_unlock(&ici->host_lock);
        if (ret < 0)
                goto eadd;
 
                icd->field              = mf.field;
        }
 
+       mutex_lock(&ici->host_lock);
        ici->ops->remove(icd);
+       mutex_unlock(&ici->host_lock);
 
        mutex_unlock(&icd->video_lock);
 
        video_device_release(icd->vdev);
        icd->vdev = NULL;
 evdc:
+       mutex_lock(&ici->host_lock);
        ici->ops->remove(icd);
+       mutex_unlock(&ici->host_lock);
 eadd:
 ereg:
        v4l2_ctrl_handler_free(&icd->ctrl_handler);