svn commit: r319537 - head/sys/arm/versatile
Andrew Turner
andrew at FreeBSD.org
Sat Jun 3 15:48:05 UTC 2017
Author: andrew
Date: Sat Jun 3 15:48:03 2017
New Revision: 319537
URL: https://svnweb.freebsd.org/changeset/base/319537
Log:
Add MULTIDELAY support to the sp804 driver.
Modified:
head/sys/arm/versatile/sp804.c
Modified: head/sys/arm/versatile/sp804.c
==============================================================================
--- head/sys/arm/versatile/sp804.c Sat Jun 3 15:40:34 2017 (r319536)
+++ head/sys/arm/versatile/sp804.c Sat Jun 3 15:48:03 2017 (r319537)
@@ -42,6 +42,10 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/intr.h>
+#ifdef MULTIDELAY
+#include <machine/machdep.h> /* For arm_set_delay */
+#endif
+
#include <dev/ofw/openfirm.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
@@ -109,6 +113,7 @@ struct sp804_timer_softc {
bus_space_write_4(sc->bst, sc->bsh, reg, val)
static unsigned sp804_timer_tc_get_timecount(struct timecounter *);
+static void sp804_timer_delay(int, void *);
static unsigned
sp804_timer_tc_get_timecount(struct timecounter *tc)
@@ -287,6 +292,10 @@ sp804_timer_attach(device_t dev)
(sp804_timer_tc_read_4(SP804_PRIMECELL_ID0 + i*4) & 0xff);
}
+#ifdef MULTIDELAY
+ arm_set_delay(sp804_timer_delay, sc);
+#endif
+
device_printf(dev, "PrimeCell ID: %08x\n", id);
sc->timer_initialized = 1;
@@ -310,11 +319,36 @@ static devclass_t sp804_timer_devclass;
DRIVER_MODULE(sp804_timer, simplebus, sp804_timer_driver, sp804_timer_devclass, 0, 0);
+static void
+sp804_timer_delay(int usec, void *arg)
+{
+ struct sp804_timer_softc *sc = arg;
+ int32_t counts;
+ uint32_t first, last;
+
+ /* Get the number of times to count */
+ counts = usec * ((sc->tc.tc_frequency / 1000000) + 1);
+
+ first = sp804_timer_tc_get_timecount(&sc->tc);
+
+ while (counts > 0) {
+ last = sp804_timer_tc_get_timecount(&sc->tc);
+ if (last == first)
+ continue;
+ if (last > first) {
+ counts -= (int32_t)(last - first);
+ } else {
+ counts -= (int32_t)((0xFFFFFFFF - first) + last);
+ }
+ first = last;
+ }
+}
+
+#ifndef MULTIDELAY
void
DELAY(int usec)
{
int32_t counts;
- uint32_t first, last;
device_t timer_dev;
struct sp804_timer_softc *sc;
int timer_initialized = 0;
@@ -336,23 +370,8 @@ DELAY(int usec)
for (counts = 200; counts > 0; counts--)
/* Prevent gcc from optimizing out the loop */
cpufunc_nullop();
- return;
+ } else {
+ sp804_timer_delay(usec, sc);
}
-
- /* Get the number of times to count */
- counts = usec * ((sc->tc.tc_frequency / 1000000) + 1);
-
- first = sp804_timer_tc_get_timecount(&sc->tc);
-
- while (counts > 0) {
- last = sp804_timer_tc_get_timecount(&sc->tc);
- if (last == first)
- continue;
- if (last>first) {
- counts -= (int32_t)(last - first);
- } else {
- counts -= (int32_t)((0xFFFFFFFF - first) + last);
- }
- first = last;
- }
}
+#endif
More information about the svn-src-head
mailing list