]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/usb/dwc2/gadget.c
usb: dwc2: gadget: fix TX FIFO size and address initialization
[mirror_ubuntu-zesty-kernel.git] / drivers / usb / dwc2 / gadget.c
index eae908951eab5b134b1b858fc6a6d3637a0a2952..7db763e2e975d4f3e3bfb8855195bfe22cfa38d1 100644 (file)
@@ -189,6 +189,7 @@ static void dwc2_hsotg_init_fifo(struct dwc2_hsotg *hsotg)
        unsigned int ep;
        unsigned int addr;
        int timeout;
+       u32 dptxfsizn;
        u32 val;
 
        /* Reset fifo map if not correctly cleared during previous session */
@@ -217,13 +218,13 @@ static void dwc2_hsotg_init_fifo(struct dwc2_hsotg *hsotg)
         * given endpoint.
         */
        for (ep = 1; ep < MAX_EPS_CHANNELS; ep++) {
-               if (!hsotg->g_tx_fifo_sz[ep])
-                       continue;
-               val = addr;
-               val |= hsotg->g_tx_fifo_sz[ep] << FIFOSIZE_DEPTH_SHIFT;
-               WARN_ONCE(addr + hsotg->g_tx_fifo_sz[ep] > hsotg->fifo_mem,
-                         "insufficient fifo memory");
-               addr += hsotg->g_tx_fifo_sz[ep];
+               dptxfsizn = dwc2_readl(hsotg->regs + DPTXFSIZN(ep));
+
+               val = (dptxfsizn & FIFOSIZE_DEPTH_MASK) | addr;
+               addr += dptxfsizn >> FIFOSIZE_DEPTH_SHIFT;
+
+               if (addr > hsotg->fifo_mem)
+                       break;
 
                dwc2_writel(val, hsotg->regs + DPTXFSIZN(ep));
        }
@@ -3814,36 +3815,10 @@ static void dwc2_hsotg_dump(struct dwc2_hsotg *hsotg)
 static void dwc2_hsotg_of_probe(struct dwc2_hsotg *hsotg)
 {
        struct device_node *np = hsotg->dev->of_node;
-       u32 len = 0;
-       u32 i = 0;
 
        /* Enable dma if requested in device tree */
        hsotg->g_using_dma = of_property_read_bool(np, "g-use-dma");
 
-       /*
-       * Register TX periodic fifo size per endpoint.
-       * EP0 is excluded since it has no fifo configuration.
-       */
-       if (!of_find_property(np, "g-tx-fifo-size", &len))
-               goto rx_fifo;
-
-       len /= sizeof(u32);
-
-       /* Read tx fifo sizes other than ep0 */
-       if (of_property_read_u32_array(np, "g-tx-fifo-size",
-                                               &hsotg->g_tx_fifo_sz[1], len))
-               goto rx_fifo;
-
-       /* Add ep0 */
-       len++;
-
-       /* Make remaining TX fifos unavailable */
-       if (len < MAX_EPS_CHANNELS) {
-               for (i = len; i < MAX_EPS_CHANNELS; i++)
-                       hsotg->g_tx_fifo_sz[i] = 0;
-       }
-
-rx_fifo:
        /* Register RX fifo size */
        of_property_read_u32(np, "g-rx-fifo-size", &hsotg->g_rx_fifo_sz);
 
@@ -3865,13 +3840,10 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
        struct device *dev = hsotg->dev;
        int epnum;
        int ret;
-       int i;
-       u32 p_tx_fifo[] = DWC2_G_P_LEGACY_TX_FIFO_SIZE;
 
        /* Initialize to legacy fifo configuration values */
        hsotg->g_rx_fifo_sz = 2048;
        hsotg->g_np_g_tx_fifo_sz = 1024;
-       memcpy(&hsotg->g_tx_fifo_sz[1], p_tx_fifo, sizeof(p_tx_fifo));
        /* Device tree specific probe */
        dwc2_hsotg_of_probe(hsotg);
 
@@ -3889,9 +3861,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
        dev_dbg(dev, "NonPeriodic TXFIFO size: %d\n",
                                                hsotg->g_np_g_tx_fifo_sz);
        dev_dbg(dev, "RXFIFO size: %d\n", hsotg->g_rx_fifo_sz);
-       for (i = 0; i < MAX_EPS_CHANNELS; i++)
-               dev_dbg(dev, "Periodic TXFIFO%2d size: %d\n", i,
-                                               hsotg->g_tx_fifo_sz[i]);
 
        hsotg->gadget.max_speed = USB_SPEED_HIGH;
        hsotg->gadget.ops = &dwc2_hsotg_gadget_ops;