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