usb: dwc3: omap: add multiple instances support to OMAP
authorFelipe Balbi <balbi@ti.com>
Tue, 18 Oct 2011 10:58:30 +0000 (13:58 +0300)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Dec 2011 09:48:23 +0000 (11:48 +0200)
if we ever have an omap with multiple instances of
the DWC3 IP, we need unique names for them. In order
to achieve that, let's use the dwc3_get/put_device_id()
calls to give us an unique device identifier.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/dwc3-omap.c

index 0bdc5e9..c8a1bc5 100644 (file)
@@ -48,6 +48,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 
+#include "core.h"
 #include "io.h"
 
 /*
@@ -200,6 +201,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
        struct dwc3_omap        *omap;
        struct resource         *res;
 
+       int                     devid;
        int                     ret = -ENOMEM;
        int                     irq;
 
@@ -236,16 +238,20 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
                goto err1;
        }
 
-       dwc3 = platform_device_alloc("dwc3", -1);
+       devid = dwc3_get_device_id();
+       if (devid < 0)
+               goto err2;
+
+       dwc3 = platform_device_alloc("dwc3", devid);
        if (!dwc3) {
                dev_err(&pdev->dev, "couldn't allocate dwc3 device\n");
-               goto err2;
+               goto err3;
        }
 
        context = kzalloc(resource_size(res), GFP_KERNEL);
        if (!context) {
                dev_err(&pdev->dev, "couldn't allocate dwc3 context memory\n");
-               goto err3;
+               goto err4;
        }
 
        spin_lock_init(&omap->lock);
@@ -299,7 +305,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
        if (ret) {
                dev_err(&pdev->dev, "failed to request IRQ #%d --> %d\n",
                                omap->irq, ret);
-               goto err4;
+               goto err5;
        }
 
        /* enable all IRQs */
@@ -322,26 +328,29 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
                        pdev->num_resources);
        if (ret) {
                dev_err(&pdev->dev, "couldn't add resources to dwc3 device\n");
-               goto err5;
+               goto err6;
        }
 
        ret = platform_device_add(dwc3);
        if (ret) {
                dev_err(&pdev->dev, "failed to register dwc3 device\n");
-               goto err5;
+               goto err6;
        }
 
        return 0;
 
-err5:
+err6:
        free_irq(omap->irq, omap);
 
-err4:
+err5:
        kfree(omap->context);
 
-err3:
+err4:
        platform_device_put(dwc3);
 
+err3:
+       dwc3_put_device_id(devid);
+
 err2:
        iounmap(base);
 
@@ -358,6 +367,7 @@ static int __devexit dwc3_omap_remove(struct platform_device *pdev)
 
        platform_device_unregister(omap->dwc3);
 
+       dwc3_put_device_id(omap->dwc3->id);
        free_irq(omap->irq, omap);
        iounmap(omap->base);