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_ */