dev_dbg(isp->dev, "open device %s\n", vdev->name);
 
+       /*
+        * Ensure that if we are still loading we block. Once the loading
+        * is over we can proceed. We can't blindly hold the lock until
+        * that occurs as if the load fails we'll deadlock the unload
+        */
+       rt_mutex_lock(&isp->loading);
+       /*
+        * FIXME: revisit this with a better check once the code structure
+        * is cleaned up a bit more
+        */
+       if (!isp->ready) {
+               rt_mutex_unlock(&isp->loading);
+               return -ENXIO;
+       }
+       rt_mutex_unlock(&isp->loading);
+
        rt_mutex_lock(&isp->mutex);
 
        acc_node = !strcmp(vdev->name, "ATOMISP ISP ACC");
 
        /* Purpose of mutex is to protect and serialize use of isp data
         * structures and css API calls. */
        struct rt_mutex mutex;
+       /*
+        * This mutex ensures that we don't allow an open to succeed while
+        * the initialization process is incomplete
+        */
+       struct rt_mutex loading;
+       /* Set once the ISP is ready to allow opens */
+       bool ready;
        /*
         * Serialise streamoff: mutex is dropped during streamoff to
         * cancel the watchdog queue. MUST be acquired BEFORE
 
        dev_dbg(&pdev->dev, "atomisp mmio base: %p\n", isp->base);
 
        rt_mutex_init(&isp->mutex);
+       rt_mutex_init(&isp->loading);
        mutex_init(&isp->streamoff_mutex);
        spin_lock_init(&isp->lock);
 
                pci_write_config_dword(pdev, MRFLD_PCI_CSI_AFE_TRIM_CONTROL, csi_afe_trim);
        }
 
+       rt_mutex_lock(&isp->loading);
+
        err = atomisp_initialize_modules(isp);
        if (err < 0) {
                dev_err(&pdev->dev, "atomisp_initialize_modules (%d)\n", err);
        release_firmware(isp->firmware);
        isp->firmware = NULL;
        isp->css_env.isp_css_fw.data = NULL;
+       isp->ready = true;
+       rt_mutex_unlock(&isp->loading);
 
        atomisp_drvfs_init(isp);
 
 register_entities_fail:
        atomisp_uninitialize_modules(isp);
 initialize_modules_fail:
+       rt_mutex_unlock(&isp->loading);
        cpu_latency_qos_remove_request(&isp->pm_qos);
        atomisp_msi_irq_uninit(isp);
        pci_free_irq_vectors(pdev);