The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=449e6a9527f6652888a7027cba57330f191e2610
commit 449e6a9527f6652888a7027cba57330f191e2610 Author: Mitchell Horne <mho...@freebsd.org> AuthorDate: 2025-01-27 19:59:27 +0000 Commit: Mitchell Horne <mho...@freebsd.org> CommitDate: 2025-01-27 20:03:49 +0000 a10_timer: some tidying/re-organization In preparation for enabling the driver on the D1 platform (riscv). - Better isolate armv7-only portions of the driver - Move a10 timecounter setup into a helper function - Small style tweaks Reviewed by: manu, ganbold MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D48670 --- sys/arm/allwinner/a10_timer.c | 90 ++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 39 deletions(-) diff --git a/sys/arm/allwinner/a10_timer.c b/sys/arm/allwinner/a10_timer.c index 18fb2a56da3a..80315914949b 100644 --- a/sys/arm/allwinner/a10_timer.c +++ b/sys/arm/allwinner/a10_timer.c @@ -28,12 +28,13 @@ #include <sys/systm.h> #include <sys/bus.h> #include <sys/kernel.h> -#include <sys/module.h> #include <sys/malloc.h> +#include <sys/module.h> #include <sys/rman.h> #include <sys/timeet.h> #include <sys/timetc.h> #include <sys/watchdog.h> + #include <machine/bus.h> #include <machine/intr.h> #include <machine/machdep.h> @@ -79,8 +80,8 @@ /* 64 bit counter, available in A10 and A13 */ #define CNT64_CTRL_REG 0xa0 #define CNT64_CTRL_RL_EN 0x02 /* read latch enable */ -#define CNT64_LO_REG 0xa4 -#define CNT64_HI_REG 0xa8 +#define CNT64_LO_REG 0xa4 +#define CNT64_HI_REG 0xa8 #define SYS_TIMER_CLKSRC 24000000 /* clock source */ @@ -104,18 +105,17 @@ struct a10_timer_softc { #define timer_write_4(sc, reg, val) \ bus_write_4(sc->res[A10_TIMER_MEMRES], reg, val) -static u_int a10_timer_get_timecount(struct timecounter *); #if defined(__arm__) +static u_int a10_timer_get_timecount(struct timecounter *); +static uint64_t a10_timer_read_counter64(struct a10_timer_softc *sc); +static void a10_timer_timecounter_setup(struct a10_timer_softc *sc); + +static void a10_timer_eventtimer_setup(struct a10_timer_softc *sc); static int a10_timer_timer_start(struct eventtimer *, sbintime_t first, sbintime_t period); static int a10_timer_timer_stop(struct eventtimer *); #endif -static uint64_t timer_read_counter64(struct a10_timer_softc *sc); -#if defined(__arm__) -static void a10_timer_eventtimer_setup(struct a10_timer_softc *sc); -#endif - #if defined(__aarch64__) static void a23_timer_timecounter_setup(struct a10_timer_softc *sc); static u_int a23_timer_get_timecount(struct timecounter *tc); @@ -127,7 +127,6 @@ static int a10_timer_attach(device_t); #if defined(__arm__) static delay_func a10_timer_delay; -#endif static struct timecounter a10_timer_timecounter = { .tc_name = "a10_timer timer0", @@ -136,6 +135,7 @@ static struct timecounter a10_timer_timecounter = { .tc_frequency = 0, .tc_quality = 1000, }; +#endif #if defined(__aarch64__) static struct timecounter a23_timer_timecounter = { @@ -168,16 +168,12 @@ static struct ofw_compat_data compat_data[] = { static int a10_timer_probe(device_t dev) { -#if defined(__arm__) - u_int soc_family; -#endif - if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) return (ENXIO); #if defined(__arm__) /* For SoC >= A10 we have the ARM Timecounter/Eventtimer */ - soc_family = allwinner_soc_family(); + u_int soc_family = allwinner_soc_family(); if (soc_family != ALLWINNERSOC_SUN4I && soc_family != ALLWINNERSOC_SUN5I) return (ENXIO); @@ -214,34 +210,27 @@ a10_timer_attach(device_t dev) return (ENXIO); } - if (clk_get_by_ofw_index(dev, 0, 0, &clk) != 0) + if (clk_get_by_ofw_index(dev, 0, 0, &clk) != 0) { sc->timer0_freq = SYS_TIMER_CLKSRC; - else { + } else { if (clk_get_freq(clk, &sc->timer0_freq) != 0) { device_printf(dev, "Cannot get clock source frequency\n"); return (ENXIO); } } + if (bootverbose) { + device_printf(sc->sc_dev, "clock: hz=%d stathz = %d\n", hz, + stathz); + } + #if defined(__arm__) a10_timer_eventtimer_setup(sc); - arm_set_delay(a10_timer_delay, sc); - a10_timer_timecounter.tc_priv = sc; - a10_timer_timecounter.tc_frequency = sc->timer0_freq; - tc_init(&a10_timer_timecounter); + a10_timer_timecounter_setup(sc); #elif defined(__aarch64__) a23_timer_timecounter_setup(sc); #endif - if (bootverbose) { - device_printf(sc->sc_dev, "clock: hz=%d stathz = %d\n", hz, stathz); - - device_printf(sc->sc_dev, "event timer clock frequency %ju\n", - sc->timer0_freq); - device_printf(sc->sc_dev, "timecounter clock frequency %jd\n", - a10_timer_timecounter.tc_frequency); - } - return (0); } @@ -311,6 +300,11 @@ a10_timer_eventtimer_setup(struct a10_timer_softc *sc) sc->et.et_stop = a10_timer_timer_stop; sc->et.et_priv = sc; et_register(&sc->et); + + if (bootverbose) { + device_printf(sc->sc_dev, "event timer clock frequency %ju\n", + sc->timer0_freq); + } } static int @@ -368,7 +362,7 @@ a10_timer_timer_stop(struct eventtimer *et) return (0); } -#endif +#endif /* __arm__ */ /* * Timecounter functions for A23 and above @@ -400,6 +394,11 @@ a23_timer_timecounter_setup(struct a10_timer_softc *sc) a23_timer_timecounter.tc_priv = sc; a23_timer_timecounter.tc_frequency = sc->timer0_freq; tc_init(&a23_timer_timecounter); + + if (bootverbose) { + device_printf(sc->sc_dev, "timecounter clock frequency %jd\n", + a23_timer_timecounter.tc_frequency); + } } static u_int @@ -416,14 +415,15 @@ a23_timer_get_timecount(struct timecounter *tc) /* Counter count backwards */ return (~0u - val); } -#endif +#endif /* __aarch64__ */ /* * Timecounter functions for A10 and A13, using the 64 bits counter */ +#if defined(__arm__) static uint64_t -timer_read_counter64(struct a10_timer_softc *sc) +a10_timer_read_counter64(struct a10_timer_softc *sc) { uint32_t lo, hi; @@ -438,30 +438,42 @@ timer_read_counter64(struct a10_timer_softc *sc) return (((uint64_t)hi << 32) | lo); } -#if defined(__arm__) static void a10_timer_delay(int usec, void *arg) { struct a10_timer_softc *sc = arg; uint64_t end, now; - now = timer_read_counter64(sc); + now = a10_timer_read_counter64(sc); end = now + (sc->timer0_freq / 1000000) * (usec + 1); while (now < end) - now = timer_read_counter64(sc); + now = a10_timer_read_counter64(sc); } -#endif static u_int a10_timer_get_timecount(struct timecounter *tc) { - if (tc->tc_priv == NULL) return (0); - return ((u_int)timer_read_counter64(tc->tc_priv)); + return ((u_int)a10_timer_read_counter64(tc->tc_priv)); +} + +static void +a10_timer_timecounter_setup(struct a10_timer_softc *sc) +{ + arm_set_delay(a10_timer_delay, sc); + a10_timer_timecounter.tc_priv = sc; + a10_timer_timecounter.tc_frequency = sc->timer0_freq; + tc_init(&a10_timer_timecounter); + + if (bootverbose) { + device_printf(sc->sc_dev, "timecounter clock frequency %jd\n", + a10_timer_timecounter.tc_frequency); + } } +#endif /* __arm__ */ static device_method_t a10_timer_methods[] = { DEVMETHOD(device_probe, a10_timer_probe),