client->occ = occ;
        mutex_init(&client->lock);
        file->private_data = client;
+       get_device(occ->dev);
 
        /* We allocate a 1-page buffer, make sure it all fits */
        BUILD_BUG_ON((OCC_CMD_DATA_BYTES + 3) > PAGE_SIZE);
 {
        struct occ_client *client = file->private_data;
 
+       put_device(client->occ->dev);
        free_page((unsigned long)client->buffer);
        kfree(client);
 
        for (i = 1; i < req_len - 2; ++i)
                checksum += byte_request[i];
 
-       mutex_lock(&occ->occ_lock);
+       rc = mutex_lock_interruptible(&occ->occ_lock);
+       if (rc)
+               return rc;
 
        occ->client_buffer = response;
        occ->client_buffer_size = user_resp_len;
        occ->client_response_size = 0;
 
+       if (!occ->buffer) {
+               rc = -ENOENT;
+               goto done;
+       }
+
        /*
         * Get a sequence number and update the counter. Avoid a sequence
         * number of 0 which would pass the response check below even if the
 {
        struct occ *occ = platform_get_drvdata(pdev);
 
-       kvfree(occ->buffer);
-
        misc_deregister(&occ->mdev);
 
+       mutex_lock(&occ->occ_lock);
+       kvfree(occ->buffer);
+       occ->buffer = NULL;
+       mutex_unlock(&occ->occ_lock);
+
        device_for_each_child(&pdev->dev, NULL, occ_unregister_child);
 
        ida_simple_remove(&occ_ida, occ->idx);