Module Name:    src
Committed By:   jmcneill
Date:           Sun Oct 27 17:59:21 UTC 2019

Modified Files:
        src/sys/arch/arm/ti: ti_omaptimer.c

Log Message:
Use Timer2 for timecounter, and enable hw module.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/ti/ti_omaptimer.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/ti/ti_omaptimer.c
diff -u src/sys/arch/arm/ti/ti_omaptimer.c:1.1 src/sys/arch/arm/ti/ti_omaptimer.c:1.2
--- src/sys/arch/arm/ti/ti_omaptimer.c:1.1	Thu Oct 26 01:16:32 2017
+++ src/sys/arch/arm/ti/ti_omaptimer.c	Sun Oct 27 17:59:21 2019
@@ -1,7 +1,7 @@
-/*	$NetBSD: ti_omaptimer.c,v 1.1 2017/10/26 01:16:32 jakllsch Exp $	*/
+/*	$NetBSD: ti_omaptimer.c,v 1.2 2019/10/27 17:59:21 jmcneill Exp $	*/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ti_omaptimer.c,v 1.1 2017/10/26 01:16:32 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ti_omaptimer.c,v 1.2 2019/10/27 17:59:21 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -15,6 +15,23 @@ __KERNEL_RCSID(0, "$NetBSD: ti_omaptimer
 
 #include <dev/fdt/fdtvar.h>
 
+#include <arm/ti/ti_prcm.h>
+
+#define	TIMER_IRQENABLE_SET	0x2c
+#define	TIMER_IRQENABLE_CLR	0x30
+#define	 MAT_EN_FLAG		__BIT(0)
+#define	 OVF_EN_FLAG		__BIT(1)
+#define	 TCAR_EN_FLAG		__BIT(2)
+#define	TIMER_TCLR		0x38
+#define	 TCLR_ST		__BIT(0)
+#define	 TCLR_AR		__BIT(1)
+#define	TIMER_TCRR		0x3c
+#define	TIMER_TLDR		0x40
+
+/* XXX */
+#define	IS_TIMER2(addr)	((addr) == 0x48040000)
+#define	IS_TIMER3(addr)	((addr) == 0x48042000)
+
 static const char * const compatible[] = {
 	"ti,am335x-timer-1ms",
 	"ti,am335x-timer",
@@ -61,12 +78,16 @@ omaptimer_cpu_initclocks(void)
 	
 	aprint_normal_dev(sc->sc_dev, "interrupting on %s\n", intrstr);
 
-	uint32_t value;
-	value = (0xffffffff - ((24000000UL / hz) - 1));
-	bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x40, value);
-	bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x3c, value);
-	bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x2c, 2);
-	bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x38, 3);
+	/* Enable interrupts */
+	bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_IRQENABLE_SET, OVF_EN_FLAG);
+}
+
+static u_int
+omaptimer_get_timecount(struct timecounter *tc)
+{
+	struct omaptimer_softc * const sc = tc->tc_priv;
+
+	return bus_space_read_4(sc->sc_bst, sc->sc_bsh, TIMER_TCRR);
 }
 
 static int
@@ -83,6 +104,7 @@ omaptimer_attach(device_t parent, device
 	struct omaptimer_softc * const sc = device_private(self);
 	struct fdt_attach_args * const faa = aux;
 	const int phandle = faa->faa_phandle;
+	struct timecounter *tc = &sc->sc_tc;
 	bus_addr_t addr;
 	bus_size_t size;
 
@@ -107,13 +129,37 @@ omaptimer_attach(device_t parent, device
 		return;
 	}
 
+	if (ti_prcm_enable_hwmod(OF_parent(phandle), 0) != 0) {
+		aprint_error(": couldn't enable module\n");
+		return;
+	}
+
 	aprint_naive("\n");
 	aprint_normal(": Timer\n");
 
-	/* Use this as the OS timer in UP configurations */
-	if (!arm_has_mpext_p && addr == 0x48042000) { /* TIMER3 */
-		timer_softc = sc;
-		arm_fdt_timer_register(omaptimer_cpu_initclocks);
+	if (IS_TIMER2(addr)) {
+		/* Install timecounter */
+		tc->tc_get_timecount = omaptimer_get_timecount;
+		tc->tc_counter_mask = ~0u;
+		tc->tc_frequency = 24000000;
+		tc->tc_name = "Timer2";
+		tc->tc_quality = 200;
+		tc->tc_priv = sc;
+		tc_init(tc);
+	} else if (IS_TIMER3(addr)) {
+		/* Configure the timer */
+		const uint32_t value = (0xffffffff - ((24000000UL / hz) - 1));
+		bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_TLDR, value);
+		bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_TCRR, value);
+		bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_IRQENABLE_CLR, 
+		    MAT_EN_FLAG | OVF_EN_FLAG | TCAR_EN_FLAG);
+		bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_TCLR, TCLR_ST | TCLR_AR);
+
+		/* Use this as the OS timer in UP configurations */
+		if (!arm_has_mpext_p) {
+			timer_softc = sc;
+			arm_fdt_timer_register(omaptimer_cpu_initclocks);
+		}
 	}
 }
 

Reply via email to