Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/ti Use Timer2 for timecounter, and enable hw mo...



details:   https://anonhg.NetBSD.org/src/rev/b37dc3e179b2
branches:  trunk
changeset: 460538:b37dc3e179b2
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sun Oct 27 17:59:21 2019 +0000

description:
Use Timer2 for timecounter, and enable hw module.

diffstat:

 sys/arch/arm/ti/ti_omaptimer.c |  70 ++++++++++++++++++++++++++++++++++-------
 1 files changed, 58 insertions(+), 12 deletions(-)

diffs (110 lines):

diff -r 1f77322b4003 -r b37dc3e179b2 sys/arch/arm/ti/ti_omaptimer.c
--- a/sys/arch/arm/ti/ti_omaptimer.c    Sun Oct 27 17:58:42 2019 +0000
+++ b/sys/arch/arm/ti/ti_omaptimer.c    Sun Oct 27 17:59:21 2019 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: ti_omaptimer.c,v 1.1 2017/10/26 01:16:32 jakllsch Exp $        */
+/*     $NetBSD: ti_omaptimer.c,v 1.2 2019/10/27 17:59:21 jmcneill Exp $        */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ti_omaptimer.c,v 1.1 2017/10/26 01:16:32 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ti_omaptimer.c,v 1.2 2019/10/27 17:59:21 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -15,6 +15,23 @@
 
 #include <dev/fdt/fdtvar.h>
 
+#include <arm/ti/ti_prcm.h>
+
+#define        TIMER_IRQENABLE_SET     0x2c
+#define        TIMER_IRQENABLE_CLR     0x30
+#define         MAT_EN_FLAG            __BIT(0)
+#define         OVF_EN_FLAG            __BIT(1)
+#define         TCAR_EN_FLAG           __BIT(2)
+#define        TIMER_TCLR              0x38
+#define         TCLR_ST                __BIT(0)
+#define         TCLR_AR                __BIT(1)
+#define        TIMER_TCRR              0x3c
+#define        TIMER_TLDR              0x40
+
+/* XXX */
+#define        IS_TIMER2(addr) ((addr) == 0x48040000)
+#define        IS_TIMER3(addr) ((addr) == 0x48042000)
+
 static const char * const compatible[] = {
        "ti,am335x-timer-1ms",
        "ti,am335x-timer",
@@ -61,12 +78,16 @@
        
        aprint_normal_dev(sc->sc_dev, "interrupting on %s\n", intrstr);
 
-       uint32_t value;
-       value = (0xffffffff - ((24000000UL / hz) - 1));
-       bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x40, value);
-       bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x3c, value);
-       bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x2c, 2);
-       bus_space_write_4(sc->sc_bst, sc->sc_bsh, 0x38, 3);
+       /* Enable interrupts */
+       bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_IRQENABLE_SET, OVF_EN_FLAG);
+}
+
+static u_int
+omaptimer_get_timecount(struct timecounter *tc)
+{
+       struct omaptimer_softc * const sc = tc->tc_priv;
+
+       return bus_space_read_4(sc->sc_bst, sc->sc_bsh, TIMER_TCRR);
 }
 
 static int
@@ -83,6 +104,7 @@
        struct omaptimer_softc * const sc = device_private(self);
        struct fdt_attach_args * const faa = aux;
        const int phandle = faa->faa_phandle;
+       struct timecounter *tc = &sc->sc_tc;
        bus_addr_t addr;
        bus_size_t size;
 
@@ -107,13 +129,37 @@
                return;
        }
 
+       if (ti_prcm_enable_hwmod(OF_parent(phandle), 0) != 0) {
+               aprint_error(": couldn't enable module\n");
+               return;
+       }
+
        aprint_naive("\n");
        aprint_normal(": Timer\n");
 
-       /* Use this as the OS timer in UP configurations */
-       if (!arm_has_mpext_p && addr == 0x48042000) { /* TIMER3 */
-               timer_softc = sc;
-               arm_fdt_timer_register(omaptimer_cpu_initclocks);
+       if (IS_TIMER2(addr)) {
+               /* Install timecounter */
+               tc->tc_get_timecount = omaptimer_get_timecount;
+               tc->tc_counter_mask = ~0u;
+               tc->tc_frequency = 24000000;
+               tc->tc_name = "Timer2";
+               tc->tc_quality = 200;
+               tc->tc_priv = sc;
+               tc_init(tc);
+       } else if (IS_TIMER3(addr)) {
+               /* Configure the timer */
+               const uint32_t value = (0xffffffff - ((24000000UL / hz) - 1));
+               bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_TLDR, value);
+               bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_TCRR, value);
+               bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_IRQENABLE_CLR, 
+                   MAT_EN_FLAG | OVF_EN_FLAG | TCAR_EN_FLAG);
+               bus_space_write_4(sc->sc_bst, sc->sc_bsh, TIMER_TCLR, TCLR_ST | TCLR_AR);
+
+               /* Use this as the OS timer in UP configurations */
+               if (!arm_has_mpext_p) {
+                       timer_softc = sc;
+                       arm_fdt_timer_register(omaptimer_cpu_initclocks);
+               }
        }
 }
 



Home | Main Index | Thread Index | Old Index