usb: dwc3: fetch mode of operation from HW
authorFelipe Balbi <balbi@ti.com>
Wed, 12 Oct 2011 07:44:56 +0000 (10:44 +0300)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Dec 2011 09:48:11 +0000 (11:48 +0200)
There's no need to add driver_data for something
we can fetch from HW.

This also makes our id_table unnecessary - at least
for now -, so we also remove it on the same patch.

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

index 1f67606fd4fb5912c8c37687a32d5e15f18922b5..df151992e49ddf283168bb505cdeaeb5695a5848 100644 (file)
@@ -325,15 +325,17 @@ static void dwc3_core_exit(struct dwc3 *dwc)
 
 static int __devinit dwc3_probe(struct platform_device *pdev)
 {
-       const struct platform_device_id *id = platform_get_device_id(pdev);
        struct resource         *res;
        struct dwc3             *dwc;
-       void __iomem            *regs;
-       unsigned int            features = id->driver_data;
+
        int                     ret = -ENOMEM;
        int                     irq;
+
+       void __iomem            *regs;
        void                    *mem;
 
+       u8                      mode;
+
        mem = kzalloc(sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
        if (!mem) {
                dev_err(&pdev->dev, "not enough memory\n");
@@ -396,13 +398,22 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
                goto err3;
        }
 
-       if (features & DWC3_HAS_PERIPHERAL) {
+       mode = DWC3_MODE(dwc->hwparams.hwparams0);
+
+       switch (mode) {
+       case DWC3_MODE_DRD:
+       case DWC3_MODE_DEVICE:
                ret = dwc3_gadget_init(dwc);
                if (ret) {
-                       dev_err(&pdev->dev, "failed to initialized gadget\n");
+                       dev_err(&pdev->dev, "failed to initialize gadget\n");
                        goto err4;
                }
+               break;
+       default:
+               dev_err(&pdev->dev, "Unsupported mode of operation %d\n", mode);
+               goto err4;
        }
+       dwc->mode = mode;
 
        ret = dwc3_debugfs_init(dwc);
        if (ret) {
@@ -415,8 +426,15 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
        return 0;
 
 err5:
-       if (features & DWC3_HAS_PERIPHERAL)
+       switch (mode) {
+       case DWC3_MODE_DRD:
+       case DWC3_MODE_DEVICE:
                dwc3_gadget_exit(dwc);
+               break;
+       default:
+               /* do nothing */
+               break;
+       }
 
 err4:
        dwc3_core_exit(dwc);
@@ -436,10 +454,8 @@ err0:
 
 static int __devexit dwc3_remove(struct platform_device *pdev)
 {
-       const struct platform_device_id *id = platform_get_device_id(pdev);
        struct dwc3     *dwc = platform_get_drvdata(pdev);
        struct resource *res;
-       unsigned int    features = id->driver_data;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
@@ -448,8 +464,15 @@ static int __devexit dwc3_remove(struct platform_device *pdev)
 
        dwc3_debugfs_exit(dwc);
 
-       if (features & DWC3_HAS_PERIPHERAL)
+       switch (dwc->mode) {
+       case DWC3_MODE_DRD:
+       case DWC3_MODE_DEVICE:
                dwc3_gadget_exit(dwc);
+               break;
+       default:
+               /* do nothing */
+               break;
+       }
 
        dwc3_core_exit(dwc);
        release_mem_region(res->start, resource_size(res));
@@ -459,28 +482,12 @@ static int __devexit dwc3_remove(struct platform_device *pdev)
        return 0;
 }
 
-static const struct platform_device_id dwc3_id_table[] __devinitconst = {
-       {
-               .name   = "dwc3-omap",
-               .driver_data = (DWC3_HAS_PERIPHERAL
-                       | DWC3_HAS_XHCI
-                       | DWC3_HAS_OTG),
-       },
-       {
-               .name   = "dwc3-pci",
-               .driver_data = DWC3_HAS_PERIPHERAL,
-       },
-       {  },   /* Terminating Entry */
-};
-MODULE_DEVICE_TABLE(platform, dwc3_id_table);
-
 static struct platform_driver dwc3_driver = {
        .probe          = dwc3_probe,
        .remove         = __devexit_p(dwc3_remove),
        .driver         = {
                .name   = "dwc3",
        },
-       .id_table       = dwc3_id_table,
 };
 
 MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
index 4b6c673ed6085c6bbb83e395641c50e46443b052..a3ef8f34bf7764fe75d97958236f98ab710e16d2 100644 (file)
@@ -536,6 +536,15 @@ struct dwc3_hwparams {
        u32     hwparams8;
 };
 
+/* HWPARAMS0 */
+#define DWC3_MODE(n)           ((n) & 0x7)
+
+#define DWC3_MODE_DEVICE       0
+#define DWC3_MODE_HOST         1
+#define DWC3_MODE_DRD          2
+#define DWC3_MODE_HUB          3
+
+/* HWPARAMS1 */
 #define DWC3_NUM_INT(n)        (((n) & (0x3f << 15)) >> 15)
 
 /**
@@ -560,6 +569,7 @@ struct dwc3_hwparams {
  * @num_event_buffers: calculated number of event buffers
  * @maximum_speed: maximum speed requested (mainly for testing purposes)
  * @revision: revision register contents
+ * @mode: mode of operation
  * @is_selfpowered: true when we are selfpowered
  * @three_stage_setup: set if we perform a three phase setup
  * @ep0_status_pending: ep0 status response without a req is pending
@@ -602,6 +612,7 @@ struct dwc3 {
        u32                     num_event_buffers;
        u32                     maximum_speed;
        u32                     revision;
+       u32                     mode;
 
 #define DWC3_REVISION_173A     0x5533173a
 #define DWC3_REVISION_175A     0x5533175a
index 062552b5fc8a5cbdfa644da11d629aedb92e1d8a..7bcf6775a1a1c4a9ef89d7a10d36fa9aa2499967 100644 (file)
@@ -236,7 +236,7 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev)
                goto err1;
        }
 
-       dwc3 = platform_device_alloc("dwc3-omap", -1);
+       dwc3 = platform_device_alloc("dwc3", -1);
        if (!dwc3) {
                dev_err(&pdev->dev, "couldn't allocate dwc3 device\n");
                goto err2;
index f77c000426851427d8dfb176e8bb3fdcbd9f913a..193f1bd90d5954a270234b43774004bb2a615ce1 100644 (file)
@@ -118,7 +118,7 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci,
        if (devid < 0)
                goto err2;
 
-       dwc3 = platform_device_alloc("dwc3-pci", devid);
+       dwc3 = platform_device_alloc("dwc3", devid);
        if (!dwc3) {
                dev_err(&pci->dev, "couldn't allocate dwc3 device\n");
                goto err3;
@@ -196,7 +196,7 @@ static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = {
 MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table);
 
 static struct pci_driver dwc3_pci_driver = {
-       .name           = "pci-dwc3",
+       .name           = "dwc3-pci",
        .id_table       = dwc3_pci_id_table,
        .probe          = dwc3_pci_probe,
        .remove         = __devexit_p(dwc3_pci_remove),