diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
index b532591..c17771a 100644
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
@@ -607,7 +607,7 @@ int dwc_otg_hcd_urb_dequeue(dwc_otg_hcd_t * hcd,
 			dwc_otg_hcd_qh_deactivate(hcd, qh, 0);
 			qh->channel = NULL;
 		} else if (DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) {
-			dwc_otg_hcd_qh_remove(hcd, qh);
+			dwc_otg_hcd_qh_remove_nolock(hcd, qh);
 		}
 	}
 	else {
@@ -644,7 +644,7 @@ int dwc_otg_hcd_endpoint_disable(dwc_otg_hcd_t * hcd, void *ep_handle,
 		DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
 	}
 
-	dwc_otg_hcd_qh_remove(hcd, qh);
+	dwc_otg_hcd_qh_remove_nolock(hcd, qh);
 	
 	DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
 	/* 
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
index 66e219d..4a0f4de 100644
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
@@ -620,7 +620,9 @@ extern int32_t dwc_otg_hcd_handle_wakeup_detected_intr(dwc_otg_hcd_t *
 extern dwc_otg_qh_t *dwc_otg_hcd_qh_create(dwc_otg_hcd_t * hcd,
 					   dwc_otg_hcd_urb_t * urb);
 extern void dwc_otg_hcd_qh_free(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh);
+extern int dwc_otg_hcd_qh_add_nolock(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh);
 extern int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh);
+extern void dwc_otg_hcd_qh_remove_nolock(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh);
 extern void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh);
 extern void dwc_otg_hcd_qh_deactivate(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh,
 				      int sched_csplit);
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
index cfed807..7ea3f83 100644
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
@@ -469,12 +469,9 @@ static int schedule_periodic(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
  *
  * @return 0 if successful, negative error code otherwise.
  */
-int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
+int dwc_otg_hcd_qh_add_nolock(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
 {
 	int status = 0;
-	uint64_t flags;
-
-	DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
 
 	if (!DWC_LIST_EMPTY(&qh->qh_list_entry)) {
 		/* QH already in a schedule. */
@@ -491,6 +488,21 @@ int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
 	}
 
       done:
+	return status;
+}
+
+/**
+ * same as dwc_otg_hcd_qh_add_nolock, but with locking
+ */
+int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
+{
+	int status = 0;
+	uint64_t flags;
+
+	DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
+
+	status = dwc_otg_hcd_qh_add_nolock(hcd, qh);
+
 	DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
 
 	return status;
@@ -519,14 +531,11 @@ static void deschedule_periodic(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
  *
  * @param hcd The HCD state structure.
  * @param qh QH to remove from schedule. */
-void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
+void dwc_otg_hcd_qh_remove_nolock(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
 {
-	uint64_t flags;
-	DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
-
 	if (DWC_LIST_EMPTY(&qh->qh_list_entry)) {
 		/* QH is not in a schedule. */
-		goto done;
+		return;
 	}
 
 	if (dwc_qh_is_non_per(qh)) {
@@ -538,8 +547,19 @@ void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
 	} else {
 		deschedule_periodic(hcd, qh);
 	}
+}
+
+/**
+ * same as dwc_otg_hcd_qh_remove_nolock, but with locking
+ */
+void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh)
+{
+	uint64_t flags;
+
+	DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
+
+	dwc_otg_hcd_qh_remove_nolock(hcd, qh);
 
-      done:
 	DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
 }
 
@@ -563,10 +583,10 @@ void dwc_otg_hcd_qh_deactivate(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh,
 	DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
 
 	if (dwc_qh_is_non_per(qh)) {
-		dwc_otg_hcd_qh_remove(hcd, qh);
+		dwc_otg_hcd_qh_remove_nolock(hcd, qh);
 		if (!DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) {
 			/* Add back to inactive non-periodic schedule. */
-			dwc_otg_hcd_qh_add(hcd, qh);
+			dwc_otg_hcd_qh_add_nolock(hcd, qh);
 		}
 	} else {
 		uint16_t frame_number = dwc_otg_hcd_get_frame_number(hcd);
@@ -613,7 +633,7 @@ void dwc_otg_hcd_qh_deactivate(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh,
 		}
 
 		if (DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) {
-			dwc_otg_hcd_qh_remove(hcd, qh);
+			dwc_otg_hcd_qh_remove_nolock(hcd, qh);
 		} else {
 			/*
 			 * Remove from periodic_sched_queued and move to
@@ -717,7 +737,7 @@ int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * qtd,
 		}
 	}
 
-	retval = dwc_otg_hcd_qh_add(hcd, *qh);
+	retval = dwc_otg_hcd_qh_add_nolock(hcd, *qh);
 	if (retval == 0) {
 		DWC_CIRCLEQ_INSERT_TAIL(&((*qh)->qtd_list), qtd,
 					qtd_list_entry);
