]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/gadget/s3c-hsudc.c
Merge tag 'nfs-for-3.7-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[~andy/linux] / drivers / usb / gadget / s3c-hsudc.c
index e26a4e7ed2bf978868347ececb4332bb74db2db2..d8e785d4ad590cd0797d51da6de54dda39853e1f 100644 (file)
@@ -135,7 +135,6 @@ struct s3c_hsudc_req {
  * @dev: The device reference used by probe function.
  * @lock: Lock to synchronize the usage of Endpoints (EP's are indexed).
  * @regs: Remapped base address of controller's register space.
- * @mem_rsrc: Device memory resource used for remapping device register space.
  * irq: IRQ number used by the controller.
  * uclk: Reference to the controller clock.
  * ep0state: Current state of EP0.
@@ -150,7 +149,6 @@ struct s3c_hsudc {
        struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsudc_supply_names)];
        spinlock_t lock;
        void __iomem *regs;
-       struct resource *mem_rsrc;
        int irq;
        struct clk *uclk;
        int ep0state;
@@ -835,9 +833,9 @@ static struct usb_request *s3c_hsudc_alloc_request(struct usb_ep *_ep,
 {
        struct s3c_hsudc_req *hsreq;
 
-       hsreq = kzalloc(sizeof *hsreq, gfp_flags);
+       hsreq = kzalloc(sizeof(*hsreq), gfp_flags);
        if (!hsreq)
-               return 0;
+               return NULL;
 
        INIT_LIST_HEAD(&hsreq->queue);
        return &hsreq->req;
@@ -906,16 +904,16 @@ static int s3c_hsudc_queue(struct usb_ep *_ep, struct usb_request *_req,
                        csr = readl((u32)hsudc->regs + offset);
                        if (!(csr & S3C_ESR_TX_SUCCESS) &&
                                (s3c_hsudc_write_fifo(hsep, hsreq) == 1))
-                               hsreq = 0;
+                               hsreq = NULL;
                } else {
                        csr = readl((u32)hsudc->regs + offset);
                        if ((csr & S3C_ESR_RX_SUCCESS)
                                   && (s3c_hsudc_read_fifo(hsep, hsreq) == 1))
-                               hsreq = 0;
+                               hsreq = NULL;
                }
        }
 
-       if (hsreq != 0)
+       if (hsreq)
                list_add_tail(&hsreq->queue, &hsep->queue);
 
        spin_unlock_irqrestore(&hsudc->lock, flags);
@@ -1271,7 +1269,7 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev)
        struct s3c24xx_hsudc_platdata *pd = pdev->dev.platform_data;
        int ret, i;
 
-       hsudc = kzalloc(sizeof(struct s3c_hsudc) +
+       hsudc = devm_kzalloc(&pdev->dev, sizeof(struct s3c_hsudc) +
                        sizeof(struct s3c_hsudc_ep) * pd->epnum,
                        GFP_KERNEL);
        if (!hsudc) {
@@ -1296,25 +1294,12 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev)
        }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(dev, "unable to obtain driver resource data\n");
-               ret = -ENODEV;
-               goto err_res;
-       }
-
-       hsudc->mem_rsrc = request_mem_region(res->start, resource_size(res),
-                               dev_name(&pdev->dev));
-       if (!hsudc->mem_rsrc) {
-               dev_err(dev, "failed to reserve register area\n");
-               ret = -ENODEV;
-               goto err_res;
-       }
 
-       hsudc->regs = ioremap(res->start, resource_size(res));
+       hsudc->regs = devm_request_and_ioremap(&pdev->dev, res);
        if (!hsudc->regs) {
                dev_err(dev, "error mapping device register area\n");
                ret = -EBUSY;
-               goto err_remap;
+               goto err_res;
        }
 
        spin_lock_init(&hsudc->lock);
@@ -1337,21 +1322,22 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev)
        ret = platform_get_irq(pdev, 0);
        if (ret < 0) {
                dev_err(dev, "unable to obtain IRQ number\n");
-               goto err_irq;
+               goto err_res;
        }
        hsudc->irq = ret;
 
-       ret = request_irq(hsudc->irq, s3c_hsudc_irq, 0, driver_name, hsudc);
+       ret = devm_request_irq(&pdev->dev, hsudc->irq, s3c_hsudc_irq, 0,
+                               driver_name, hsudc);
        if (ret < 0) {
                dev_err(dev, "irq request failed\n");
-               goto err_irq;
+               goto err_res;
        }
 
-       hsudc->uclk = clk_get(&pdev->dev, "usb-device");
+       hsudc->uclk = devm_clk_get(&pdev->dev, "usb-device");
        if (IS_ERR(hsudc->uclk)) {
                dev_err(dev, "failed to find usb-device clock source\n");
                ret = PTR_ERR(hsudc->uclk);
-               goto err_clk;
+               goto err_res;
        }
        clk_enable(hsudc->uclk);
 
@@ -1377,21 +1363,12 @@ err_add_udc:
        device_unregister(&hsudc->gadget.dev);
 err_add_device:
        clk_disable(hsudc->uclk);
-       clk_put(hsudc->uclk);
-err_clk:
-       free_irq(hsudc->irq, hsudc);
-err_irq:
-       iounmap(hsudc->regs);
-
-err_remap:
-       release_mem_region(res->start, resource_size(res));
 err_res:
        if (!IS_ERR_OR_NULL(hsudc->transceiver))
                usb_put_phy(hsudc->transceiver);
 
        regulator_bulk_free(ARRAY_SIZE(hsudc->supplies), hsudc->supplies);
 err_supplies:
-       kfree(hsudc);
        return ret;
 }