]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/gadget/amd5536udc.c
Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm
[~andy/linux] / drivers / usb / gadget / amd5536udc.c
index c16ff55a74e84696ec26afe376547c5af42a9dd8..77779271f4872f4d99e50bc05baa7506dea7cc11 100644 (file)
@@ -29,7 +29,7 @@
 
 /* Driver strings */
 #define UDC_MOD_DESCRIPTION            "AMD 5536 UDC - USB Device Controller"
-#define UDC_DRIVER_VERSION_STRING      "01.00.0206 - $Revision: #3 $"
+#define UDC_DRIVER_VERSION_STRING      "01.00.0206"
 
 /* system */
 #include <linux/module.h>
@@ -54,7 +54,6 @@
 #include <linux/prefetch.h>
 
 #include <asm/byteorder.h>
-#include <asm/system.h>
 #include <asm/unaligned.h>
 
 /* gadget stack */
@@ -140,7 +139,7 @@ static DECLARE_TASKLET(disconnect_tasklet, udc_tasklet_disconnect,
 
 /* endpoint names used for print */
 static const char ep0_string[] = "ep0in";
-static const char *ep_string[] = {
+static const char *const ep_string[] = {
        ep0_string,
        "ep1in-int", "ep2in-bulk", "ep3in-bulk", "ep4in-bulk", "ep5in-bulk",
        "ep6in-bulk", "ep7in-bulk", "ep8in-bulk", "ep9in-bulk", "ep10in-bulk",
@@ -204,9 +203,8 @@ static void print_regs(struct udc *dev)
                DBG(dev, "DMA mode       = BF (buffer fill mode)\n");
                dev_info(&dev->pdev->dev, "DMA mode (%s)\n", "BF");
        }
-       if (!use_dma) {
+       if (!use_dma)
                dev_info(&dev->pdev->dev, "FIFO mode\n");
-       }
        DBG(dev, "-------------------------------------------------------\n");
 }
 
@@ -445,6 +443,7 @@ static void ep_init(struct udc_regs __iomem *regs, struct udc_ep *ep)
 
        VDBG(ep->dev, "ep-%d reset\n", ep->num);
        ep->desc = NULL;
+       ep->ep.desc = NULL;
        ep->ep.ops = &udc_ep_ops;
        INIT_LIST_HEAD(&ep->queue);
 
@@ -569,9 +568,8 @@ udc_free_request(struct usb_ep *usbep, struct usb_request *usbreq)
                VDBG(ep->dev, "req->td_data=%p\n", req->td_data);
 
                /* free dma chain if created */
-               if (req->chain_len > 1) {
+               if (req->chain_len > 1)
                        udc_free_dma_chain(ep->dev, req);
-               }
 
                pci_pool_free(ep->dev->data_requests, req->td_data,
                                                        req->td_phys);
@@ -639,9 +637,8 @@ udc_txfifo_write(struct udc_ep *ep, struct usb_request *req)
                bytes = remaining;
 
        /* dwords first */
-       for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
+       for (i = 0; i < bytes / UDC_DWORD_BYTES; i++)
                writel(*(buf + i), ep->txfifo);
-       }
 
        /* remaining bytes must be written by byte access */
        for (j = 0; j < bytes % UDC_DWORD_BYTES; j++) {
@@ -660,9 +657,8 @@ static int udc_rxfifo_read_dwords(struct udc *dev, u32 *buf, int dwords)
 
        VDBG(dev, "udc_read_dwords(): %d dwords\n", dwords);
 
-       for (i = 0; i < dwords; i++) {
+       for (i = 0; i < dwords; i++)
                *(buf + i) = readl(dev->rxfifo);
-       }
        return 0;
 }
 
@@ -675,9 +671,8 @@ static int udc_rxfifo_read_bytes(struct udc *dev, u8 *buf, int bytes)
        VDBG(dev, "udc_read_bytes(): %d bytes\n", bytes);
 
        /* dwords first */
-       for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
+       for (i = 0; i < bytes / UDC_DWORD_BYTES; i++)
                *((u32 *)(buf + (i<<2))) = readl(dev->rxfifo);
-       }
 
        /* remaining bytes must be read by byte access */
        if (bytes % UDC_DWORD_BYTES) {
@@ -831,20 +826,8 @@ __acquires(ep->dev->lock)
 
        dev = ep->dev;
        /* unmap DMA */
-       if (req->dma_mapping) {
-               if (ep->in)
-                       pci_unmap_single(dev->pdev,
-                                       req->req.dma,
-                                       req->req.length,
-                                       PCI_DMA_TODEVICE);
-               else
-                       pci_unmap_single(dev->pdev,
-                                       req->req.dma,
-                                       req->req.length,
-                                       PCI_DMA_FROMDEVICE);
-               req->dma_mapping = 0;
-               req->req.dma = DMA_DONT_USE;
-       }
+       if (ep->dma)
+               usb_gadget_unmap_request(&dev->gadget, &req->req, ep->in);
 
        halted = ep->halted;
        ep->halted = 1;
@@ -897,9 +880,8 @@ static struct udc_data_dma *udc_get_last_dma_desc(struct udc_request *req)
        struct udc_data_dma     *td;
 
        td = req->td_data;
-       while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L))) {
+       while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L)))
                td = phys_to_virt(td->next);
-       }
 
        return td;
 
@@ -949,21 +931,18 @@ static int udc_create_dma_chain(
        dma_addr = DMA_DONT_USE;
 
        /* unset L bit in first desc for OUT */
-       if (!ep->in) {
+       if (!ep->in)
                req->td_data->status &= AMD_CLEAR_BIT(UDC_DMA_IN_STS_L);
-       }
 
        /* alloc only new desc's if not already available */
        len = req->req.length / ep->ep.maxpacket;
-       if (req->req.length % ep->ep.maxpacket) {
+       if (req->req.length % ep->ep.maxpacket)
                len++;
-       }
 
        if (len > req->chain_len) {
                /* shorter chain already allocated before */
-               if (req->chain_len > 1) {
+               if (req->chain_len > 1)
                        udc_free_dma_chain(ep->dev, req);
-               }
                req->chain_len = len;
                create_new_chain = 1;
        }
@@ -1006,11 +985,12 @@ static int udc_create_dma_chain(
 
                /* link td and assign tx bytes */
                if (i == buf_len) {
-                       if (create_new_chain) {
+                       if (create_new_chain)
                                req->td_data->next = dma_addr;
-                       } else {
-                               /* req->td_data->next = virt_to_phys(td); */
-                       }
+                       /*
+                       else
+                               req->td_data->next = virt_to_phys(td);
+                       */
                        /* write tx bytes */
                        if (ep->in) {
                                /* first desc */
@@ -1024,11 +1004,12 @@ static int udc_create_dma_chain(
                                                        UDC_DMA_IN_STS_TXBYTES);
                        }
                } else {
-                       if (create_new_chain) {
+                       if (create_new_chain)
                                last->next = dma_addr;
-                       } else {
-                               /* last->next = virt_to_phys(td); */
-                       }
+                       /*
+                       else
+                               last->next = virt_to_phys(td);
+                       */
                        if (ep->in) {
                                /* write tx bytes */
                                td->status = AMD_ADDBITS(td->status,
@@ -1095,20 +1076,11 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)
                return -ESHUTDOWN;
 
        /* map dma (usually done before) */
-       if (ep->dma && usbreq->length != 0
-                       && (usbreq->dma == DMA_DONT_USE || usbreq->dma == 0)) {
+       if (ep->dma) {
                VDBG(dev, "DMA map req %p\n", req);
-               if (ep->in)
-                       usbreq->dma = pci_map_single(dev->pdev,
-                                               usbreq->buf,
-                                               usbreq->length,
-                                               PCI_DMA_TODEVICE);
-               else
-                       usbreq->dma = pci_map_single(dev->pdev,
-                                               usbreq->buf,
-                                               usbreq->length,
-                                               PCI_DMA_FROMDEVICE);
-               req->dma_mapping = 1;
+               retval = usb_gadget_map_request(&udc->gadget, usbreq, ep->in);
+               if (retval)
+                       return retval;
        }
 
        VDBG(dev, "%s queue req %p, len %d req->td_data=%p buf %p\n",
@@ -1479,11 +1451,10 @@ static int startup_registers(struct udc *dev)
 
        /* program speed */
        tmp = readl(&dev->regs->cfg);
-       if (use_fullspeed) {
+       if (use_fullspeed)
                tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_FS, UDC_DEVCFG_SPD);
-       } else {
+       else
                tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_HS, UDC_DEVCFG_SPD);
-       }
        writel(tmp, &dev->regs->cfg);
 
        return 0;
@@ -1504,9 +1475,8 @@ static void udc_basic_init(struct udc *dev)
                mod_timer(&udc_timer, jiffies - 1);
        }
        /* stop poll stall timer */
-       if (timer_pending(&udc_pollstall_timer)) {
+       if (timer_pending(&udc_pollstall_timer))
                mod_timer(&udc_pollstall_timer, jiffies - 1);
-       }
        /* disable DMA */
        tmp = readl(&dev->regs->ctl);
        tmp &= AMD_UNMASK_BIT(UDC_DEVCTL_RDE);
@@ -1540,11 +1510,10 @@ static void udc_setup_endpoints(struct udc *dev)
        /* read enum speed */
        tmp = readl(&dev->regs->sts);
        tmp = AMD_GETBITS(tmp, UDC_DEVSTS_ENUM_SPEED);
-       if (tmp == UDC_DEVSTS_ENUM_SPEED_HIGH) {
+       if (tmp == UDC_DEVSTS_ENUM_SPEED_HIGH)
                dev->gadget.speed = USB_SPEED_HIGH;
-       } else if (tmp == UDC_DEVSTS_ENUM_SPEED_FULL) {
+       else if (tmp == UDC_DEVSTS_ENUM_SPEED_FULL)
                dev->gadget.speed = USB_SPEED_FULL;
-       }
 
        /* set basic ep parameters */
        for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
@@ -1570,9 +1539,8 @@ static void udc_setup_endpoints(struct udc *dev)
                 * disabling ep interrupts when ENUM interrupt occurs but ep is
                 * not enabled by gadget driver
                 */
-               if (!ep->desc) {
+               if (!ep->desc)
                        ep_init(dev->regs, ep);
-               }
 
                if (use_dma) {
                        /*
@@ -1670,9 +1638,8 @@ static void udc_tasklet_disconnect(unsigned long par)
                spin_lock(&dev->lock);
 
                /* empty queues */
-               for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
+               for (tmp = 0; tmp < UDC_EP_NUM; tmp++)
                        empty_req_queue(&dev->ep[tmp]);
-               }
 
        }
 
@@ -1746,9 +1713,8 @@ static void udc_timer_function(unsigned long v)
                         * open the fifo
                         */
                        udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV;
-                       if (!stop_timer) {
+                       if (!stop_timer)
                                add_timer(&udc_timer);
-                       }
                } else {
                        /*
                         * fifo contains data now, setup timer for opening
@@ -1760,9 +1726,8 @@ static void udc_timer_function(unsigned long v)
                        set_rde++;
                        /* debug: lhadmot_timer_start = 221070 */
                        udc_timer.expires = jiffies + HZ*UDC_RDE_TIMER_SECONDS;
-                       if (!stop_timer) {
+                       if (!stop_timer)
                                add_timer(&udc_timer);
-                       }
                }
 
        } else
@@ -1907,19 +1872,17 @@ static void activate_control_endpoints(struct udc *dev)
                        mod_timer(&udc_timer, jiffies - 1);
                }
                /* stop pollstall timer */
-               if (timer_pending(&udc_pollstall_timer)) {
+               if (timer_pending(&udc_pollstall_timer))
                        mod_timer(&udc_pollstall_timer, jiffies - 1);
-               }
                /* enable DMA */
                tmp = readl(&dev->regs->ctl);
                tmp |= AMD_BIT(UDC_DEVCTL_MODE)
                                | AMD_BIT(UDC_DEVCTL_RDE)
                                | AMD_BIT(UDC_DEVCTL_TDE);
-               if (use_dma_bufferfill_mode) {
+               if (use_dma_bufferfill_mode)
                        tmp |= AMD_BIT(UDC_DEVCTL_BF);
-               } else if (use_dma_ppb_du) {
+               else if (use_dma_ppb_du)
                        tmp |= AMD_BIT(UDC_DEVCTL_DU);
-               }
                writel(tmp, &dev->regs->ctl);
        }
 
@@ -2104,9 +2067,8 @@ static void udc_ep0_set_rde(struct udc *dev)
                                udc_timer.expires =
                                        jiffies + HZ/UDC_RDE_TIMER_DIV;
                                set_rde = 1;
-                               if (!stop_timer) {
+                               if (!stop_timer)
                                        add_timer(&udc_timer);
-                               }
                        }
                }
        }
@@ -2131,7 +2093,7 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)
        if (use_dma) {
                /* BNA event ? */
                if (tmp & AMD_BIT(UDC_EPSTS_BNA)) {
-                       DBG(dev, "BNA ep%dout occurred - DESPTR = %x \n",
+                       DBG(dev, "BNA ep%dout occurred - DESPTR = %x\n",
                                        ep->num, readl(&ep->regs->desptr));
                        /* clear BNA */
                        writel(tmp | AMD_BIT(UDC_EPSTS_BNA), &ep->regs->sts);
@@ -2294,9 +2256,8 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)
                                                jiffies
                                                + HZ*UDC_RDE_TIMER_SECONDS;
                                        set_rde = 1;
-                                       if (!stop_timer) {
+                                       if (!stop_timer)
                                                add_timer(&udc_timer);
-                                       }
                                }
                                if (ep->num != UDC_EP0OUT_IX)
                                        dev->data_ep_queued = 0;
@@ -2318,9 +2279,8 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)
        /* check pending CNAKS */
        if (cnak_pending) {
                /* CNAk processing when rxfifo empty only */
-               if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) {
+               if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY))
                        udc_process_cnak_queue(dev);
-               }
        }
 
        /* clear OUT bits in ep status */
@@ -2348,7 +2308,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)
                /* BNA ? */
                if (epsts & AMD_BIT(UDC_EPSTS_BNA)) {
                        dev_err(&dev->pdev->dev,
-                               "BNA ep%din occurred - DESPTR = %08lx \n",
+                               "BNA ep%din occurred - DESPTR = %08lx\n",
                                ep->num,
                                (unsigned long) readl(&ep->regs->desptr));
 
@@ -2361,7 +2321,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)
        /* HE event ? */
        if (epsts & AMD_BIT(UDC_EPSTS_HE)) {
                dev_err(&dev->pdev->dev,
-                       "HE ep%dn occurred - DESPTR = %08lx \n",
+                       "HE ep%dn occurred - DESPTR = %08lx\n",
                        ep->num, (unsigned long) readl(&ep->regs->desptr));
 
                /* clear HE */
@@ -2427,9 +2387,9 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)
                                /* write fifo */
                                udc_txfifo_write(ep, &req->req);
                                len = req->req.length - req->req.actual;
-                                               if (len > ep->ep.maxpacket)
-                                                       len = ep->ep.maxpacket;
-                                               req->req.actual += len;
+                               if (len > ep->ep.maxpacket)
+                                       len = ep->ep.maxpacket;
+                               req->req.actual += len;
                                if (req->req.actual == req->req.length
                                        || (len != ep->ep.maxpacket)) {
                                        /* complete req */
@@ -2581,9 +2541,8 @@ __acquires(dev->lock)
                        if (!timer_pending(&udc_timer)) {
                                udc_timer.expires = jiffies +
                                                        HZ/UDC_RDE_TIMER_DIV;
-                               if (!stop_timer) {
+                               if (!stop_timer)
                                        add_timer(&udc_timer);
-                               }
                        }
                }
 
@@ -2697,9 +2656,8 @@ __acquires(dev->lock)
        /* check pending CNAKS */
        if (cnak_pending) {
                /* CNAk processing when rxfifo empty only */
-               if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) {
+               if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY))
                        udc_process_cnak_queue(dev);
-               }
        }
 
 finished:
@@ -2723,7 +2681,7 @@ static irqreturn_t udc_control_in_isr(struct udc *dev)
        tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->sts);
        /* DMA completion */
        if (tmp & AMD_BIT(UDC_EPSTS_TDC)) {
-               VDBG(dev, "isr: TDC clear \n");
+               VDBG(dev, "isr: TDC clear\n");
                ret_val = IRQ_HANDLED;
 
                /* clear TDC bit */
@@ -3426,7 +3384,7 @@ static int udc_remote_wakeup(struct udc *dev)
 }
 
 /* PCI device parameters */
-static const struct pci_device_id pci_id[] = {
+static DEFINE_PCI_DEVICE_TABLE(pci_id) = {
        {
                PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096),
                .class =        (PCI_CLASS_SERIAL_USB << 8) | 0xfe,