* UFS device needs urgent BKOPs.
                         */
                        if (!hba->pm_op_in_progress &&
-                           ufshcd_is_exception_event(lrbp->ucd_rsp_ptr))
-                               schedule_work(&hba->eeh_work);
+                           ufshcd_is_exception_event(lrbp->ucd_rsp_ptr) &&
+                           schedule_work(&hba->eeh_work)) {
+                               /*
+                                * Prevent suspend once eeh_work is scheduled
+                                * to avoid deadlock between ufshcd_suspend
+                                * and exception event handler.
+                                */
+                               pm_runtime_get_noresume(hba->dev);
+                       }
                        break;
                case UPIU_TRANSACTION_REJECT_UPIU:
                        /* TODO: handle Reject UPIU Response */
 
 out:
        ufshcd_scsi_unblock_requests(hba);
-       pm_runtime_put_sync(hba->dev);
+       /*
+        * pm_runtime_get_noresume is called while scheduling
+        * eeh_work to avoid suspend racing with exception work.
+        * Hence decrement usage counter using pm_runtime_put_noidle
+        * to allow suspend on completion of exception event handler.
+        */
+       pm_runtime_put_noidle(hba->dev);
+       pm_runtime_put(hba->dev);
        return;
 }
 
                        goto enable_gating;
        }
 
+       flush_work(&hba->eeh_work);
        ret = ufshcd_link_state_transition(hba, req_link_state, 1);
        if (ret)
                goto set_dev_active;