Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/sunxi ensure LOSC is configured for external clock



details:   https://anonhg.NetBSD.org/src/rev/d1c694d79a3e
branches:  trunk
changeset: 840198:d1c694d79a3e
user:      tnn <tnn%NetBSD.org@localhost>
date:      Wed Mar 27 16:38:49 2019 +0000

description:
ensure LOSC is configured for external clock

diffstat:

 sys/arch/arm/sunxi/sunxi_timer.c |  24 ++++++++++++++++++++++--
 1 files changed, 22 insertions(+), 2 deletions(-)

diffs (63 lines):

diff -r c417cf898c25 -r d1c694d79a3e sys/arch/arm/sunxi/sunxi_timer.c
--- a/sys/arch/arm/sunxi/sunxi_timer.c  Wed Mar 27 16:16:43 2019 +0000
+++ b/sys/arch/arm/sunxi/sunxi_timer.c  Wed Mar 27 16:38:49 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_timer.c,v 1.5 2019/03/27 06:56:19 tnn Exp $ */
+/* $NetBSD: sunxi_timer.c,v 1.6 2019/03/27 16:38:49 tnn Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_timer.c,v 1.5 2019/03/27 06:56:19 tnn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_timer.c,v 1.6 2019/03/27 16:38:49 tnn Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -78,6 +78,19 @@
 #define        TMR4_INTV_VALUE_REG     0x54
 #define        TMR4_CURNT_VALUE_REG    0x58
 
+/* Control registers */
+#define        AVS_CNT_CTL_REG         0x80
+#define        AVS_CNT0_REG            0x84
+#define        AVS_CNT1_REG            0x88
+#define        AVS_CNT_DIV_REG         0x8c
+#define        WDOG_CTRL_REG           0x90
+#define        WDOG_MODE_REG           0x94
+#define        LOSC_CTRL_REG           0x100
+#define         LOSC_CTRL_KEY_FIELD    __BITS(31,16)
+#define         LOSC_CTRL_KEY_FIELD_V  0x16aa
+#define  LOSC_CTRL_OSC32K_AUTO_SWT_EN  __BIT(14)
+#define         LOSC_CTRL_OSC32K_SEL   __BIT(0)
+
 static const char * const compatible[] = {
        "allwinner,sun4i-a10-timer",
        NULL
@@ -179,6 +192,7 @@
        bus_addr_t addr;
        bus_size_t size;
        u_int ticks;
+       u_int reg;
 
        if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
                aprint_error(": couldn't get registers\n");
@@ -238,10 +252,16 @@
         * LOSC is optional to implement in hardware.
         * Make sure it ticks before registering it.
         */
+       reg = __SHIFTIN(LOSC_CTRL_KEY_FIELD_V, LOSC_CTRL_KEY_FIELD) |
+           LOSC_CTRL_OSC32K_AUTO_SWT_EN |
+           LOSC_CTRL_OSC32K_SEL;
+       TIMER_WRITE(sc, LOSC_CTRL_REG, reg);
        ticks = sunxi_timer_get_timecount_losc(tc_losc);
        delay(100);
        if (ticks != sunxi_timer_get_timecount_losc(tc_losc))
                tc_init(tc_losc);
+       else
+               TIMER_WRITE(sc, LOSC_CTRL_REG, reg & ~LOSC_CTRL_OSC32K_SEL);
 
        /* Use this as the OS timer in UP configurations */
        if (!arm_has_mpext_p) {



Home | Main Index | Thread Index | Old Index