uboot/drivers/watchdog/ftwdt010_wdt.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Watchdog driver for the FTWDT010 Watch Dog Driver
   4 *
   5 * (c) Copyright 2004 Faraday Technology Corp. (www.faraday-tech.com)
   6 * Based on sa1100_wdt.c by Oleg Drokin <green@crimea.edu>
   7 * Based on SoftDog driver by Alan Cox <alan@redhat.com>
   8 *
   9 * Copyright (C) 2011 Andes Technology Corporation
  10 * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
  11 *
  12 * 27/11/2004 Initial release, Faraday.
  13 * 12/01/2011 Port to u-boot, Macpaul Lin.
  14 */
  15
  16#include <common.h>
  17#include <log.h>
  18#include <watchdog.h>
  19#include <asm/io.h>
  20#include <faraday/ftwdt010_wdt.h>
  21
  22/*
  23 * Set the watchdog time interval.
  24 * Counter is 32 bit.
  25 */
  26int ftwdt010_wdt_settimeout(unsigned int timeout)
  27{
  28        unsigned int reg;
  29
  30        struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE;
  31
  32        debug("Activating WDT..\n");
  33
  34        /* Check if disabled */
  35        if (readl(&wd->wdcr) & ~FTWDT010_WDCR_ENABLE) {
  36                printf("sorry, watchdog is disabled\n");
  37                return -1;
  38        }
  39
  40        /*
  41         * In a 66MHz system,
  42         * if you set WDLOAD as 0x03EF1480 (66000000)
  43         * the reset timer is 1 second.
  44         */
  45        reg = FTWDT010_WDLOAD(timeout * FTWDT010_TIMEOUT_FACTOR);
  46
  47        writel(reg, &wd->wdload);
  48
  49        return 0;
  50}
  51
  52void ftwdt010_wdt_reset(void)
  53{
  54        struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE;
  55
  56        /* clear control register */
  57        writel(0, &wd->wdcr);
  58
  59        /* Write Magic number */
  60        writel(FTWDT010_WDRESTART_MAGIC, &wd->wdrestart);
  61
  62        /* Enable WDT */
  63        writel((FTWDT010_WDCR_RST | FTWDT010_WDCR_ENABLE), &wd->wdcr);
  64}
  65
  66void ftwdt010_wdt_disable(void)
  67{
  68        struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE;
  69
  70        debug("Deactivating WDT..\n");
  71
  72        /*
  73         * It was defined with CONFIG_WATCHDOG_NOWAYOUT in Linux
  74         *
  75         * Shut off the timer.
  76         * Lock it in if it's a module and we defined ...NOWAYOUT
  77         */
  78        writel(0, &wd->wdcr);
  79}
  80
  81#if defined(CONFIG_HW_WATCHDOG)
  82void hw_watchdog_reset(void)
  83{
  84        ftwdt010_wdt_reset();
  85}
  86
  87void hw_watchdog_init(void)
  88{
  89        /* set timer in ms */
  90        ftwdt010_wdt_settimeout(CONFIG_FTWDT010_HW_TIMEOUT * 1000);
  91}
  92#endif
  93