diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c
index eb6c5cc437f4ac467d3fc67c91512dfc26ba963c..3614f7ee143466f78857e5d3f83a07d245c9fb94 100644
--- a/drivers/spi/spi_qsd.c
+++ b/drivers/spi/spi_qsd.c
@@ -1855,8 +1855,10 @@ static int msm_spi_transfer_one_message(struct spi_master *master,
 	 * get local resources for each transfer to ensure we're in a good
 	 * state and not interfering with other EE's using this device
 	 */
-	if (get_local_resources(dd))
+	if (get_local_resources(dd)) {
+		mutex_unlock(&dd->core_lock);
 		return -EINVAL;
+	}
 
 	reset_core(dd);
 	if (dd->use_dma) {
@@ -1882,14 +1884,7 @@ static int msm_spi_transfer_one_message(struct spi_master *master,
 	dd->transfer_pending = 0;
 	spin_unlock_irqrestore(&dd->queue_lock, flags);
 
-	mutex_unlock(&dd->core_lock);
 
-	/*
-	 * If needed, this can be done after the current message is complete,
-	 * and work can be continued upon resume. No motivation for now.
-	 */
-	if (dd->suspended)
-		wake_up_interruptible(&dd->continue_suspend);
 
 	/*
 	 * Put local resources prior to calling finalize to ensure the hw
@@ -1897,11 +1892,14 @@ static int msm_spi_transfer_one_message(struct spi_master *master,
 	 * different context since we're running in the spi kthread here) to
 	 * prevent race conditions between us and any other EE's using this hw.
 	 */
-	put_local_resources(dd);
 	if (dd->use_dma) {
 		msm_spi_bam_pipe_disconnect(dd, &dd->bam.prod);
 		msm_spi_bam_pipe_disconnect(dd, &dd->bam.cons);
 	}
+	put_local_resources(dd);
+	mutex_unlock(&dd->core_lock);
+	if (dd->suspended)
+		wake_up_interruptible(&dd->continue_suspend);
 	status_error = dd->cur_msg->status;
 	spi_finalize_current_message(master);
 	return status_error;