summaryrefslogtreecommitdiff
path: root/board/ssv/common/wd_pio.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/ssv/common/wd_pio.c')
-rw-r--r--board/ssv/common/wd_pio.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/board/ssv/common/wd_pio.c b/board/ssv/common/wd_pio.c
new file mode 100644
index 0000000..3215ac9
--- /dev/null
+++ b/board/ssv/common/wd_pio.c
@@ -0,0 +1,160 @@
+/*
+ * (C) Copyright 2004, Li-Pro.Net <www.li-pro.net>
+ * Stephan Linz <linz@li-pro.net>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <nios.h>
+#include <nios-io.h>
+
+#if defined(CONFIG_HW_WATCHDOG)
+
+#if !defined(CONFIG_HW_WDENA_BASE)
+#error "*** CONFIG_HW_WDENA_BASE not defined ***"
+#if !defined(CONFIG_HW_WDENA_BIT)
+#error "*** CONFIG_HW_WDENA_BIT not defined ***"
+#endif
+#endif
+
+#if !defined(CONFIG_HW_WDTOG_BASE)
+#error "*** CONFIG_HW_WDTOG_BASE not defined ***"
+#if !defined(CONFIG_HW_WDTOG_BIT)
+#error "*** CONFIG_HW_WDTOG_BIT not defined ***"
+#endif
+#endif
+
+#ifdef CONFIG_HW_WDPORT_WRONLY /* emulate read access */
+static unsigned __wd_ena_pio_portval = 0;
+#endif
+
+#define WD_PIO_INIT_DONE(V) ((V) & (1 << CONFIG_HW_WDENA_BIT))
+
+void ssv_wd_pio_init(void)
+{
+ nios_pio_t *ena_piop = (nios_pio_t*)CONFIG_HW_WDENA_BASE;
+ nios_pio_t *trg_piop = (nios_pio_t*)CONFIG_HW_WDTOG_BASE;
+
+ trg_piop->data &= ~(1 << CONFIG_HW_WDTOG_BIT);
+
+#ifdef CONFIG_HW_WDPORT_WRONLY /* emulate read access */
+
+ __wd_ena_pio_portval |= (1 << CONFIG_HW_WDENA_BIT);
+ ena_piop->data = __wd_ena_pio_portval;
+
+#else /* !CONFIG_HW_WDPORT_WRONLY */
+
+ trg_piop->direction |= (1 << CONFIG_HW_WDTOG_BIT);
+
+ ena_piop->data |= (1 << CONFIG_HW_WDENA_BIT);
+ ena_piop->direction |= (1 << CONFIG_HW_WDENA_BIT);
+
+#endif /* CONFIG_HW_WDPORT_WRONLY */
+}
+
+void ssv_wd_pio_done(void)
+{
+ nios_pio_t *piop = (nios_pio_t*)CONFIG_HW_WDENA_BASE;
+
+#ifdef CONFIG_HW_WDPORT_WRONLY /* emulate read access */
+
+ __wd_ena_pio_portval &= ~(1 << CONFIG_HW_WDENA_BIT);
+ piop->data = __wd_ena_pio_portval;
+
+#else /* !CONFIG_HW_WDPORT_WRONLY */
+
+ piop->data &= ~(1 << CONFIG_HW_WDENA_BIT);
+
+#endif /* CONFIG_HW_WDPORT_WRONLY */
+}
+
+void ssv_wd_pio_reset(void)
+{
+ nios_pio_t *trg_piop = (nios_pio_t*)CONFIG_HW_WDTOG_BASE;
+
+#ifdef CONFIG_HW_WDPORT_WRONLY
+ if (WD_PIO_INIT_DONE(__wd_ena_pio_portval))
+#else
+ nios_pio_t *ena_piop = (nios_pio_t*)CONFIG_HW_WDENA_BASE;
+
+ if (WD_PIO_INIT_DONE(ena_piop->data))
+#endif
+ {
+ trg_piop->data |= (1 << CONFIG_HW_WDTOG_BIT);
+ trg_piop->data &= ~(1 << CONFIG_HW_WDTOG_BIT);
+ }
+}
+
+void hw_watchdog_reset(void)
+{
+ int re_enable = disable_interrupts ();
+
+ ssv_wd_pio_reset();
+ if (re_enable)
+ enable_interrupts ();
+}
+
+#if (CONFIG_COMMANDS & CFG_CMD_BSP)
+int do_wd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ nios_pio_t *ena_piop = (nios_pio_t*)CONFIG_HW_WDENA_BASE;
+
+ switch (argc)
+ {
+ case 1:
+ printf ("Watchdog timer status is %s\n",
+#ifdef CONFIG_HW_WDPORT_WRONLY
+ WD_PIO_INIT_DONE(__wd_ena_pio_portval)
+#else
+ WD_PIO_INIT_DONE(ena_piop->data)
+#endif
+ ? "on" : "off");
+ return 0;
+ case 2:
+ if (!strcmp(argv[1],"on"))
+ {
+ ssv_wd_pio_init();
+ printf("Watchdog timer now is on\n");
+ return 0;
+ }
+ else if (!strcmp(argv[1],"off"))
+ {
+ ssv_wd_pio_done();
+ printf("Watchdog timer now is off\n");
+ return 0;
+ }
+ break;
+ default:
+ break;
+ }
+ printf ("Usage:\n%s\n", cmdtp->usage);
+ return 1;
+}
+
+U_BOOT_CMD(
+ wd, 2, 1, do_wd,
+ "wd - check and set watchdog\n",
+ "on - switch watchDog on\n"
+ "wd off - switch watchdog off\n"
+ "wd - print current status\n"
+);
+#endif /* CFG_CMD_BSP */
+#endif /* CONFIG_HW_WATCHDOG */