usb: dwc3: allow forcing a maximum speed
authorFelipe Balbi <balbi@ti.com>
Fri, 7 Oct 2011 19:55:04 +0000 (22:55 +0300)
committerFelipe Balbi <balbi@ti.com>
Mon, 12 Dec 2011 09:48:10 +0000 (11:48 +0200)
this is mainly for testing. In order to be able
to test if we're enumerating correctly on all
speeds, let that be controlled by a module
parameter.

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

index 717ebc9ff941808e2ddd52c93db09cc998456565..ca3b01f5fffa52761d9894a2b648a094a68370c3 100644 (file)
 
 #include "debug.h"
 
+static char *maximum_speed = "super";
+module_param(maximum_speed, charp, 0);
+MODULE_PARM_DESC(maximum_speed, "Maximum supported speed.");
+
 /**
  * dwc3_core_soft_reset - Issues core soft reset and PHY reset
  * @dwc: pointer to our context structure
@@ -370,6 +374,17 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
        dwc->dev        = &pdev->dev;
        dwc->irq        = irq;
 
+       if (!strncmp("super", maximum_speed, 5))
+               dwc->maximum_speed = DWC3_DCFG_SUPERSPEED;
+       else if (!strncmp("high", maximum_speed, 4))
+               dwc->maximum_speed = DWC3_DCFG_HIGHSPEED;
+       else if (!strncmp("full", maximum_speed, 4))
+               dwc->maximum_speed = DWC3_DCFG_FULLSPEED1;
+       else if (!strncmp("low", maximum_speed, 3))
+               dwc->maximum_speed = DWC3_DCFG_LOWSPEED;
+       else
+               dwc->maximum_speed = DWC3_DCFG_SUPERSPEED;
+
        pm_runtime_enable(&pdev->dev);
        pm_runtime_get_sync(&pdev->dev);
        pm_runtime_forbid(&pdev->dev);
index 29a8e1679e125ed723e76af50a28c278032f46dd..b7d56c3a1fbb1bcc5cd671b7a625ff17641cab1f 100644 (file)
@@ -555,6 +555,7 @@ struct dwc3_hwparams {
  * @regs: base address for our registers
  * @regs_size: address space size
  * @irq: IRQ number
+ * @maximum_speed: maximum speed requested (mainly for testing purposes)
  * @revision: revision register contents
  * @is_selfpowered: true when we are selfpowered
  * @three_stage_setup: set if we perform a three phase setup
@@ -595,6 +596,7 @@ struct dwc3 {
 
        int                     irq;
 
+       u32                     maximum_speed;
        u32                     revision;
 
 #define DWC3_REVISION_173A     0x5533173a
index 46ed15bca19f468a914ded9cad9985a5712f6d9f..807737aec00e7029463ce91e811b90493206de8e 100644 (file)
@@ -1183,7 +1183,7 @@ static int dwc3_gadget_start(struct usb_gadget *g,
 
        reg = dwc3_readl(dwc->regs, DWC3_DCFG);
        reg &= ~(DWC3_DCFG_SPEED_MASK);
-       reg |= DWC3_DCFG_SUPERSPEED;
+       reg |= dwc->maximum_speed;
        dwc3_writel(dwc->regs, DWC3_DCFG, reg);
 
        dwc->start_config_issued = false;