*
* @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;
/* 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);
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);
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) */
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);
}
((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) {
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;
}