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