Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / usb / gadget / goku_udc.c
index 61ce5b2..66b81bb 100644 (file)
@@ -70,7 +70,7 @@ MODULE_LICENSE("GPL");
  * seem to behave quite as expected.  Used by default.
  *
  * OUT dma documents design problems handling the common "short packet"
- * transfer termination policy; it couldn't enabled by default, even
+ * transfer termination policy; it couldn't be enabled by default, even
  * if the OUT-dma abort problems had a resolution.
  */
 static unsigned use_dma = 1;
@@ -90,7 +90,7 @@ module_param(use_dma, uint, S_IRUGO);
 static void nuke(struct goku_ep *, int status);
 
 static inline void
-command(struct goku_udc_regs *regs, int command, unsigned epnum)
+command(struct goku_udc_regs __iomem *regs, int command, unsigned epnum)
 {
        writel(COMMAND_EP(epnum) | command, &regs->Command);
        udelay(300);
@@ -161,8 +161,8 @@ goku_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
 
        /* ep1 and ep2 can do double buffering and/or dma */
        if (ep->num < 3) {
-               struct goku_udc_regs    *regs = ep->dev->regs;
-               u32                     tmp;
+               struct goku_udc_regs __iomem    *regs = ep->dev->regs;
+               u32                             tmp;
 
                /* double buffer except (for now) with pio in */
                tmp = ((ep->dma || !ep->is_in)
@@ -191,7 +191,7 @@ goku_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
        return 0;
 }
 
-static void ep_reset(struct goku_udc_regs *regs, struct goku_ep *ep)
+static void ep_reset(struct goku_udc_regs __iomem *regs, struct goku_ep *ep)
 {
        struct goku_udc         *dev = ep->dev;
 
@@ -209,16 +209,16 @@ static void ep_reset(struct goku_udc_regs *regs, struct goku_ep *ep)
                writel(dev->int_enable, &regs->int_enable);
                readl(&regs->int_enable);
                if (ep->num < 3) {
-                       struct goku_udc_regs    *regs = ep->dev->regs;
-                       u32                     tmp;
+                       struct goku_udc_regs __iomem    *r = ep->dev->regs;
+                       u32                             tmp;
 
-                       tmp = readl(&regs->EPxSingle);
+                       tmp = readl(&r->EPxSingle);
                        tmp &= ~(0x11 << ep->num);
-                       writel(tmp, &regs->EPxSingle);
+                       writel(tmp, &r->EPxSingle);
 
-                       tmp = readl(&regs->EPxBCS);
+                       tmp = readl(&r->EPxBCS);
                        tmp &= ~(0x11 << ep->num);
-                       writel(tmp, &regs->EPxBCS);
+                       writel(tmp, &r->EPxBCS);
                }
                /* reset dma in case we're still using it */
                if (ep->dma) {
@@ -237,7 +237,7 @@ static void ep_reset(struct goku_udc_regs *regs, struct goku_ep *ep)
        }
 
        ep->ep.maxpacket = MAX_FIFO_SIZE;
-       ep->desc = 0;
+       ep->desc = NULL;
        ep->stopped = 1;
        ep->irqs = 0;
        ep->dma = 0;
@@ -269,17 +269,16 @@ static int goku_ep_disable(struct usb_ep *_ep)
 /*-------------------------------------------------------------------------*/
 
 static struct usb_request *
-goku_alloc_request(struct usb_ep *_ep, int gfp_flags)
+goku_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
 {
        struct goku_request     *req;
 
        if (!_ep)
-               return 0;
-       req = kmalloc(sizeof *req, gfp_flags);
+               return NULL;
+       req = kzalloc(sizeof *req, gfp_flags);
        if (!req)
-               return 0;
+               return NULL;
 
-       memset(req, 0, sizeof *req);
        req->req.dma = DMA_ADDR_INVALID;
        INIT_LIST_HEAD(&req->queue);
        return &req->req;
@@ -313,7 +312,7 @@ goku_free_request(struct usb_ep *_ep, struct usb_request *_req)
 #if    defined(CONFIG_X86)
 #define USE_KMALLOC
 
-#elif  defined(CONFIG_MIPS) && !defined(CONFIG_NONCOHERENT_IO)
+#elif  defined(CONFIG_MIPS) && !defined(CONFIG_DMA_NONCOHERENT)
 #define USE_KMALLOC
 
 #elif  defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE)
@@ -327,14 +326,14 @@ goku_free_request(struct usb_ep *_ep, struct usb_request *_req)
  */
 static void *
 goku_alloc_buffer(struct usb_ep *_ep, unsigned bytes,
-                       dma_addr_t *dma, int  gfp_flags)
+                       dma_addr_t *dma, gfp_t gfp_flags)
 {
        void            *retval;
        struct goku_ep  *ep;
 
        ep = container_of(_ep, struct goku_ep, ep);
        if (!_ep)
-               return 0;
+               return NULL;
        *dma = DMA_ADDR_INVALID;
 
 #if    defined(USE_KMALLOC)
@@ -413,7 +412,7 @@ done(struct goku_ep *ep, struct goku_request *req, int status)
 /*-------------------------------------------------------------------------*/
 
 static inline int
-write_packet(u32 *fifo, u8 *buf, struct goku_request *req, unsigned max)
+write_packet(u32 __iomem *fifo, u8 *buf, struct goku_request *req, unsigned max)
 {
        unsigned        length, count;
 
@@ -488,10 +487,10 @@ static int write_fifo(struct goku_ep *ep, struct goku_request *req)
 
 static int read_fifo(struct goku_ep *ep, struct goku_request *req)
 {
-       struct goku_udc_regs    *regs;
-       u32                     size, set;
-       u8                      *buf;
-       unsigned                bufferspace, is_short, dbuff;
+       struct goku_udc_regs __iomem    *regs;
+       u32                             size, set;
+       u8                              *buf;
+       unsigned                        bufferspace, is_short, dbuff;
 
        regs = ep->dev->regs;
 top:
@@ -581,7 +580,8 @@ top:
 }
 
 static inline void
-pio_irq_enable(struct goku_udc *dev, struct goku_udc_regs *regs, int epnum)
+pio_irq_enable(struct goku_udc *dev,
+               struct goku_udc_regs __iomem *regs, int epnum)
 {
        dev->int_enable |= INT_EPxDATASET (epnum);
        writel(dev->int_enable, &regs->int_enable);
@@ -589,7 +589,8 @@ pio_irq_enable(struct goku_udc *dev, struct goku_udc_regs *regs, int epnum)
 }
 
 static inline void
-pio_irq_disable(struct goku_udc *dev, struct goku_udc_regs *regs, int epnum)
+pio_irq_disable(struct goku_udc *dev,
+               struct goku_udc_regs __iomem *regs, int epnum)
 {
        dev->int_enable &= ~INT_EPxDATASET (epnum);
        writel(dev->int_enable, &regs->int_enable);
@@ -613,10 +614,10 @@ pio_advance(struct goku_ep *ep)
 // return:  0 = q running, 1 = q stopped, negative = errno
 static int start_dma(struct goku_ep *ep, struct goku_request *req)
 {
-       struct goku_udc_regs    *regs = ep->dev->regs;
-       u32                     master;
-       u32                     start = req->req.dma;
-       u32                     end = start + req->req.length - 1;
+       struct goku_udc_regs __iomem    *regs = ep->dev->regs;
+       u32                             master;
+       u32                             start = req->req.dma;
+       u32                             end = start + req->req.length - 1;
 
        master = readl(&regs->dma_master) & MST_RW_BITS;
 
@@ -668,9 +669,9 @@ static int start_dma(struct goku_ep *ep, struct goku_request *req)
 
 static void dma_advance(struct goku_udc *dev, struct goku_ep *ep)
 {
-       struct goku_request     *req;
-       struct goku_udc_regs    *regs = ep->dev->regs;
-       u32                     master;
+       struct goku_request             *req;
+       struct goku_udc_regs __iomem    *regs = ep->dev->regs;
+       u32                             master;
 
        master = readl(&regs->dma_master);
 
@@ -716,9 +717,9 @@ stop:
 
 static void abort_dma(struct goku_ep *ep, int status)
 {
-       struct goku_udc_regs    *regs = ep->dev->regs;
-       struct goku_request     *req;
-       u32                     curr, master;
+       struct goku_udc_regs __iomem    *regs = ep->dev->regs;
+       struct goku_request             *req;
+       u32                             curr, master;
 
        /* NAK future host requests, hoping the implicit delay lets the
         * dma engine finish reading (or writing) its latest packet and
@@ -787,7 +788,7 @@ finished:
 /*-------------------------------------------------------------------------*/
 
 static int
-goku_queue(struct usb_ep *_ep, struct usb_request *_req, int gfp_flags)
+goku_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
 {
        struct goku_request     *req;
        struct goku_ep          *ep;
@@ -848,7 +849,7 @@ goku_queue(struct usb_ep *_ep, struct usb_request *_req, int gfp_flags)
                if (unlikely(status != 0)) {
                        if (status > 0)
                                status = 0;
-                       req = 0;
+                       req = NULL;
                }
 
        } /* else pio or dma irq handler advances the queue. */
@@ -927,7 +928,7 @@ static int goku_dequeue(struct usb_ep *_ep, struct usb_request *_req)
        } else if (!list_empty(&req->queue))
                done(ep, req, -ECONNRESET);
        else
-               req = 0;
+               req = NULL;
        spin_unlock_irqrestore(&dev->lock, flags);
 
        return req ? 0 : -EOPNOTSUPP;
@@ -984,7 +985,8 @@ static int goku_set_halt(struct usb_ep *_ep, int value)
                retval = -EAGAIN;
        else if (ep->is_in && value
                        /* data in (either) packet buffer? */
-                       && (ep->dev->regs->DataSet & DATASET_AB(ep->num)))
+                       && (readl(&ep->dev->regs->DataSet)
+                                       & DATASET_AB(ep->num)))
                retval = -EAGAIN;
        else if (!value)
                goku_clear_halt(ep);
@@ -1000,9 +1002,9 @@ static int goku_set_halt(struct usb_ep *_ep, int value)
 
 static int goku_fifo_status(struct usb_ep *_ep)
 {
-       struct goku_ep          *ep;
-       struct goku_udc_regs    *regs;
-       u32                     size;
+       struct goku_ep                  *ep;
+       struct goku_udc_regs __iomem    *regs;
+       u32                             size;
 
        if (!_ep)
                return -ENODEV;
@@ -1022,9 +1024,9 @@ static int goku_fifo_status(struct usb_ep *_ep)
 
 static void goku_fifo_flush(struct usb_ep *_ep)
 {
-       struct goku_ep          *ep;
-       struct goku_udc_regs    *regs;
-       u32                     size;
+       struct goku_ep                  *ep;
+       struct goku_udc_regs __iomem    *regs;
+       u32                             size;
 
        if (!_ep)
                return;
@@ -1092,13 +1094,7 @@ static inline char *dmastr(void)
                return "(dma IN)";
 }
 
-/* if we're trying to save space, don't bother with this proc file */
-
-#if defined(CONFIG_PROC_FS) && !defined(CONFIG_EMBEDDED)
-#  define      UDC_PROC_FILE
-#endif
-
-#ifdef UDC_PROC_FILE
+#ifdef CONFIG_USB_GADGET_DEBUG_FILES
 
 static const char proc_node_name [] = "driver/udc";
 
@@ -1147,14 +1143,14 @@ static int
 udc_proc_read(char *buffer, char **start, off_t off, int count,
                int *eof, void *_dev)
 {
-       char                    *buf = buffer;
-       struct goku_udc         *dev = _dev;
-       struct goku_udc_regs    *regs = dev->regs;
-       char                    *next = buf;
-       unsigned                size = count;
-       unsigned long           flags;
-       int                     i, t, is_usb_connected;
-       u32                     tmp;
+       char                            *buf = buffer;
+       struct goku_udc                 *dev = _dev;
+       struct goku_udc_regs __iomem    *regs = dev->regs;
+       char                            *next = buf;
+       unsigned                        size = count;
+       unsigned long                   flags;
+       int                             i, t, is_usb_connected;
+       u32                             tmp;
 
        if (off != 0)
                return 0;
@@ -1312,7 +1308,7 @@ done:
        return count - size;
 }
 
-#endif /* UDC_PROC_FILE */
+#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
 
 /*-------------------------------------------------------------------------*/
 
@@ -1342,17 +1338,17 @@ static void udc_reinit (struct goku_udc *dev)
                ep->dev = dev;
                INIT_LIST_HEAD (&ep->queue);
 
-               ep_reset(0, ep);
+               ep_reset(NULL, ep);
        }
 
-       dev->ep[0].reg_mode = 0;
+       dev->ep[0].reg_mode = NULL;
        dev->ep[0].ep.maxpacket = MAX_EP0_SIZE;
        list_del_init (&dev->ep[0].ep.ep_list);
 }
 
 static void udc_reset(struct goku_udc *dev)
 {
-       struct goku_udc_regs    *regs = dev->regs;
+       struct goku_udc_regs __iomem    *regs = dev->regs;
 
        writel(0, &regs->power_detect);
        writel(0, &regs->int_enable);
@@ -1369,8 +1365,8 @@ static void udc_reset(struct goku_udc *dev)
 
 static void ep0_start(struct goku_udc *dev)
 {
-       struct goku_udc_regs    *regs = dev->regs;
-       unsigned                i;
+       struct goku_udc_regs __iomem    *regs = dev->regs;
+       unsigned                        i;
 
        VDBG(dev, "%s\n", __FUNCTION__);
 
@@ -1447,15 +1443,15 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
                return -EBUSY;
 
        /* hook up the driver */
-       driver->driver.bus = 0;
+       driver->driver.bus = NULL;
        dev->driver = driver;
        dev->gadget.dev.driver = &driver->driver;
        retval = driver->bind(&dev->gadget);
        if (retval) {
                DBG(dev, "bind to driver %s --> error %d\n",
                                driver->driver.name, retval);
-               dev->driver = 0;
-               dev->gadget.dev.driver = 0;
+               dev->driver = NULL;
+               dev->gadget.dev.driver = NULL;
                return retval;
        }
 
@@ -1477,7 +1473,7 @@ stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
        DBG (dev, "%s\n", __FUNCTION__);
 
        if (dev->gadget.speed == USB_SPEED_UNKNOWN)
-               driver = 0;
+               driver = NULL;
 
        /* disconnect gadget driver after quiesceing hw and the driver */
        udc_reset (dev);
@@ -1504,7 +1500,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
                return -EINVAL;
 
        spin_lock_irqsave(&dev->lock, flags);
-       dev->driver = 0;
+       dev->driver = NULL;
        stop_activity(dev, driver);
        spin_unlock_irqrestore(&dev->lock, flags);
 
@@ -1520,16 +1516,19 @@ EXPORT_SYMBOL(usb_gadget_unregister_driver);
 
 static void ep0_setup(struct goku_udc *dev)
 {
-       struct goku_udc_regs    *regs = dev->regs;
-       struct usb_ctrlrequest  ctrl;
-       int                     tmp;
+       struct goku_udc_regs __iomem    *regs = dev->regs;
+       struct usb_ctrlrequest          ctrl;
+       int                             tmp;
 
        /* read SETUP packet and enter DATA stage */
        ctrl.bRequestType = readl(&regs->bRequestType);
        ctrl.bRequest = readl(&regs->bRequest);
-       ctrl.wValue  = (readl(&regs->wValueH)  << 8) | readl(&regs->wValueL);
-       ctrl.wIndex  = (readl(&regs->wIndexH)  << 8) | readl(&regs->wIndexL);
-       ctrl.wLength = (readl(&regs->wLengthH) << 8) | readl(&regs->wLengthL);
+       ctrl.wValue  = cpu_to_le16((readl(&regs->wValueH)  << 8)
+                                       | readl(&regs->wValueL));
+       ctrl.wIndex  = cpu_to_le16((readl(&regs->wIndexH)  << 8)
+                                       | readl(&regs->wIndexL));
+       ctrl.wLength = cpu_to_le16((readl(&regs->wLengthH) << 8)
+                                       | readl(&regs->wLengthL));
        writel(0, &regs->SetupRecv);
 
        nuke(&dev->ep[0], 0);
@@ -1551,18 +1550,20 @@ static void ep0_setup(struct goku_udc *dev)
                case USB_REQ_CLEAR_FEATURE:
                        switch (ctrl.bRequestType) {
                        case USB_RECIP_ENDPOINT:
-                               tmp = ctrl.wIndex & 0x0f;
+                               tmp = le16_to_cpu(ctrl.wIndex) & 0x0f;
                                /* active endpoint */
                                if (tmp > 3 || (!dev->ep[tmp].desc && tmp != 0))
                                        goto stall;
-                               if (ctrl.wIndex & USB_DIR_IN) {
+                               if (ctrl.wIndex & __constant_cpu_to_le16(
+                                               USB_DIR_IN)) {
                                        if (!dev->ep[tmp].is_in)
                                                goto stall;
                                } else {
                                        if (dev->ep[tmp].is_in)
                                                goto stall;
                                }
-                               if (ctrl.wValue != USB_ENDPOINT_HALT)
+                               if (ctrl.wValue != __constant_cpu_to_le16(
+                                               USB_ENDPOINT_HALT))
                                        goto stall;
                                if (tmp)
                                        goku_clear_halt(&dev->ep[tmp]);
@@ -1574,7 +1575,7 @@ succeed:
                                return;
                        case USB_RECIP_DEVICE:
                                /* device remote wakeup: always clear */
-                               if (ctrl.wValue != 1)
+                               if (ctrl.wValue != __constant_cpu_to_le16(1))
                                        goto stall;
                                VDBG(dev, "clear dev remote wakeup\n");
                                goto succeed;
@@ -1592,14 +1593,15 @@ succeed:
 #ifdef USB_TRACE
        VDBG(dev, "SETUP %02x.%02x v%04x i%04x l%04x\n",
                ctrl.bRequestType, ctrl.bRequest,
-               ctrl.wValue, ctrl.wIndex, ctrl.wLength);
+               le16_to_cpu(ctrl.wValue), le16_to_cpu(ctrl.wIndex),
+               le16_to_cpu(ctrl.wLength));
 #endif
 
        /* hw wants to know when we're configured (or not) */
        dev->req_config = (ctrl.bRequest == USB_REQ_SET_CONFIGURATION
                                && ctrl.bRequestType == USB_RECIP_DEVICE);
        if (unlikely(dev->req_config))
-               dev->configured = (ctrl.wValue != 0);
+               dev->configured = (ctrl.wValue != __constant_cpu_to_le16(0));
 
        /* delegate everything to the gadget driver.
         * it may respond after this irq handler returns.
@@ -1629,11 +1631,11 @@ stall:
 
 static irqreturn_t goku_irq(int irq, void *_dev, struct pt_regs *r)
 {
-       struct goku_udc         *dev = _dev;
-       struct goku_udc_regs    *regs = dev->regs;
-       struct goku_ep          *ep;
-       u32                     stat, handled = 0;
-       unsigned                i, rescans = 5;
+       struct goku_udc                 *dev = _dev;
+       struct goku_udc_regs __iomem    *regs = dev->regs;
+       struct goku_ep                  *ep;
+       u32                             stat, handled = 0;
+       unsigned                        i, rescans = 5;
 
        spin_lock(&dev->lock);
 
@@ -1651,7 +1653,7 @@ rescan:
                        stat = 0;
                        handled = 1;
                        // FIXME have a neater way to prevent re-enumeration
-                       dev->driver = 0;
+                       dev->driver = NULL;
                        goto done;
                }
                if (stat & INT_PWRDETECT) {
@@ -1815,7 +1817,7 @@ static void goku_remove(struct pci_dev *pdev)
                usb_gadget_unregister_driver(dev->driver);
        }
 
-#ifdef UDC_PROC_FILE
+#ifdef CONFIG_USB_GADGET_DEBUG_FILES
        remove_proc_entry(proc_node_name, NULL);
 #endif
        if (dev->regs)
@@ -1831,9 +1833,9 @@ static void goku_remove(struct pci_dev *pdev)
                pci_disable_device(pdev);
        device_unregister(&dev->gadget.dev);
 
-       pci_set_drvdata(pdev, 0);
-       dev->regs = 0;
-       the_controller = 0;
+       pci_set_drvdata(pdev, NULL);
+       dev->regs = NULL;
+       the_controller = NULL;
 
        INFO(dev, "unbind\n");
 }
@@ -1844,9 +1846,9 @@ static void goku_remove(struct pci_dev *pdev)
 
 static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
-       struct goku_udc         *dev = 0;
+       struct goku_udc         *dev = NULL;
        unsigned long           resource, len;
-       void                    *base = 0;
+       void __iomem            *base = NULL;
        int                     retval;
        char                    buf [8], *bufp;
 
@@ -1906,7 +1908,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                retval = -EFAULT;
                goto done;
        }
-       dev->regs = (struct goku_udc_regs *) base;
+       dev->regs = (struct goku_udc_regs __iomem *) base;
 
        pci_set_drvdata(pdev, dev);
        INFO(dev, "%s\n", driver_desc);
@@ -1933,7 +1935,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                pci_set_master(pdev);
 
 
-#ifdef UDC_PROC_FILE
+#ifdef CONFIG_USB_GADGET_DEBUG_FILES
        create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev);
 #endif
 
@@ -1976,7 +1978,7 @@ static struct pci_driver goku_pci_driver = {
 
 static int __init init (void)
 {
-       return pci_module_init (&goku_pci_driver);
+       return pci_register_driver (&goku_pci_driver);
 }
 module_init (init);