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);