diff options
Diffstat (limited to 'drivers/staging/dwc2')
-rw-r--r-- | drivers/staging/dwc2/core.c | 44 | ||||
-rw-r--r-- | drivers/staging/dwc2/core_intr.c | 15 | ||||
-rw-r--r-- | drivers/staging/dwc2/hcd.c | 17 | ||||
-rw-r--r-- | drivers/staging/dwc2/hcd.h | 12 | ||||
-rw-r--r-- | drivers/staging/dwc2/hcd_intr.c | 26 | ||||
-rw-r--r-- | drivers/staging/dwc2/pci.c | 19 |
6 files changed, 45 insertions, 88 deletions
diff --git a/drivers/staging/dwc2/core.c b/drivers/staging/dwc2/core.c index 3177db2380bf..ac8ed15064dc 100644 --- a/drivers/staging/dwc2/core.c +++ b/drivers/staging/dwc2/core.c @@ -506,8 +506,7 @@ static void dwc2_config_fifos(struct dwc2_hsotg *hsotg) struct dwc2_core_params *params = hsotg->core_params; u32 rxfsiz, nptxfsiz, ptxfsiz, hptxfsiz, dfifocfg; - if (!(hsotg->hwcfg2 & GHWCFG2_DYNAMIC_FIFO) || - !params->enable_dynamic_fifo) + if (!params->enable_dynamic_fifo) return; dev_dbg(hsotg->dev, "Total FIFO Size=%d\n", hsotg->total_fifo_size); @@ -1146,16 +1145,10 @@ void dwc2_hc_cleanup(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) static void dwc2_hc_set_even_odd_frame(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan, u32 *hcchar) { - u32 hfnum, frnum; - if (chan->ep_type == USB_ENDPOINT_XFER_INT || chan->ep_type == USB_ENDPOINT_XFER_ISOC) { - hfnum = readl(hsotg->regs + HFNUM); - frnum = hfnum >> HFNUM_FRNUM_SHIFT & - HFNUM_FRNUM_MASK >> HFNUM_FRNUM_SHIFT; - /* 1 if _next_ frame is odd, 0 if it's even */ - if (frnum & 0x1) + if (dwc2_hcd_get_frame_number(hsotg) & 0x1) *hcchar |= HCCHAR_ODDFRM; } } @@ -1696,7 +1689,7 @@ u32 dwc2_calc_frame_interval(struct dwc2_hsotg *hsotg) GHWCFG2_FS_PHY_TYPE_DEDICATED) clock = 48; - if ((hprt0 & HPRT0_SPD_MASK) == 0) + if ((hprt0 & HPRT0_SPD_MASK) == HPRT0_SPD_HIGH_SPEED) /* High speed case */ return 125 * clock; else @@ -1815,8 +1808,6 @@ void dwc2_dump_global_registers(struct dwc2_hsotg *hsotg) { #ifdef DEBUG u32 __iomem *addr; - int i, ep_num; - char *txfsiz; dev_dbg(hsotg->dev, "Core Global Registers\n"); addr = hsotg->regs + GOTGCTL; @@ -1892,23 +1883,6 @@ void dwc2_dump_global_registers(struct dwc2_hsotg *hsotg) dev_dbg(hsotg->dev, "HPTXFSIZ @0x%08lX : 0x%08X\n", (unsigned long)addr, readl(addr)); - if (hsotg->core_params->en_multiple_tx_fifo <= 0) { - ep_num = hsotg->hwcfg4 >> GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT & - GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK >> - GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT; - txfsiz = "DPTXFSIZ"; - } else { - ep_num = hsotg->hwcfg4 >> GHWCFG4_NUM_IN_EPS_SHIFT & - GHWCFG4_NUM_IN_EPS_MASK >> GHWCFG4_NUM_IN_EPS_SHIFT; - txfsiz = "DIENPTXF"; - } - - for (i = 0; i < ep_num; i++) { - addr = hsotg->regs + DPTXFSIZN(i + 1); - dev_dbg(hsotg->dev, "%s[%d] @0x%08lX : 0x%08X\n", txfsiz, i + 1, - (unsigned long)addr, readl(addr)); - } - addr = hsotg->regs + PCGCTL; dev_dbg(hsotg->dev, "PCGCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, readl(addr)); @@ -2298,7 +2272,7 @@ int dwc2_set_param_phy_type(struct dwc2_hsotg *hsotg, int val) #ifndef NO_FS_PHY_HW_CHECKS valid = 0; #else - val = 0; + val = DWC2_PHY_TYPE_PARAM_FS; dev_dbg(hsotg->dev, "Setting phy_type to %d\n", val); retval = -EINVAL; #endif @@ -2325,7 +2299,7 @@ int dwc2_set_param_phy_type(struct dwc2_hsotg *hsotg, int val) dev_err(hsotg->dev, "%d invalid for phy_type. Check HW configuration.\n", val); - val = 0; + val = DWC2_PHY_TYPE_PARAM_FS; if (hs_phy_type != GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED) { if (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI || hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI) @@ -2360,8 +2334,8 @@ int dwc2_set_param_speed(struct dwc2_hsotg *hsotg, int val) valid = 0; } - if (val == 0 && dwc2_get_param_phy_type(hsotg) == - DWC2_PHY_TYPE_PARAM_FS) + if (val == DWC2_SPEED_PARAM_HIGH && + dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS) valid = 0; if (!valid) { @@ -2370,7 +2344,7 @@ int dwc2_set_param_speed(struct dwc2_hsotg *hsotg, int val) "%d invalid for speed parameter. Check HW configuration.\n", val); val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS ? - 1 : 0; + DWC2_SPEED_PARAM_FULL : DWC2_SPEED_PARAM_HIGH; dev_dbg(hsotg->dev, "Setting speed to %d\n", val); retval = -EINVAL; } @@ -2668,7 +2642,7 @@ int dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val) * for the DWC_otg core. It returns non-0 if any parameters are invalid. */ int dwc2_set_parameters(struct dwc2_hsotg *hsotg, - struct dwc2_core_params *params) + const struct dwc2_core_params *params) { int retval = 0; diff --git a/drivers/staging/dwc2/core_intr.c b/drivers/staging/dwc2/core_intr.c index 4c9ad14e90ec..98c51bba6622 100644 --- a/drivers/staging/dwc2/core_intr.c +++ b/drivers/staging/dwc2/core_intr.c @@ -403,8 +403,7 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg) #define GINTMSK_COMMON (GINTSTS_WKUPINT | GINTSTS_SESSREQINT | \ GINTSTS_CONIDSTSCHNG | GINTSTS_OTGINT | \ GINTSTS_MODEMIS | GINTSTS_DISCONNINT | \ - GINTSTS_USBSUSP | GINTSTS_RESTOREDONE | \ - GINTSTS_PRTINT) + GINTSTS_USBSUSP | GINTSTS_PRTINT) /* * This function returns the Core Interrupt register @@ -450,7 +449,7 @@ irqreturn_t dwc2_handle_common_intr(int irq, void *dev) { struct dwc2_hsotg *hsotg = dev; u32 gintsts; - int retval = 0; + irqreturn_t retval = IRQ_NONE; if (dwc2_check_core_status(hsotg) < 0) { dev_warn(hsotg->dev, "Controller is disconnected\n"); @@ -461,7 +460,7 @@ irqreturn_t dwc2_handle_common_intr(int irq, void *dev) gintsts = dwc2_read_common_intr(hsotg); if (gintsts & ~GINTSTS_PRTINT) - retval = 1; + retval = IRQ_HANDLED; if (gintsts & GINTSTS_MODEMIS) dwc2_handle_mode_mismatch_intr(hsotg); @@ -478,12 +477,6 @@ irqreturn_t dwc2_handle_common_intr(int irq, void *dev) if (gintsts & GINTSTS_USBSUSP) dwc2_handle_usb_suspend_intr(hsotg); - if (gintsts & GINTSTS_RESTOREDONE) { - gintsts = GINTSTS_RESTOREDONE; - writel(gintsts, hsotg->regs + GINTSTS); - dev_dbg(hsotg->dev, " --Restore done interrupt received--\n"); - } - if (gintsts & GINTSTS_PRTINT) { /* * The port interrupt occurs while in device mode with HPRT0 @@ -500,6 +493,6 @@ irqreturn_t dwc2_handle_common_intr(int irq, void *dev) spin_unlock(&hsotg->lock); out: - return IRQ_RETVAL(retval); + return retval; } EXPORT_SYMBOL_GPL(dwc2_handle_common_intr); diff --git a/drivers/staging/dwc2/hcd.c b/drivers/staging/dwc2/hcd.c index 8551ccedf037..2ed54b172a3b 100644 --- a/drivers/staging/dwc2/hcd.c +++ b/drivers/staging/dwc2/hcd.c @@ -1563,9 +1563,9 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq, break; case GetPortStatus: - dev_dbg(hsotg->dev, - "GetPortStatus wIndex=0x%04x flags=0x%08x\n", windex, - hsotg->flags.d32); + dev_vdbg(hsotg->dev, + "GetPortStatus wIndex=0x%04x flags=0x%08x\n", windex, + hsotg->flags.d32); if (!windex || windex > 1) goto error; @@ -1598,7 +1598,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq, } hprt0 = readl(hsotg->regs + HPRT0); - dev_dbg(hsotg->dev, " HPRT0: 0x%08x\n", hprt0); + dev_vdbg(hsotg->dev, " HPRT0: 0x%08x\n", hprt0); if (hprt0 & HPRT0_CONNSTS) port_status |= USB_PORT_STAT_CONNECTION; @@ -1623,7 +1623,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq, port_status |= USB_PORT_STAT_TEST; /* USB_PORT_FEAT_INDICATOR unsupported always 0 */ - dev_dbg(hsotg->dev, "port_status=%08x\n", port_status); + dev_vdbg(hsotg->dev, "port_status=%08x\n", port_status); *(__le32 *)buf = cpu_to_le32(port_status); break; @@ -2533,9 +2533,8 @@ static void _dwc2_hcd_endpoint_reset(struct usb_hcd *hcd, static irqreturn_t _dwc2_hcd_irq(struct usb_hcd *hcd) { struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd); - int retval = dwc2_hcd_intr(hsotg); - return IRQ_RETVAL(retval); + return dwc2_handle_hcd_intr(hsotg); } /* @@ -2702,7 +2701,7 @@ EXPORT_SYMBOL_GPL(dwc2_set_all_params); * a negative error on failure. */ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, - struct dwc2_core_params *params) + const struct dwc2_core_params *params) { struct usb_hcd *hcd; struct dwc2_host_chan *channel; @@ -2919,7 +2918,7 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, * allocates the DMA buffer pool, registers the USB bus, requests the * IRQ line, and calls hcd_start method. */ - retval = usb_add_hcd(hcd, irq, IRQF_SHARED | IRQF_DISABLED); + retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval < 0) goto error3; diff --git a/drivers/staging/dwc2/hcd.h b/drivers/staging/dwc2/hcd.h index d071f1a05df1..cf6c055aec8d 100644 --- a/drivers/staging/dwc2/hcd.h +++ b/drivers/staging/dwc2/hcd.h @@ -448,10 +448,10 @@ static inline u8 dwc2_hcd_is_pipe_out(struct dwc2_hcd_pipe_info *pipe) } extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, - struct dwc2_core_params *params); + const struct dwc2_core_params *params); extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg); extern int dwc2_set_parameters(struct dwc2_hsotg *hsotg, - struct dwc2_core_params *params); + const struct dwc2_core_params *params); extern void dwc2_set_all_params(struct dwc2_core_params *params, int value); /* Transaction Execution Functions */ @@ -646,14 +646,14 @@ extern void dwc2_hcd_save_data_toggle(struct dwc2_hsotg *hsotg, /* HCD Core API */ /** - * dwc2_hcd_intr() - Called on every hardware interrupt + * dwc2_handle_hcd_intr() - Called on every hardware interrupt * * @hsotg: The DWC2 HCD * - * Returns non zero if interrupt is handled - * Return 0 if interrupt is not handled + * Returns IRQ_HANDLED if interrupt is handled + * Return IRQ_NONE if interrupt is not handled */ -extern int dwc2_hcd_intr(struct dwc2_hsotg *hsotg); +extern irqreturn_t dwc2_handle_hcd_intr(struct dwc2_hsotg *hsotg); /** * dwc2_hcd_stop() - Halts the DWC_otg host mode operation diff --git a/drivers/staging/dwc2/hcd_intr.c b/drivers/staging/dwc2/hcd_intr.c index e24062f0a49e..e75dccb3b80b 100644 --- a/drivers/staging/dwc2/hcd_intr.c +++ b/drivers/staging/dwc2/hcd_intr.c @@ -115,16 +115,13 @@ static void dwc2_sof_intr(struct dwc2_hsotg *hsotg) { struct list_head *qh_entry; struct dwc2_qh *qh; - u32 hfnum; enum dwc2_transaction_type tr_type; #ifdef DEBUG_SOF dev_vdbg(hsotg->dev, "--Start of Frame Interrupt--\n"); #endif - hfnum = readl(hsotg->regs + HFNUM); - hsotg->frame_number = hfnum >> HFNUM_FRNUM_SHIFT & - HFNUM_FRNUM_MASK >> HFNUM_FRNUM_SHIFT; + hsotg->frame_number = dwc2_hcd_get_frame_number(hsotg); dwc2_track_missed_sofs(hsotg); @@ -244,6 +241,7 @@ static void dwc2_hprt0_enable(struct dwc2_hsotg *hsotg, u32 hprt0, u32 usbcfg; u32 prtspd; u32 hcfg; + u32 fslspclksel; u32 hfir; dev_vdbg(hsotg->dev, "%s(%p)\n", __func__, hsotg); @@ -275,6 +273,7 @@ static void dwc2_hprt0_enable(struct dwc2_hsotg *hsotg, u32 hprt0, } hcfg = readl(hsotg->regs + HCFG); + fslspclksel = hcfg & HCFG_FSLSPCLKSEL_MASK; if (prtspd == HPRT0_SPD_LOW_SPEED && params->host_ls_low_power_phy_clk == @@ -282,8 +281,7 @@ static void dwc2_hprt0_enable(struct dwc2_hsotg *hsotg, u32 hprt0, /* 6 MHZ */ dev_vdbg(hsotg->dev, "FS_PHY programming HCFG to 6 MHz\n"); - if ((hcfg & HCFG_FSLSPCLKSEL_MASK) != - HCFG_FSLSPCLKSEL_6_MHZ) { + if (fslspclksel != HCFG_FSLSPCLKSEL_6_MHZ) { hcfg &= ~HCFG_FSLSPCLKSEL_MASK; hcfg |= HCFG_FSLSPCLKSEL_6_MHZ; writel(hcfg, hsotg->regs + HCFG); @@ -293,8 +291,7 @@ static void dwc2_hprt0_enable(struct dwc2_hsotg *hsotg, u32 hprt0, /* 48 MHZ */ dev_vdbg(hsotg->dev, "FS_PHY programming HCFG to 48 MHz\n"); - if ((hcfg & HCFG_FSLSPCLKSEL_MASK) != - HCFG_FSLSPCLKSEL_48_MHZ) { + if (fslspclksel != HCFG_FSLSPCLKSEL_48_MHZ) { hcfg &= ~HCFG_FSLSPCLKSEL_MASK; hcfg |= HCFG_FSLSPCLKSEL_48_MHZ; writel(hcfg, hsotg->regs + HCFG); @@ -2060,14 +2057,14 @@ static void dwc2_hc_intr(struct dwc2_hsotg *hsotg) } /* This function handles interrupts for the HCD */ -int dwc2_hcd_intr(struct dwc2_hsotg *hsotg) +irqreturn_t dwc2_handle_hcd_intr(struct dwc2_hsotg *hsotg) { u32 gintsts, dbg_gintsts; - int retval = 0; + irqreturn_t retval = IRQ_NONE; if (dwc2_check_core_status(hsotg) < 0) { dev_warn(hsotg->dev, "Controller is disconnected\n"); - return 0; + return retval; } spin_lock(&hsotg->lock); @@ -2077,10 +2074,10 @@ int dwc2_hcd_intr(struct dwc2_hsotg *hsotg) gintsts = dwc2_read_core_intr(hsotg); if (!gintsts) { spin_unlock(&hsotg->lock); - return 0; + return retval; } - retval = 1; + retval = IRQ_HANDLED; dbg_gintsts = gintsts; #ifndef DEBUG_SOF @@ -2102,9 +2099,6 @@ int dwc2_hcd_intr(struct dwc2_hsotg *hsotg) dwc2_rx_fifo_level_intr(hsotg); if (gintsts & GINTSTS_NPTXFEMP) dwc2_np_tx_fifo_empty_intr(hsotg); - if (gintsts & GINTSTS_I2CINT) - /* Todo: Implement i2cintr handler */ - writel(GINTSTS_I2CINT, hsotg->regs + GINTSTS); if (gintsts & GINTSTS_PRTINT) dwc2_port_intr(hsotg); if (gintsts & GINTSTS_HCHINT) diff --git a/drivers/staging/dwc2/pci.c b/drivers/staging/dwc2/pci.c index 69c65eb8683f..3ca54d6782fd 100644 --- a/drivers/staging/dwc2/pci.c +++ b/drivers/staging/dwc2/pci.c @@ -59,7 +59,7 @@ static const char dwc2_driver_name[] = "dwc2"; -static struct dwc2_core_params dwc2_module_params = { +static const struct dwc2_core_params dwc2_module_params = { .otg_cap = -1, .otg_ver = -1, .dma_enable = -1, @@ -101,8 +101,6 @@ static void dwc2_driver_remove(struct pci_dev *dev) { struct dwc2_hsotg *hsotg = pci_get_drvdata(dev); - dev_dbg(&dev->dev, "%s(%p)\n", __func__, dev); - dwc2_hcd_remove(hsotg); pci_disable_device(dev); } @@ -125,18 +123,14 @@ static int dwc2_driver_probe(struct pci_dev *dev, struct dwc2_hsotg *hsotg; int retval; - dev_dbg(&dev->dev, "%s(%p)\n", __func__, dev); - hsotg = devm_kzalloc(&dev->dev, sizeof(*hsotg), GFP_KERNEL); if (!hsotg) return -ENOMEM; - pci_set_power_state(dev, PCI_D0); - hsotg->dev = &dev->dev; - hsotg->regs = devm_request_and_ioremap(&dev->dev, &dev->resource[0]); - if (!hsotg->regs) - return -ENOMEM; + hsotg->regs = devm_ioremap_resource(&dev->dev, &dev->resource[0]); + if (IS_ERR(hsotg->regs)) + return PTR_ERR(hsotg->regs); dev_dbg(&dev->dev, "mapped PA %08lx to VA %p\n", (unsigned long)pci_resource_start(dev, 0), hsotg->regs); @@ -153,7 +147,6 @@ static int dwc2_driver_probe(struct pci_dev *dev, } pci_set_drvdata(dev, hsotg); - dev_dbg(&dev->dev, "hsotg=%p\n", hsotg); return retval; } @@ -162,6 +155,10 @@ static DEFINE_PCI_DEVICE_TABLE(dwc2_pci_ids) = { { PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, PCI_PRODUCT_ID_HAPS_HSOTG), }, + { + PCI_DEVICE(PCI_VENDOR_ID_STMICRO, + PCI_DEVICE_ID_STMICRO_USB_OTG), + }, { /* end: all zeroes */ } }; MODULE_DEVICE_TABLE(pci, dwc2_pci_ids); |