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;