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 <jmcne...@invisible.ca>
@@ -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 <jmcne...@invisible.ca>
@@ -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 <jmcne...@invisible.ca>
@@ -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);

Reply via email to