diff options
Diffstat (limited to 'drivers/usb/dwc2/gadget.c')
-rw-r--r-- | drivers/usb/dwc2/gadget.c | 48 |
1 files changed, 17 insertions, 31 deletions
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 5a4fd9631e..3c06c438b6 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -1,25 +1,15 @@ -// SPDX-License-Identifier: GPL-2.0+ +// SPDX-License-Identifier: GPL-2.0-or-later #include <dma.h> -#include <usb/gadget.h> +#include <linux/usb/gadget.h> +#include <linux/spinlock.h> #include "dwc2.h" #define to_dwc2 gadget_to_dwc2 #define dwc2_set_bit(d, r, b) dwc2_writel(d, (b) | dwc2_readl(d, r), r) #define dwc2_clear_bit(d, r, b) dwc2_writel(d, ~(b) & dwc2_readl(d, r), r) -#define spin_lock(lock) -#define spin_unlock(lock) #define local_irq_save(flags)(void)(flags) #define local_irq_restore(flags) (void)(flags) -#define spin_lock_irqsave(lock, flags) (void)(flags) -#define spin_unlock_irqrestore(lock, flags) (void)(flags) - -#ifndef USB_ENDPOINT_MAXP_MASK -#define USB_ENDPOINT_MAXP_MASK 0x07ff -#endif -#ifndef USB_EP_MAXP_MULT -#define USB_EP_MAXP_MULT(m) (((m) & 0x1800) >> 11) -#endif static void kill_all_requests(struct dwc2 *, struct dwc2_ep *, int); @@ -484,7 +474,7 @@ static int dwc2_ep_enable(struct usb_ep *ep, ep_type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; mps = usb_endpoint_maxp(desc) & USB_ENDPOINT_MAXP_MASK; - mc = USB_EP_MAXP_MULT(usb_endpoint_maxp(desc)); + mc = usb_endpoint_maxp_mult(desc); /* note, we handle this here instead of dwc2_set_ep_maxpacket */ epctrl_reg = dir_in ? DIEPCTL(index) : DOEPCTL(index); @@ -1549,9 +1539,8 @@ static void dwc2_gadget_setup_fifo(struct dwc2 *dwc2) u32 np_tx_fifo_size = dwc2->params.g_np_tx_fifo_size; u32 rx_fifo_size = dwc2->params.g_rx_fifo_size; u32 fifo_size = dwc2->hw_params.total_fifo_size; - u32 *tx_fifo_size = dwc2->params.g_tx_fifo_size; - u32 size, depth; - u32 txfsz; + u32 *txfsz = dwc2->params.g_tx_fifo_size; + u32 size, val; /* Reset fifo map if not correctly cleared during previous session */ WARN_ON(dwc2->fifo_map); @@ -1578,19 +1567,17 @@ static void dwc2_gadget_setup_fifo(struct dwc2 *dwc2) * them to endpoints dynamically according to maxpacket size value of * given endpoint. */ + for (ep = 1; ep < DWC2_MAX_EPS_CHANNELS; ep++) { + if (!txfsz[ep]) + continue; + val = addr; + val |= txfsz[ep] << FIFOSIZE_DEPTH_SHIFT; + WARN_ONCE(addr + txfsz[ep] > fifo_size, + "insufficient fifo memory"); + addr += txfsz[ep]; - for (ep = 1; ep < dwc2->num_eps; ep++) { - txfsz = dwc2_readl(dwc2, DPTXFSIZN(ep)); - depth = tx_fifo_size[ep]; - - if (addr + depth > fifo_size) - dwc2_err(dwc2, "insufficient fifo memory\n"); - - txfsz = depth << FIFOSIZE_DEPTH_SHIFT; - txfsz |= addr & 0xffff; - dwc2_writel(dwc2, txfsz, DPTXFSIZN(ep)); - - addr += depth; + dwc2_writel(dwc2, val, DPTXFSIZN(ep)); + val = dwc2_readl(dwc2, DPTXFSIZN(ep)); } dwc2_writel(dwc2, dwc2->hw_params.total_fifo_size | @@ -2533,8 +2520,7 @@ static int dwc2_gadget_udc_start(struct usb_gadget *gadget, return 0; } -static int dwc2_gadget_udc_stop(struct usb_gadget *gadget, - struct usb_gadget_driver *driver) +static int dwc2_gadget_udc_stop(struct usb_gadget *gadget) { struct dwc2 *dwc2 = to_dwc2(gadget); unsigned long flags = 0; |