|
@@ -35,6 +35,7 @@
|
|
|
#include <mach/hardware.h>
|
|
|
#include <mach/memory.h>
|
|
|
#include <mach/gpio.h>
|
|
|
+#include <mach/cputype.h>
|
|
|
|
|
|
#include <asm/mach-types.h>
|
|
|
|
|
@@ -411,6 +412,21 @@ int __init musb_platform_init(struct musb *musb)
|
|
|
__raw_writel(phy_ctrl, USB_PHY_CTRL);
|
|
|
}
|
|
|
|
|
|
+ /* On dm355, the default-A state machine needs DRVVBUS control.
|
|
|
+ * If we won't be a host, there's no need to turn it on.
|
|
|
+ */
|
|
|
+ if (cpu_is_davinci_dm355()) {
|
|
|
+ u32 deepsleep = __raw_readl(DM355_DEEPSLEEP);
|
|
|
+
|
|
|
+ if (is_host_enabled(musb)) {
|
|
|
+ deepsleep &= ~DRVVBUS_OVERRIDE;
|
|
|
+ } else {
|
|
|
+ deepsleep &= ~DRVVBUS_FORCE;
|
|
|
+ deepsleep |= DRVVBUS_OVERRIDE;
|
|
|
+ }
|
|
|
+ __raw_writel(deepsleep, DM355_DEEPSLEEP);
|
|
|
+ }
|
|
|
+
|
|
|
/* reset the controller */
|
|
|
musb_writel(tibase, DAVINCI_USB_CTRL_REG, 0x1);
|
|
|
|
|
@@ -437,6 +453,15 @@ int musb_platform_exit(struct musb *musb)
|
|
|
if (is_host_enabled(musb))
|
|
|
del_timer_sync(&otg_workaround);
|
|
|
|
|
|
+ /* force VBUS off */
|
|
|
+ if (cpu_is_davinci_dm355()) {
|
|
|
+ u32 deepsleep = __raw_readl(DM355_DEEPSLEEP);
|
|
|
+
|
|
|
+ deepsleep &= ~DRVVBUS_FORCE;
|
|
|
+ deepsleep |= DRVVBUS_OVERRIDE;
|
|
|
+ __raw_writel(deepsleep, DM355_DEEPSLEEP);
|
|
|
+ }
|
|
|
+
|
|
|
davinci_source_power(musb, 0 /*off*/, 1);
|
|
|
|
|
|
/* delay, to avoid problems with module reload */
|