~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/drivers/watchdog/ftwdt010_wdt.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Watchdog driver for the FTWDT010 Watch Dog Driver
 
3
 *
 
4
 * (c) Copyright 2004 Faraday Technology Corp. (www.faraday-tech.com)
 
5
 * Based on sa1100_wdt.c by Oleg Drokin <green@crimea.edu>
 
6
 * Based on SoftDog driver by Alan Cox <alan@redhat.com>
 
7
 *
 
8
 * Copyright (C) 2011 Andes Technology Corporation
 
9
 * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
 
10
 *
 
11
 * SPDX-License-Identifier:     GPL-2.0+
 
12
 *
 
13
 * 27/11/2004 Initial release, Faraday.
 
14
 * 12/01/2011 Port to u-boot, Macpaul Lin.
 
15
 */
 
16
 
 
17
#include <common.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
 */
 
26
int 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
 
 
52
void 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
 
 
66
void 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)
 
82
void hw_watchdog_reset(void)
 
83
{
 
84
        ftwdt010_wdt_reset();
 
85
}
 
86
 
 
87
void hw_watchdog_init(void)
 
88
{
 
89
        /* set timer in ms */
 
90
        ftwdt010_wdt_settimeout(CONFIG_FTWDT010_HW_TIMEOUT * 1000);
 
91
}
 
92
#endif