Module Name: src
Committed By: jmcneill
Date: Sat Nov 21 00:54:57 UTC 2015
Modified Files:
src/sys/arch/arm/amlogic: amlogic_board.c amlogic_io.c amlogic_var.h
Log Message:
Add watchdog timer support.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/arm/amlogic/amlogic_board.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/amlogic/amlogic_io.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/amlogic/amlogic_var.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/amlogic/amlogic_board.c
diff -u src/sys/arch/arm/amlogic/amlogic_board.c:1.14 src/sys/arch/arm/amlogic/amlogic_board.c:1.15
--- src/sys/arch/arm/amlogic/amlogic_board.c:1.14 Sat Aug 8 10:51:40 2015
+++ src/sys/arch/arm/amlogic/amlogic_board.c Sat Nov 21 00:54:57 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_board.c,v 1.14 2015/08/08 10:51:40 jmcneill Exp $ */
+/* $NetBSD: amlogic_board.c,v 1.15 2015/11/21 00:54:57 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -29,13 +29,16 @@
#include "opt_amlogic.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.14 2015/08/08 10:51:40 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.15 2015/11/21 00:54:57 jmcneill Exp $");
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/cpu.h>
#include <sys/device.h>
+#include <sys/wdog.h>
+
+#include <dev/sysmon/sysmonvar.h>
#include <uvm/uvm_extern.h>
@@ -46,8 +49,22 @@ __KERNEL_RCSID(0, "$NetBSD: amlogic_boar
#include <arm/amlogic/amlogic_crureg.h>
#include <arm/amlogic/amlogic_var.h>
+#define AMLOGIC_EE_WDOG_PERIOD_DEFAULT 8
+#define AMLOGIC_EE_WDOG_PERIOD_MAX 8
+#define AMLOGIC_EE_WDOG_TICKS_PER_SEC 7812
+
bus_space_handle_t amlogic_core_bsh;
+static int amlogic_ee_wdog_setmode(struct sysmon_wdog *);
+static int amlogic_ee_wdog_tickle(struct sysmon_wdog *);
+
+static struct sysmon_wdog amlogic_ee_wdog = {
+ .smw_name = "EE-watchdog",
+ .smw_setmode = amlogic_ee_wdog_setmode,
+ .smw_tickle = amlogic_ee_wdog_tickle,
+ .smw_period = AMLOGIC_EE_WDOG_PERIOD_DEFAULT
+};
+
struct arm32_bus_dma_tag amlogic_dma_tag = {
_BUS_DMAMAP_FUNCS,
_BUS_DMAMEM_FUNCS,
@@ -223,6 +240,44 @@ amlogic_rng_init(void)
}
void
+amlogic_wdog_init(void)
+{
+ sysmon_wdog_register(&amlogic_ee_wdog);
+}
+
+static int
+amlogic_ee_wdog_setmode(struct sysmon_wdog *smw)
+{
+ if ((smw->smw_mode & WDOG_MODE_MASK) == WDOG_MODE_DISARMED) {
+ CBUS_WRITE(WATCHDOG_RESET_REG, 0);
+ CBUS_SET_CLEAR(WATCHDOG_TC_REG, 0, WATCHDOG_TC_ENABLE);
+ return 0;
+ }
+
+ if (smw->smw_period == WDOG_PERIOD_DEFAULT) {
+ amlogic_ee_wdog.smw_period = AMLOGIC_EE_WDOG_PERIOD_DEFAULT;
+ } else if (smw->smw_period == 0 ||
+ smw->smw_period > AMLOGIC_EE_WDOG_PERIOD_MAX) {
+ return EINVAL;
+ } else {
+ amlogic_ee_wdog.smw_period = smw->smw_period;
+ }
+ u_int tcnt = amlogic_ee_wdog.smw_period * AMLOGIC_EE_WDOG_TICKS_PER_SEC;
+ CBUS_WRITE(WATCHDOG_RESET_REG, 0);
+ CBUS_WRITE(WATCHDOG_TC_REG, WATCHDOG_TC_CPUS | WATCHDOG_TC_ENABLE |
+ __SHIFTIN(tcnt, WATCHDOG_TC_TCNT));
+
+ return 0;
+}
+
+static int
+amlogic_ee_wdog_tickle(struct sysmon_wdog *smw)
+{
+ CBUS_WRITE(WATCHDOG_RESET_REG, 0);
+ return 0;
+}
+
+void
amlogic_sdhc_init(void)
{
/* enable SDHC clk */
Index: src/sys/arch/arm/amlogic/amlogic_io.c
diff -u src/sys/arch/arm/amlogic/amlogic_io.c:1.12 src/sys/arch/arm/amlogic/amlogic_io.c:1.13
--- src/sys/arch/arm/amlogic/amlogic_io.c:1.12 Sat Aug 8 14:01:44 2015
+++ src/sys/arch/arm/amlogic/amlogic_io.c Sat Nov 21 00:54:57 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_io.c,v 1.12 2015/08/08 14:01:44 jmcneill Exp $ */
+/* $NetBSD: amlogic_io.c,v 1.13 2015/11/21 00:54:57 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
#include "opt_amlogic.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amlogic_io.c,v 1.12 2015/08/08 14:01:44 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amlogic_io.c,v 1.13 2015/11/21 00:54:57 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -99,6 +99,7 @@ amlogicio_attach(device_t parent, device
aprint_naive("\n");
aprint_normal("\n");
+ amlogic_wdog_init();
amlogic_usbphy_init(0);
amlogic_usbphy_init(1);
Index: src/sys/arch/arm/amlogic/amlogic_var.h
diff -u src/sys/arch/arm/amlogic/amlogic_var.h:1.11 src/sys/arch/arm/amlogic/amlogic_var.h:1.12
--- src/sys/arch/arm/amlogic/amlogic_var.h:1.11 Tue Aug 4 01:23:07 2015
+++ src/sys/arch/arm/amlogic/amlogic_var.h Sat Nov 21 00:54:57 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_var.h,v 1.11 2015/08/04 01:23:07 jmcneill Exp $ */
+/* $NetBSD: amlogic_var.h,v 1.12 2015/11/21 00:54:57 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -59,6 +59,7 @@ void amlogic_bootstrap(void);
void amlogic_cpufreq_bootstrap(void);
void amlogic_cpufreq_init(void);
+void amlogic_wdog_init(void);
void amlogic_usbphy_init(int);
void amlogic_eth_init(void);
void amlogic_rng_init(void);