DA830 EVM: MUSB platform code
authorSergei Shtylyov <sshtylyov@ru.mvista.com>
Fri, 30 Oct 2009 19:52:04 +0000 (23:52 +0400)
committerKevin Hilman <khilman@deeprootsystems.com>
Wed, 25 Nov 2009 18:21:34 +0000 (10:21 -0800)
Properly set up the OTG mode thru the CFGCHIP2 register, enable the
USB0_DRVVBUS pin, and finally register the MUSB platform device.

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-davinci/board-da830-evm.c

index bfa7902..ccf66c7 100644 (file)
@@ -171,8 +171,37 @@ static __init void da830_evm_usb_init(void)
        cfgchip2 &= ~CFGCHIP2_USB1PHYCLKMUX;
        cfgchip2 |=  CFGCHIP2_USB2PHYCLKMUX;
 
        cfgchip2 &= ~CFGCHIP2_USB1PHYCLKMUX;
        cfgchip2 |=  CFGCHIP2_USB2PHYCLKMUX;
 
+       /*
+        * We have to override VBUS/ID signals when MUSB is configured into the
+        * host-only mode -- ID pin will float if no cable is connected, so the
+        * controller won't be able to drive VBUS thinking that it's a B-device.
+        * Otherwise, we want to use the OTG mode and enable VBUS comparators.
+        */
+       cfgchip2 &= ~CFGCHIP2_OTGMODE;
+#ifdef CONFIG_USB_MUSB_HOST
+       cfgchip2 |=  CFGCHIP2_FORCE_HOST;
+#else
+       cfgchip2 |=  CFGCHIP2_SESENDEN | CFGCHIP2_VBDTCTEN;
+#endif
+
        __raw_writel(cfgchip2, DA8XX_SYSCFG_VIRT(DA8XX_CFGCHIP2_REG));
 
        __raw_writel(cfgchip2, DA8XX_SYSCFG_VIRT(DA8XX_CFGCHIP2_REG));
 
+       /* USB_REFCLKIN is not used. */
+       ret = davinci_cfg_reg(DA830_USB0_DRVVBUS);
+       if (ret)
+               pr_warning("%s: USB 2.0 PinMux setup failed: %d\n",
+                          __func__, ret);
+       else {
+               /*
+                * TPS2065 switch @ 5V supplies 1 A (sustains 1.5 A),
+                * with the power on to power good time of 3 ms.
+                */
+               ret = da8xx_register_usb20(1000, 3);
+               if (ret)
+                       pr_warning("%s: USB 2.0 registration failed: %d\n",
+                                  __func__, ret);
+       }
+
        ret = da8xx_pinmux_setup(da830_evm_usb11_pins);
        if (ret) {
                pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",
        ret = da8xx_pinmux_setup(da830_evm_usb11_pins);
        if (ret) {
                pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",