Module Name: src
Committed By: matt
Date: Fri Jun 28 02:31:16 UTC 2013
Modified Files:
src/sys/arch/arm/omap: am335x_prcm.c am335x_prcm.h
Log Message:
Add a routine to set the mpu multiplier. (not used yet)
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/omap/am335x_prcm.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/omap/am335x_prcm.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/omap/am335x_prcm.c
diff -u src/sys/arch/arm/omap/am335x_prcm.c:1.1 src/sys/arch/arm/omap/am335x_prcm.c:1.2
--- src/sys/arch/arm/omap/am335x_prcm.c:1.1 Tue Dec 11 18:53:26 2012
+++ src/sys/arch/arm/omap/am335x_prcm.c Fri Jun 28 02:31:16 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: am335x_prcm.c,v 1.1 2012/12/11 18:53:26 riastradh Exp $ */
+/* $NetBSD: am335x_prcm.c,v 1.2 2013/06/28 02:31:16 matt Exp $ */
/*
* TI OMAP Power, Reset, and Clock Management on the AM335x
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: am335x_prcm.c,v 1.1 2012/12/11 18:53:26 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: am335x_prcm.c,v 1.2 2013/06/28 02:31:16 matt Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -93,3 +93,33 @@ prcm_module_disable(const struct omap_mo
prcm_write_4(cm_module, clkctrl_reg, clkctrl);
am335x_prcm_check_clkctrl(cm_module, clkctrl_reg, clkctrl);
}
+
+void
+prcm_mpu_pll_config(u_int mpupll_m)
+{
+ uint32_t clkmode = prcm_read_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_CLKMODE_DPLL_MPU);
+ uint32_t clksel = prcm_read_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_CLKSEL_DPLL_MPU);
+ //uint32_t div_m2 = prcm_read_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_DIV_M2_DPLL_MPU);
+
+ /* Request the DPLL to be put into bypass mode */
+ prcm_write_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_CLKMODE_DPLL_MPU, AM335X_PRCM_CM_CLKMODE_DPLL_MN_BYP_MODE);
+
+ /* Wait for it to be put into bypass */
+ while (prcm_read_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_IDLEST_DPLL_MPU) != AM335X_PRCM_CM_IDLEST_DPLL_ST_DPLL_CLK_MN_BYPASS) {
+ /* nothing */
+ }
+
+ /* Replace multipler */
+ clksel &= ~AM335X_PRCM_CM_CLKSEL_DPLL_MULT;
+ clksel |= __SHIFTIN(mpupll_m, AM335X_PRCM_CM_CLKSEL_DPLL_MULT);
+ prcm_write_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_CLKSEL_DPLL_MPU, clksel);
+
+ /* Exit bypass mode */
+ clkmode |= AM335X_PRCM_CM_CLKMODE_DPLL_LOCK_MODE;
+ prcm_write_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_CLKMODE_DPLL_MPU, clkmode);
+
+ /* Wait for the DPLL to lock */
+ while (prcm_read_4(AM335X_PRCM_CM_WKUP, AM335X_PRCM_CM_IDLEST_DPLL_MPU) != AM335X_PRCM_CM_IDLEST_DPLL_ST_DPLL_CLK_LOCKED) {
+ /* nothing */
+ }
+}
Index: src/sys/arch/arm/omap/am335x_prcm.h
diff -u src/sys/arch/arm/omap/am335x_prcm.h:1.2 src/sys/arch/arm/omap/am335x_prcm.h:1.3
--- src/sys/arch/arm/omap/am335x_prcm.h:1.2 Thu Dec 13 02:12:15 2012
+++ src/sys/arch/arm/omap/am335x_prcm.h Fri Jun 28 02:31:16 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: am335x_prcm.h,v 1.2 2012/12/13 02:12:15 jakllsch Exp $ */
+/* $NetBSD: am335x_prcm.h,v 1.3 2013/06/28 02:31:16 matt Exp $ */
/*
* TI OMAP Power, Reset, and Clock Management on the AM335x
@@ -61,8 +61,24 @@ struct omap_module {
#define AM335X_PRCM_PRM_GFX 0x1100
#define AM335X_PRCM_PRM_CEFUSE 0x1200
+/* In CM_WKUP */
+#define AM335X_PRCM_CM_IDLEST_DPLL_MPU 0x20
+#define AM335X_PRCM_CM_IDLEST_DPLL_ST_DPLL_CLK_MN_BYPASS __BIT(8)
+#define AM335X_PRCM_CM_IDLEST_DPLL_ST_DPLL_CLK_LOCKED __BIT(0)
+#define AM335X_PRCM_CM_CLKSEL_DPLL_MPU 0x2c
+#define AM335X_PRCM_CM_CLKSEL_DPLL_BYPASS __BITS(23)
+#define AM335X_PRCM_CM_CLKSEL_DPLL_MULT __BITS(18,8)
+#define AM335X_PRCM_CM_CLKSEL_DPLL_DIV __BITS(6,0)
+#define AM335X_PRCM_CM_CLKMODE_DPLL_MPU 0x88
+#define AM335X_PRCM_CM_CLKMODE_DPLL_MN_BYP_MODE 4
+#define AM335X_PRCM_CM_CLKMODE_DPLL_LOCK_MODE 7
+#define AM335X_PRCM_CM_DIV_M2_DPLL_MPU 0xa8
+
+
#define PRM_RSTCTRL 0x00 /* offset from AM335X_PRCM_PRM_DEVICE */
#define RST_GLOBAL_WARM_SW __BIT(0)
#define RST_GLOBAL_COLD_SW __BIT(1)
+void prcm_mpu_pll_config(u_int);
+
#endif /* _ARM_OMAP_AM335X_PRCM_H_ */