Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-block.git] / drivers / usb / gadget / fsl_udc_core.c
index ede70ffe1ab49934f995f86287f178746f1b3420..2d8c1cfea6993fc53ec2ad34f3f128aa6d4fad16 100644 (file)
@@ -185,20 +185,7 @@ static void done(struct fsl_ep *ep, struct fsl_req *req, int status)
                dma_pool_free(udc->td_pool, curr_td, curr_td->td_dma);
        }
 
-       if (req->mapped) {
-               dma_unmap_single(ep->udc->gadget.dev.parent,
-                       req->req.dma, req->req.length,
-                       ep_is_in(ep)
-                               ? DMA_TO_DEVICE
-                               : DMA_FROM_DEVICE);
-               req->req.dma = DMA_ADDR_INVALID;
-               req->mapped = 0;
-       } else
-               dma_sync_single_for_cpu(ep->udc->gadget.dev.parent,
-                       req->req.dma, req->req.length,
-                       ep_is_in(ep)
-                               ? DMA_TO_DEVICE
-                               : DMA_FROM_DEVICE);
+       usb_gadget_unmap_request(&ep->udc->gadget, &req->req, ep_is_in(ep));
 
        if (status && (status != -ESHUTDOWN))
                VDBG("complete %s req %p stat %d len %u/%u",
@@ -888,6 +875,7 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
        struct fsl_req *req = container_of(_req, struct fsl_req, req);
        struct fsl_udc *udc;
        unsigned long flags;
+       int ret;
 
        /* catch various bogus parameters */
        if (!_req || !req->req.complete || !req->req.buf
@@ -910,22 +898,9 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
 
        req->ep = ep;
 
-       /* map virtual address to hardware */
-       if (req->req.dma == DMA_ADDR_INVALID) {
-               req->req.dma = dma_map_single(ep->udc->gadget.dev.parent,
-                                       req->req.buf,
-                                       req->req.length, ep_is_in(ep)
-                                               ? DMA_TO_DEVICE
-                                               : DMA_FROM_DEVICE);
-               req->mapped = 1;
-       } else {
-               dma_sync_single_for_device(ep->udc->gadget.dev.parent,
-                                       req->req.dma, req->req.length,
-                                       ep_is_in(ep)
-                                               ? DMA_TO_DEVICE
-                                               : DMA_FROM_DEVICE);
-               req->mapped = 0;
-       }
+       ret = usb_gadget_map_request(&ep->udc->gadget, &req->req, ep_is_in(ep));
+       if (ret)
+               return ret;
 
        req->req.status = -EINPROGRESS;
        req->req.actual = 0;
@@ -1290,6 +1265,7 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction)
 {
        struct fsl_req *req = udc->status_req;
        struct fsl_ep *ep;
+       int ret;
 
        if (direction == EP_DIR_IN)
                udc->ep0_dir = USB_DIR_IN;
@@ -1307,10 +1283,9 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction)
        req->req.complete = NULL;
        req->dtd_count = 0;
 
-       req->req.dma = dma_map_single(ep->udc->gadget.dev.parent,
-                       req->req.buf, req->req.length,
-                       ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-       req->mapped = 1;
+       ret = usb_gadget_map_request(&ep->udc->gadget, &req->req, ep_is_in(ep));
+       if (ret)
+               return ret;
 
        if (fsl_req_to_dtd(req, GFP_ATOMIC) == 0)
                fsl_queue_td(ep, req);
@@ -1353,6 +1328,7 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
        u16 tmp = 0;            /* Status, cpu endian */
        struct fsl_req *req;
        struct fsl_ep *ep;
+       int ret;
 
        ep = &udc->eps[0];
 
@@ -1390,10 +1366,9 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
        req->req.complete = NULL;
        req->dtd_count = 0;
 
-       req->req.dma = dma_map_single(ep->udc->gadget.dev.parent,
-                               req->req.buf, req->req.length,
-                               ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-       req->mapped = 1;
+       ret = usb_gadget_map_request(&ep->udc->gadget, &req->req, ep_is_in(ep));
+       if (ret)
+               goto stall;
 
        /* prime the data phase */
        if ((fsl_req_to_dtd(req, GFP_ATOMIC) == 0))
@@ -1964,7 +1939,6 @@ static int fsl_udc_start(struct usb_gadget *g,
        driver->driver.bus = NULL;
        /* hook up the driver */
        udc_controller->driver = driver;
-       udc_controller->gadget.dev.driver = &driver->driver;
        spin_unlock_irqrestore(&udc_controller->lock, flags);
 
        if (!IS_ERR_OR_NULL(udc_controller->transceiver)) {
@@ -1980,7 +1954,6 @@ static int fsl_udc_start(struct usb_gadget *g,
                        if (retval < 0) {
                                ERR("can't bind to transceiver\n");
                                driver->unbind(&udc_controller->gadget);
-                               udc_controller->gadget.dev.driver = 0;
                                udc_controller->driver = 0;
                                return retval;
                        }
@@ -2023,7 +1996,6 @@ static int fsl_udc_stop(struct usb_gadget *g,
                nuke(loop_ep, -ESHUTDOWN);
        spin_unlock_irqrestore(&udc_controller->lock, flags);
 
-       udc_controller->gadget.dev.driver = NULL;
        udc_controller->driver = NULL;
 
        return 0;
@@ -2483,12 +2455,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
 
        /* Setup gadget.dev and register with kernel */
        dev_set_name(&udc_controller->gadget.dev, "gadget");
-       udc_controller->gadget.dev.release = fsl_udc_release;
-       udc_controller->gadget.dev.parent = &pdev->dev;
        udc_controller->gadget.dev.of_node = pdev->dev.of_node;
-       ret = device_register(&udc_controller->gadget.dev);
-       if (ret < 0)
-               goto err_free_irq;
 
        if (!IS_ERR_OR_NULL(udc_controller->transceiver))
                udc_controller->gadget.is_otg = 1;
@@ -2521,10 +2488,11 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
                        DTD_ALIGNMENT, UDC_DMA_BOUNDARY);
        if (udc_controller->td_pool == NULL) {
                ret = -ENOMEM;
-               goto err_unregister;
+               goto err_free_irq;
        }
 
-       ret = usb_add_gadget_udc(&pdev->dev, &udc_controller->gadget);
+       ret = usb_add_gadget_udc_release(&pdev->dev, &udc_controller->gadget,
+                       fsl_udc_release);
        if (ret)
                goto err_del_udc;
 
@@ -2533,8 +2501,6 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
 
 err_del_udc:
        dma_pool_destroy(udc_controller->td_pool);
-err_unregister:
-       device_unregister(&udc_controller->gadget.dev);
 err_free_irq:
        free_irq(udc_controller->irq, udc_controller);
 err_iounmap:
@@ -2584,7 +2550,6 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
        if (pdata->operating_mode == FSL_USB2_DR_DEVICE)
                release_mem_region(res->start, resource_size(res));
 
-       device_unregister(&udc_controller->gadget.dev);
        /* free udc --wait for the release() finished */
        wait_for_completion(&done);
 
@@ -2709,21 +2674,7 @@ static struct platform_driver udc_driver = {
        },
 };
 
-static int __init udc_init(void)
-{
-       printk(KERN_INFO "%s (%s)\n", driver_desc, DRIVER_VERSION);
-       return platform_driver_probe(&udc_driver, fsl_udc_probe);
-}
-
-module_init(udc_init);
-
-static void __exit udc_exit(void)
-{
-       platform_driver_unregister(&udc_driver);
-       printk(KERN_WARNING "%s unregistered\n", driver_desc);
-}
-
-module_exit(udc_exit);
+module_platform_driver_probe(udc_driver, fsl_udc_probe);
 
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_AUTHOR(DRIVER_AUTHOR);