]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/gadget/s3c-hsudc.c
Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / drivers / usb / gadget / s3c-hsudc.c
index df8661d266cb0f89517d8d0515136a9128d38a98..cef9b82ff911d7afc439cc6e7e912242a5b44469 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/prefetch.h>
 #include <linux/platform_data/s3c-hsudc.h>
 #include <linux/regulator/consumer.h>
+#include <linux/pm_runtime.h>
 
 #include <mach/regs-s3c2443-clock.h>
 
@@ -145,7 +146,7 @@ struct s3c_hsudc {
        struct usb_gadget_driver *driver;
        struct device *dev;
        struct s3c24xx_hsudc_platdata *pd;
-       struct otg_transceiver *transceiver;
+       struct usb_phy *transceiver;
        struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsudc_supply_names)];
        spinlock_t lock;
        void __iomem *regs;
@@ -759,7 +760,7 @@ static int s3c_hsudc_ep_enable(struct usb_ep *_ep,
        unsigned long flags;
        u32 ecr = 0;
 
-       hsep = container_of(_ep, struct s3c_hsudc_ep, ep);
+       hsep = our_ep(_ep);
        if (!_ep || !desc || hsep->desc || _ep->name == ep0name
                || desc->bDescriptorType != USB_DT_ENDPOINT
                || hsep->bEndpointAddress != desc->bEndpointAddress
@@ -816,6 +817,7 @@ static int s3c_hsudc_ep_disable(struct usb_ep *_ep)
        s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN);
 
        hsep->desc = 0;
+       hsep->ep.desc = NULL;
        hsep->stopped = 1;
 
        spin_unlock_irqrestore(&hsudc->lock, flags);
@@ -853,7 +855,7 @@ static void s3c_hsudc_free_request(struct usb_ep *ep, struct usb_request *_req)
 {
        struct s3c_hsudc_req *hsreq;
 
-       hsreq = container_of(_req, struct s3c_hsudc_req, req);
+       hsreq = our_req(_req);
        WARN_ON(!list_empty(&hsreq->queue));
        kfree(hsreq);
 }
@@ -876,12 +878,12 @@ static int s3c_hsudc_queue(struct usb_ep *_ep, struct usb_request *_req,
        u32 offset;
        u32 csr;
 
-       hsreq = container_of(_req, struct s3c_hsudc_req, req);
+       hsreq = our_req(_req);
        if ((!_req || !_req->complete || !_req->buf ||
                !list_empty(&hsreq->queue)))
                return -EINVAL;
 
-       hsep = container_of(_ep, struct s3c_hsudc_ep, ep);
+       hsep = our_ep(_ep);
        hsudc = hsep->dev;
        if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN)
                return -ESHUTDOWN;
@@ -935,7 +937,7 @@ static int s3c_hsudc_dequeue(struct usb_ep *_ep, struct usb_request *_req)
        struct s3c_hsudc_req *hsreq;
        unsigned long flags;
 
-       hsep = container_of(_ep, struct s3c_hsudc_ep, ep);
+       hsep = our_ep(_ep);
        if (!_ep || hsep->ep.name == ep0name)
                return -EINVAL;
 
@@ -1005,6 +1007,7 @@ static void s3c_hsudc_initep(struct s3c_hsudc *hsudc,
        hsep->ep.ops = &s3c_hsudc_ep_ops;
        hsep->fifo = hsudc->regs + S3C_BR(epnum);
        hsep->desc = 0;
+       hsep->ep.desc = NULL;
        hsep->stopped = 0;
        hsep->wedge = 0;
 
@@ -1166,7 +1169,8 @@ static int s3c_hsudc_start(struct usb_gadget *gadget,
 
        /* connect to bus through transceiver */
        if (hsudc->transceiver) {
-               ret = otg_set_peripheral(hsudc->transceiver, &hsudc->gadget);
+               ret = otg_set_peripheral(hsudc->transceiver->otg,
+                                       &hsudc->gadget);
                if (ret) {
                        dev_err(hsudc->dev, "%s: can't bind to transceiver\n",
                                        hsudc->gadget.name);
@@ -1178,6 +1182,9 @@ static int s3c_hsudc_start(struct usb_gadget *gadget,
        dev_info(hsudc->dev, "bound driver %s\n", driver->driver.name);
 
        s3c_hsudc_reconfig(hsudc);
+
+       pm_runtime_get_sync(hsudc->dev);
+
        s3c_hsudc_init_phy();
        if (hsudc->pd->gpio_init)
                hsudc->pd->gpio_init();
@@ -1208,13 +1215,16 @@ static int s3c_hsudc_stop(struct usb_gadget *gadget,
        hsudc->gadget.dev.driver = NULL;
        hsudc->gadget.speed = USB_SPEED_UNKNOWN;
        s3c_hsudc_uninit_phy();
+
+       pm_runtime_put(hsudc->dev);
+
        if (hsudc->pd->gpio_uninit)
                hsudc->pd->gpio_uninit();
        s3c_hsudc_stop_activity(hsudc);
        spin_unlock_irqrestore(&hsudc->lock, flags);
 
        if (hsudc->transceiver)
-               (void) otg_set_peripheral(hsudc->transceiver, NULL);
+               (void) otg_set_peripheral(hsudc->transceiver->otg, NULL);
 
        disable_irq(hsudc->irq);
 
@@ -1243,7 +1253,7 @@ static int s3c_hsudc_vbus_draw(struct usb_gadget *gadget, unsigned mA)
                return -ENODEV;
 
        if (hsudc->transceiver)
-               return otg_set_power(hsudc->transceiver, mA);
+               return usb_phy_set_power(hsudc->transceiver, mA);
 
        return -EOPNOTSUPP;
 }
@@ -1275,7 +1285,7 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev)
        hsudc->dev = dev;
        hsudc->pd = pdev->dev.platform_data;
 
-       hsudc->transceiver = otg_get_transceiver();
+       hsudc->transceiver = usb_get_transceiver();
 
        for (i = 0; i < ARRAY_SIZE(hsudc->supplies); i++)
                hsudc->supplies[i].supply = s3c_hsudc_supply_names[i];
@@ -1362,6 +1372,8 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev)
        if (ret)
                goto err_add_udc;
 
+       pm_runtime_enable(dev);
+
        return 0;
 err_add_udc:
        device_unregister(&hsudc->gadget.dev);
@@ -1377,7 +1389,7 @@ err_remap:
        release_mem_region(res->start, resource_size(res));
 err_res:
        if (hsudc->transceiver)
-               otg_put_transceiver(hsudc->transceiver);
+               usb_put_transceiver(hsudc->transceiver);
 
        regulator_bulk_free(ARRAY_SIZE(hsudc->supplies), hsudc->supplies);
 err_supplies: