xref: /openbmc/u-boot/drivers/watchdog/s5p_wdt.c (revision bcc05c7a)
1 /*
2  * Copyright (C) 2012 Samsung Electronics
3  * Minkyu Kang <mk7.kang@samsung.com>
4  *
5  * SPDX-License-Identifier:	GPL-2.0+
6  */
7 
8 #include <common.h>
9 #include <asm/io.h>
10 #include <asm/arch/watchdog.h>
11 
12 #define PRESCALER_VAL 255
13 
14 void wdt_stop(void)
15 {
16 	struct s5p_watchdog *wdt =
17 		(struct s5p_watchdog *)samsung_get_base_watchdog();
18 	unsigned int wtcon;
19 
20 	wtcon = readl(&wdt->wtcon);
21 	wtcon &= ~(WTCON_EN | WTCON_INT | WTCON_RESET);
22 
23 	writel(wtcon, &wdt->wtcon);
24 }
25 
26 void wdt_start(unsigned int timeout)
27 {
28 	struct s5p_watchdog *wdt =
29 		(struct s5p_watchdog *)samsung_get_base_watchdog();
30 	unsigned int wtcon;
31 
32 	wdt_stop();
33 
34 	wtcon = readl(&wdt->wtcon);
35 	wtcon |= (WTCON_EN | WTCON_CLK(WTCON_CLK_128));
36 	wtcon &= ~WTCON_INT;
37 	wtcon |= WTCON_RESET;
38 	wtcon |= WTCON_PRESCALER(PRESCALER_VAL);
39 
40 	writel(timeout, &wdt->wtdat);
41 	writel(timeout, &wdt->wtcnt);
42 	writel(wtcon, &wdt->wtcon);
43 }
44