Created
September 4, 2012 19:45
-
-
Save ddv2005/3625562 to your computer and use it in GitHub Desktop.
One time allocation for channel lock in USB driver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c | |
index 20f989e..46fb4de 100644 | |
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c | |
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c | |
@@ -822,6 +822,7 @@ static void dwc_otg_hcd_free(dwc_otg_hcd_t * dwc_otg_hcd) | |
} else if (dwc_otg_hcd->status_buf != NULL) { | |
DWC_FREE(dwc_otg_hcd->status_buf); | |
} | |
+ DWC_SPINLOCK_FREE(dwc_otg_hcd->channel_lock); | |
DWC_SPINLOCK_FREE(dwc_otg_hcd->lock); | |
/* Set core_if's lock pointer to NULL */ | |
dwc_otg_hcd->core_if->lock = NULL; | |
@@ -848,6 +849,7 @@ int dwc_otg_hcd_init(dwc_otg_hcd_t * hcd, dwc_otg_core_if_t * core_if) | |
dwc_hc_t *channel; | |
hcd->lock = DWC_SPINLOCK_ALLOC(); | |
+ hcd->channel_lock = DWC_SPINLOCK_ALLOC(); | |
DWC_DEBUGPL(DBG_HCDV, "init of HCD %p given core_if %p\n", | |
hcd, core_if); | |
if (!hcd->lock) { | |
@@ -1248,7 +1250,7 @@ dwc_otg_transaction_type_e dwc_otg_hcd_select_transactions(dwc_otg_hcd_t * hcd) | |
dwc_otg_qh_t *qh; | |
int num_channels; | |
dwc_irqflags_t flags; | |
- dwc_spinlock_t *channel_lock = DWC_SPINLOCK_ALLOC(); | |
+ dwc_spinlock_t *channel_lock = hcd->channel_lock; | |
dwc_otg_transaction_type_e ret_val = DWC_OTG_TRANSACTION_NONE; | |
#ifdef DEBUG_SOF | |
@@ -1348,8 +1350,6 @@ dwc_otg_transaction_type_e dwc_otg_hcd_select_transactions(dwc_otg_hcd_t * hcd) | |
#ifdef DEBUG_HOST_CHANNELS | |
last_sel_trans_num_avail_hc_at_end = hcd->available_host_channels; | |
#endif /* DEBUG_HOST_CHANNELS */ | |
- | |
- DWC_SPINLOCK_FREE(channel_lock); | |
return ret_val; | |
} | |
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h | |
index dd30f47..6d82127 100644 | |
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h | |
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h | |
@@ -548,7 +548,7 @@ struct dwc_otg_hcd { | |
/* */ | |
dwc_spinlock_t *lock; | |
- | |
+ dwc_spinlock_t *channel_lock; | |
/** | |
* Private data that could be used by OS wrapper. | |
*/ | |
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c | |
index d0d5fa1..a2ceb77 100644 | |
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c | |
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c | |
@@ -276,7 +276,7 @@ void dump_frame_list(dwc_otg_hcd_t * hcd) | |
static void release_channel_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) | |
{ | |
dwc_irqflags_t flags; | |
- dwc_spinlock_t *channel_lock = DWC_SPINLOCK_ALLOC(); | |
+ dwc_spinlock_t *channel_lock = hcd->channel_lock; | |
dwc_hc_t *hc = qh->channel; | |
if (dwc_qh_is_non_per(qh)) { | |
@@ -306,7 +306,6 @@ static void release_channel_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) | |
dwc_memset(qh->desc_list, 0x00, | |
sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh)); | |
} | |
- DWC_SPINLOCK_FREE(channel_lock); | |
} | |
/** | |
diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | |
index f1658fa..21e8f09 100644 | |
--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | |
+++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | |
@@ -922,7 +922,7 @@ static void release_channel(dwc_otg_hcd_t * hcd, | |
dwc_otg_transaction_type_e tr_type; | |
int free_qtd; | |
dwc_irqflags_t flags; | |
- dwc_spinlock_t *channel_lock = DWC_SPINLOCK_ALLOC(); | |
+ dwc_spinlock_t *channel_lock = hcd->channel_lock; | |
DWC_DEBUGPL(DBG_HCDV, " %s: channel %d, halt_status %d, xfer_len %d\n", | |
__func__, hc->hc_num, halt_status, hc->xfer_len); | |
@@ -1009,7 +1009,6 @@ cleanup: | |
if (tr_type != DWC_OTG_TRANSACTION_NONE) { | |
dwc_otg_hcd_queue_transactions(hcd, tr_type); | |
} | |
- DWC_SPINLOCK_FREE(channel_lock); | |
} | |
/** |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment