diff --git a/drivers/staging/dwc2/core.c b/drivers/staging/dwc2/core.c index 549cd3dd0bc2..3177db2380bf 100644 --- a/drivers/staging/dwc2/core.c +++ b/drivers/staging/dwc2/core.c @@ -365,8 +365,9 @@ static void dwc2_gusbcfg_init(struct dwc2_hsotg *hsotg) * * @hsotg: Programming view of the DWC_otg controller * @select_phy: If true then also set the Phy type + * @irq: If >= 0, the irq to register */ -int dwc2_core_init(struct dwc2_hsotg *hsotg, bool select_phy) +int dwc2_core_init(struct dwc2_hsotg *hsotg, bool select_phy, int irq) { u32 usbcfg, otgctl; int retval; @@ -430,6 +431,16 @@ int dwc2_core_init(struct dwc2_hsotg *hsotg, bool select_phy) /* Clear the SRP success bit for FS-I2c */ hsotg->srp_success = 0; + if (irq >= 0) { + dev_dbg(hsotg->dev, "registering common handler for irq%d\n", + irq); + retval = devm_request_irq(hsotg->dev, irq, + dwc2_handle_common_intr, IRQF_SHARED, + dev_name(hsotg->dev), hsotg); + if (retval) + return retval; + } + /* Enable common interrupts */ dwc2_enable_common_interrupts(hsotg); diff --git a/drivers/staging/dwc2/core.h b/drivers/staging/dwc2/core.h index f8ee04b7cc00..320ed00b6ce7 100644 --- a/drivers/staging/dwc2/core.h +++ b/drivers/staging/dwc2/core.h @@ -445,7 +445,7 @@ extern void dwc2_read_packet(struct dwc2_hsotg *hsotg, u8 *dest, u16 bytes); extern void dwc2_flush_tx_fifo(struct dwc2_hsotg *hsotg, const int num); extern void dwc2_flush_rx_fifo(struct dwc2_hsotg *hsotg); -extern int dwc2_core_init(struct dwc2_hsotg *hsotg, bool select_phy); +extern int dwc2_core_init(struct dwc2_hsotg *hsotg, bool select_phy, int irq); extern void dwc2_enable_global_interrupts(struct dwc2_hsotg *hcd); extern void dwc2_disable_global_interrupts(struct dwc2_hsotg *hcd); diff --git a/drivers/staging/dwc2/hcd.c b/drivers/staging/dwc2/hcd.c index 1ea1222e9b6b..f68d8cc408fa 100644 --- a/drivers/staging/dwc2/hcd.c +++ b/drivers/staging/dwc2/hcd.c @@ -1313,7 +1313,7 @@ static void dwc2_conn_id_status_change(struct work_struct *work) dev_err(hsotg->dev, "Connection id status change timed out"); hsotg->op_state = OTG_STATE_B_PERIPHERAL; - dwc2_core_init(hsotg, false); + dwc2_core_init(hsotg, false, -1); dwc2_enable_global_interrupts(hsotg); } else { /* A-Device connector (Host Mode) */ @@ -1332,7 +1332,7 @@ static void dwc2_conn_id_status_change(struct work_struct *work) hsotg->op_state = OTG_STATE_A_HOST; /* Initialize the Core for Host mode */ - dwc2_core_init(hsotg, false); + dwc2_core_init(hsotg, false, -1); dwc2_enable_global_interrupts(hsotg); dwc2_hcd_start(hsotg); } @@ -2818,17 +2818,17 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, ((struct wrapper_priv_data *) &hcd->hcd_priv)->hsotg = hsotg; hsotg->priv = hcd; - /* Initialize the DWC_otg core, and select the Phy type */ - retval = dwc2_core_init(hsotg, true); - if (retval) - goto error2; - /* * Disable the global interrupt until all the interrupt handlers are * installed */ dwc2_disable_global_interrupts(hsotg); + /* Initialize the DWC_otg core, and select the Phy type */ + retval = dwc2_core_init(hsotg, true, irq); + if (retval) + goto error2; + /* Create new workqueue and init work */ hsotg->wq_otg = create_singlethread_workqueue("dwc_otg"); if (!hsotg->wq_otg) { diff --git a/drivers/staging/dwc2/pci.c b/drivers/staging/dwc2/pci.c index 80808d82aa74..8d9a9023c29a 100644 --- a/drivers/staging/dwc2/pci.c +++ b/drivers/staging/dwc2/pci.c @@ -155,13 +155,6 @@ static int dwc2_driver_probe(struct pci_dev *dev, pci_set_drvdata(dev, hsotg); dev_dbg(&dev->dev, "hsotg=%p\n", hsotg); - dev_dbg(&dev->dev, "registering common handler for irq%d\n", dev->irq); - retval = devm_request_irq(&dev->dev, dev->irq, dwc2_handle_common_intr, - IRQF_SHARED, dev_name(&dev->dev), - hsotg); - if (retval) - dwc2_hcd_remove(hsotg); - return retval; }