Module Name:    src
Committed By:   skrll
Date:           Wed Aug 14 09:20:00 UTC 2019

Modified Files:
        src/sys/arch/arm/cortex: a9ptmr.c

Log Message:
Various fixes / changes

- don't use prescaler
- improve AB_DEBUG output
- fix a9ptmr_delay to work with a decrementing counter!

Thanks to jmcneill@ for proving I'm an idiot


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/cortex/a9ptmr.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/cortex/a9ptmr.c
diff -u src/sys/arch/arm/cortex/a9ptmr.c:1.1 src/sys/arch/arm/cortex/a9ptmr.c:1.2
--- src/sys/arch/arm/cortex/a9ptmr.c:1.1	Sat Aug 10 17:03:59 2019
+++ src/sys/arch/arm/cortex/a9ptmr.c	Wed Aug 14 09:20:00 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: a9ptmr.c,v 1.1 2019/08/10 17:03:59 skrll Exp $	*/
+/*	$NetBSD: a9ptmr.c,v 1.2 2019/08/14 09:20:00 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: a9ptmr.c,v 1.1 2019/08/10 17:03:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: a9ptmr.c,v 1.2 2019/08/14 09:20:00 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -144,6 +144,7 @@ a9ptmr_attach(device_t parent, device_t 
 	sc->sc_ctl = a9ptmr_read(sc, TMR_CTL);
 
 	sc->sc_prescaler = 1;
+#if 0
 	/*
 	 * Let's hope the timer frequency isn't prime.
 	 */
@@ -154,14 +155,17 @@ a9ptmr_attach(device_t parent, device_t 
 		}
 	}
 	sc->sc_freq /= sc->sc_prescaler;
+#endif
 
-	aprint_debug_dev(sc->sc_dev, ": freq %d prescaler %d", sc->sc_freq,
+	aprint_debug(": freq %d prescaler %d", sc->sc_freq,
 	    sc->sc_prescaler);
 	sc->sc_ctl = TMR_CTL_INT_ENABLE | TMR_CTL_AUTO_RELOAD | TMR_CTL_ENABLE;
 	sc->sc_ctl |= __SHIFTIN(sc->sc_prescaler - 1, TMR_CTL_PRESCALER);
 
 	sc->sc_load = (sc->sc_freq / hz) - 1;
 
+	aprint_debug(": load %d ", sc->sc_load);
+
 	a9ptmr_init_cpu_clock(curcpu());
 
 	aprint_naive("\n");
@@ -188,7 +192,6 @@ a9ptmr_delay(unsigned int n)
 	    curcpu()->ci_data.cpu_cc_freq / 2;
 	KASSERT(freq != 0);
 
-
 	const uint64_t counts_per_usec = freq / 1000000;
 	uint32_t delta, usecs, last, curr;
 
@@ -200,11 +203,11 @@ a9ptmr_delay(unsigned int n)
 	while (n > usecs) {
 		curr = a9ptmr_read(sc, TMR_CTR);
 
-		/* Check to see if the timer has wrapped around. */
-		if (curr < last)
-			delta += curr + (sc->sc_load - last);
+		/* Check to see if the timer has reloaded. */
+		if (curr > last)
+			delta += (sc->sc_load - curr) + last;
 		else
-			delta += curr - last;
+			delta += last - curr;
 
 		last = curr;
 

Reply via email to