Index: uspace/drv/infrastructure/rootamdm37x/rootamdm37x.c
===================================================================
--- uspace/drv/infrastructure/rootamdm37x/rootamdm37x.c	(revision 639d9dd5dbb589c4026fb84a13514a88ab38caec)
+++ uspace/drv/infrastructure/rootamdm37x/rootamdm37x.c	(revision 601fa93464560a7a2f974811a227b30e6dbf88ec)
@@ -47,4 +47,5 @@
 #include "usbtll.h"
 #include "core_cm.h"
+#include "clock_control_cm.h"
 #include "usbhost_cm.h"
 
@@ -121,36 +122,62 @@
 static int usb_clocks(bool on)
 {
-	usbhost_cm_regs_t *usb_host_cm = NULL;
-	core_cm_regs_t *l4_core_cm = NULL;
-
-	int ret = pio_enable((void*)USBHOST_CM_BASE_ADDRESS, USBHOST_CM_SIZE,
-	    (void**)&usb_host_cm);
-	if (ret != EOK)
-		return ret;
-
-	ret = pio_enable((void*)CORE_CM_BASE_ADDRESS, CORE_CM_SIZE,
-	    (void**)&l4_core_cm);
-	if (ret != EOK)
-		return ret;
+	static usbhost_cm_regs_t *usb_host_cm = NULL;
+	static core_cm_regs_t *l4_core_cm = NULL;
+	static clock_control_cm_regs_t *clock_control_cm = NULL;
+
+	if (!usb_host_cm) {
+		const int ret = pio_enable((void*)USBHOST_CM_BASE_ADDRESS,
+		    USBHOST_CM_SIZE, (void**)&usb_host_cm);
+		if (ret != EOK)
+			return ret;
+	}
+
+	if (!l4_core_cm) {
+		const int ret = pio_enable((void*)CORE_CM_BASE_ADDRESS,
+		    CORE_CM_SIZE, (void**)&l4_core_cm);
+		if (ret != EOK)
+			return ret;
+	}
+
+	if (!clock_control_cm) {
+		const int ret = pio_enable((void*)CLOCK_CONTROL_CM_BASE_ADDRESS,
+		    CLOCK_CONTROL_CM_SIZE, (void**)&clock_control_cm);
+		if (ret != EOK)
+			return ret;
+	}
 
 	assert(l4_core_cm);
 	assert(usb_host_cm);
+	assert(clock_control_cm);
+
+	/* Always set DPLL5 to automatic */
+	uint32_t reg = clock_control_cm->autoidle2_pll
+	reg &= ~(CLOCK_CONTROL_CM_AUTOIDLE2_PLL_AUTO_PERIPH2_DPLL_MASK <<
+	    CLOCK_CONTROL_CM_AUTOIDLE2_PLL_AUTO_PERIPH2_DPLL_SHIFT);
+	reg |= (CLOCK_CONTROL_CM_AUTOIDLE2_PLL_AUTO_PERIPH2_DPLL_AUTOMATIC <<
+	    CLOCK_CONTROL_CM_AUTOIDLE2_PLL_AUTO_PERIPH2_DPLL_SHIFT);
+	clock_control_cm->autoidle2_pll = reg;
+
 	if (on) {
+		/* Enable interface and function clock for USB TLL */
 		l4_core_cm->iclken3 |= CORE_CM_ICLKEN3_EN_USBTLL_FLAG;
 		l4_core_cm->fclken3 |= CORE_CM_FCLKEN3_EN_USBTLL_FLAG;
+
+		/* Enable interface and function clock for USB hosts */
 		usb_host_cm->iclken |= USBHOST_CM_ICLKEN_EN_USBHOST;
 		usb_host_cm->fclken |= USBHOST_CM_FCLKEN_EN_USBHOST1_FLAG;
 		usb_host_cm->fclken |= USBHOST_CM_FCLKEN_EN_USBHOST2_FLAG;
 	} else {
+		/* Disable interface and function clock for USB hosts */
 		usb_host_cm->fclken &= ~USBHOST_CM_FCLKEN_EN_USBHOST2_FLAG;
 		usb_host_cm->fclken &= ~USBHOST_CM_FCLKEN_EN_USBHOST1_FLAG;
 		usb_host_cm->iclken &= ~USBHOST_CM_ICLKEN_EN_USBHOST;
+
+		/* Disable interface and function clock for USB TLL */
 		l4_core_cm->fclken3 &= ~CORE_CM_FCLKEN3_EN_USBTLL_FLAG;
 		l4_core_cm->iclken3 &= ~CORE_CM_ICLKEN3_EN_USBTLL_FLAG;
 	}
 
-	//TODO Unmap those registers.
-
-	return ret;
+	return EOK;
 }
 
@@ -263,5 +290,4 @@
 	/* Add match id */
 	if (ddf_fun_add_match_id(fnode, str_match_id, 100) != EOK) {
-		// TODO This will try to free our data!
 		ddf_fun_destroy(fnode);
 		return false;
@@ -275,4 +301,5 @@
 	if (ddf_fun_bind(fnode) != EOK) {
 		ddf_msg(LVL_ERROR, "Failed binding function %s.", name);
+		// TODO This will try to free our data!
 		ddf_fun_destroy(fnode);
 		return false;
