Module Name:    src
Committed By:   riastradh
Date:           Tue Dec 11 19:24:39 UTC 2012

Modified Files:
        src/sys/arch/arm/omap: omap2_reg.h
        src/sys/arch/evbarm/beagle: beagle_machdep.c

Log Message:
Detect the AM335x CPU frequency on the beaglebone.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/omap/omap2_reg.h
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/evbarm/beagle/beagle_machdep.c

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/omap2_reg.h
diff -u src/sys/arch/arm/omap/omap2_reg.h:1.12 src/sys/arch/arm/omap/omap2_reg.h:1.13
--- src/sys/arch/arm/omap/omap2_reg.h:1.12	Tue Dec 11 01:54:42 2012
+++ src/sys/arch/arm/omap/omap2_reg.h	Tue Dec 11 19:24:38 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: omap2_reg.h,v 1.12 2012/12/11 01:54:42 khorben Exp $ */
+/* $NetBSD: omap2_reg.h,v 1.13 2012/12/11 19:24:38 riastradh Exp $ */
 
 /*
  * Copyright (c) 2007 Microsoft
@@ -129,7 +129,7 @@
 #define OMAP2_CM_BASE			(OMAP4430_L4_CORE_BASE + 0x04000)
 #endif
 #ifdef TI_AM335X
-#define OMAP2_CM_BASE			TI_AM335X_L4_WAKEUP_BASE
+#define OMAP2_CM_BASE			(TI_AM335X_L4_WAKEUP_BASE + 0x200000)
 #endif
 #ifdef TI_DM37XX
 #define OMAP2_CM_BASE			0x48004000
@@ -316,6 +316,18 @@
 #define	OMAP4_CM_CLKSEL_DPLL_MPU_DPLL_DIV	__BITS(6,0)
 
 #define	OMAP4_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV	__BITS(4,0)
+
+#define	TI_AM335X_CM_CLKSEL_DPLL_MPU			0x2c
+#define	  TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_BYP_CLKSEL	__BIT(23)
+#define	  TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_MULT	__BITS(18,8)
+#define	  TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_DIV		__BITS(6,0)
+
+#define	TI_AM335X_CM_DIV_M2_DPLL_MPU				0xa8
+#define	  TI_AM335X_CM_DIV_M2_DPLL_MPU_ST_DPLL_CLKOUT		__BIT(9)
+#define	  TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_GATE_CTRL	__BIT(8)
+#define	  TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIVCHACK	__BIT(5)
+#define	  TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV		__BITS(4,0)
+
 /*
  * Power Management registers base, offsets, and size
  */

Index: src/sys/arch/evbarm/beagle/beagle_machdep.c
diff -u src/sys/arch/evbarm/beagle/beagle_machdep.c:1.23 src/sys/arch/evbarm/beagle/beagle_machdep.c:1.24
--- src/sys/arch/evbarm/beagle/beagle_machdep.c:1.23	Tue Dec 11 01:54:43 2012
+++ src/sys/arch/evbarm/beagle/beagle_machdep.c	Tue Dec 11 19:24:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: beagle_machdep.c,v 1.23 2012/12/11 01:54:43 khorben Exp $ */
+/*	$NetBSD: beagle_machdep.c,v 1.24 2012/12/11 19:24:38 riastradh Exp $ */
 
 /*
  * Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.23 2012/12/11 01:54:43 khorben Exp $");
+__KERNEL_RCSID(0, "$NetBSD: beagle_machdep.c,v 1.24 2012/12/11 19:24:38 riastradh Exp $");
 
 #include "opt_machdep.h"
 #include "opt_ddb.h"
@@ -173,6 +173,9 @@ __KERNEL_RCSID(0, "$NetBSD: beagle_machd
 #include <arm/omap/omap_var.h>
 #include <arm/omap/omap_wdtvar.h>
 #include <arm/omap/omap2_prcm.h>
+#ifdef TI_AM335X
+#  include <arm/omap/am335x_prcm.h>
+#endif
 
 #include <evbarm/include/autoconf.h>
 #include <evbarm/beagle/beagle.h>
@@ -213,6 +216,9 @@ static void omap3_cpu_clk(void);
 #if defined(OMAP_4430)
 static void omap4_cpu_clk(void);
 #endif
+#if defined(TI_AM335X)
+static void am335x_cpu_clk(void);
+#endif
 
 bs_protos(bs_notimpl);
 
@@ -375,6 +381,9 @@ initarm(void *arg)
 #if defined(OMAP_4430)
 	omap4_cpu_clk();		// find our CPU speed.
 #endif
+#if defined(TI_AM335X)
+	am335x_cpu_clk();
+#endif
 	/* Heads up ... Setup the CPU / MMU / TLB functions. */
 	if (set_cpufuncs())
 		panic("cpu not recognized!");
@@ -589,6 +598,26 @@ omap4_cpu_clk(void)
 }
 #endif /* OMAP_4400 */
 
+#if defined(TI_AM335X)
+void
+am335x_cpu_clk(void)
+{
+	const vaddr_t cm_base = OMAP2_CM_BASE - OMAP_L4_CORE_BASE + OMAP_L4_CORE_VBASE;
+	const vaddr_t cm_wkup_base = cm_base + AM335X_PRCM_CM_WKUP;
+	const uint32_t sys_clk = 24000000;
+	const uint32_t clksel_dpll_mpu = *(volatile uint32_t *)(cm_wkup_base + TI_AM335X_CM_CLKSEL_DPLL_MPU);
+	const uint32_t div_m2_dpll_mpu = *(volatile uint32_t *)(cm_wkup_base + TI_AM335X_CM_DIV_M2_DPLL_MPU);
+	const uint32_t m = __SHIFTOUT(clksel_dpll_mpu, TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_MULT);
+	const uint32_t n = __SHIFTOUT(clksel_dpll_mpu, TI_AM335X_CM_CLKSEL_DPLL_MPU_DPLL_DIV);
+	const uint32_t m2 = __SHIFTOUT(div_m2_dpll_mpu, TI_AM335X_CM_DIV_M2_DPLL_MPU_DPLL_CLKOUT_DIV);
+	/* XXX This ignores CM_CLKSEL_DPLL_MPU[DPLL_REGM4XEN].  */
+	curcpu()->ci_data.cpu_cc_freq = ((m * (sys_clk / (n + 1))) / m2);
+	printf("%s: %"PRIu64": sys_clk=%u m=%u n=%u (%u) m2=%u\n",
+	    __func__, curcpu()->ci_data.cpu_cc_freq,
+	    sys_clk, m, n, n+1, m2);
+}
+#endif
+
 void
 beagle_device_register(device_t self, void *aux)
 {

Reply via email to