diff options
author | ganbold <ganbold@FreeBSD.org> | 2013-08-07 11:07:56 +0000 |
---|---|---|
committer | ganbold <ganbold@FreeBSD.org> | 2013-08-07 11:07:56 +0000 |
commit | 7f7658c9c849266701ae1f8c867a85c62502430c (patch) | |
tree | a8898ea7413e1a5567ca2cde3db8e3bb10df18e7 /sys/arm/allwinner/timer.c | |
parent | 7ddb89a6c3eb91ff20bc13688ba12e639d85f574 (diff) | |
download | FreeBSD-src-7f7658c9c849266701ae1f8c867a85c62502430c.zip FreeBSD-src-7f7658c9c849266701ae1f8c867a85c62502430c.tar.gz |
Bring initial support for Allwinner A20 SoC (Cubieboard2).
Add support for A20 timer.
Correct interrupt offset depending from chip.
Add basic code for CPU configuration module.
For now, add kernel config and dts file
(only FDT blob related problem needs to be solved later in
order to have one kernel for both cubieboard1 and 2).
Approved by: ray@
Diffstat (limited to 'sys/arm/allwinner/timer.c')
-rw-r--r-- | sys/arm/allwinner/timer.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/arm/allwinner/timer.c b/sys/arm/allwinner/timer.c index 49c5f18..fb1d924 100644 --- a/sys/arm/allwinner/timer.c +++ b/sys/arm/allwinner/timer.c @@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include <sys/kdb.h> +#include "a20/a20_cpu_cfg.h" + /** * Timer registers addr * @@ -84,6 +86,7 @@ struct a10_timer_softc { uint32_t sc_period; uint32_t timer0_freq; struct eventtimer et; + uint8_t sc_timer_type; /* 0 for A10, 1 for A20 */ }; int a10_timer_get_timerfreq(struct a10_timer_softc *); @@ -126,6 +129,10 @@ timer_read_counter64(void) { uint32_t lo, hi; + /* In case of A20 get appropriate counter info */ + if (a10_timer_sc->sc_timer_type) + return (a20_read_counter64()); + /* Latch counter, wait for it to be ready to read. */ timer_write_4(a10_timer_sc, CNT64_CTRL_REG, CNT64_RL_EN); while (timer_read_4(a10_timer_sc, CNT64_CTRL_REG) & CNT64_RL_EN) @@ -140,11 +147,18 @@ timer_read_counter64(void) static int a10_timer_probe(device_t dev) { + struct a10_timer_softc *sc; - if (!ofw_bus_is_compatible(dev, "allwinner,sun4i-timer")) + sc = device_get_softc(dev); + + if (ofw_bus_is_compatible(dev, "allwinner,sun4i-timer")) + sc->sc_timer_type = 0; + else if (ofw_bus_is_compatible(dev, "allwinner,sun7i-timer")) + sc->sc_timer_type = 1; + else return (ENXIO); - device_set_desc(dev, "Allwinner A10 timer"); + device_set_desc(dev, "Allwinner A10/A20 timer"); return (BUS_PROBE_DEFAULT); } |