1*cd71b1d5SPaul Burton // SPDX-License-Identifier: GPL-2.0+
2*cd71b1d5SPaul Burton /*
3*cd71b1d5SPaul Burton  * JZ4780 common routines
4*cd71b1d5SPaul Burton  *
5*cd71b1d5SPaul Burton  * Copyright (c) 2013 Imagination Technologies
6*cd71b1d5SPaul Burton  * Author: Paul Burton <paul.burton@imgtec.com>
7*cd71b1d5SPaul Burton  */
8*cd71b1d5SPaul Burton 
9*cd71b1d5SPaul Burton #include <config.h>
10*cd71b1d5SPaul Burton #include <common.h>
11*cd71b1d5SPaul Burton #include <asm/io.h>
12*cd71b1d5SPaul Burton #include <mach/jz4780.h>
13*cd71b1d5SPaul Burton 
14*cd71b1d5SPaul Burton /* WDT */
15*cd71b1d5SPaul Burton #define WDT_TDR		0x00
16*cd71b1d5SPaul Burton #define WDT_TCER	0x04
17*cd71b1d5SPaul Burton #define WDT_TCNT	0x08
18*cd71b1d5SPaul Burton #define WDT_TCSR	0x0C
19*cd71b1d5SPaul Burton 
20*cd71b1d5SPaul Burton /* Register definition */
21*cd71b1d5SPaul Burton #define WDT_TCSR_PRESCALE_BIT	3
22*cd71b1d5SPaul Burton #define WDT_TCSR_PRESCALE_MASK	(0x7 << WDT_TCSR_PRESCALE_BIT)
23*cd71b1d5SPaul Burton   #define WDT_TCSR_PRESCALE1	(0x0 << WDT_TCSR_PRESCALE_BIT)
24*cd71b1d5SPaul Burton   #define WDT_TCSR_PRESCALE4	(0x1 << WDT_TCSR_PRESCALE_BIT)
25*cd71b1d5SPaul Burton   #define WDT_TCSR_PRESCALE16	(0x2 << WDT_TCSR_PRESCALE_BIT)
26*cd71b1d5SPaul Burton   #define WDT_TCSR_PRESCALE64	(0x3 << WDT_TCSR_PRESCALE_BIT)
27*cd71b1d5SPaul Burton   #define WDT_TCSR_PRESCALE256	(0x4 << WDT_TCSR_PRESCALE_BIT)
28*cd71b1d5SPaul Burton   #define WDT_TCSR_PRESCALE1024	(0x5 << WDT_TCSR_PRESCALE_BIT)
29*cd71b1d5SPaul Burton #define WDT_TCSR_EXT_EN		BIT(2)
30*cd71b1d5SPaul Burton #define WDT_TCSR_RTC_EN		BIT(1)
31*cd71b1d5SPaul Burton #define WDT_TCSR_PCK_EN		BIT(0)
32*cd71b1d5SPaul Burton 
33*cd71b1d5SPaul Burton #define WDT_TCER_TCEN		BIT(0)
34*cd71b1d5SPaul Burton 
35*cd71b1d5SPaul Burton void _machine_restart(void)
36*cd71b1d5SPaul Burton {
37*cd71b1d5SPaul Burton 	void __iomem *wdt_regs = (void __iomem *)WDT_BASE;
38*cd71b1d5SPaul Burton 
39*cd71b1d5SPaul Burton 	/* EXTAL as the timer clock input. */
40*cd71b1d5SPaul Burton 	writew(WDT_TCSR_PRESCALE1 | WDT_TCSR_EXT_EN, wdt_regs + WDT_TCSR);
41*cd71b1d5SPaul Burton 
42*cd71b1d5SPaul Burton 	/* Reset the WDT counter and timeout. */
43*cd71b1d5SPaul Burton 	writew(0, wdt_regs + WDT_TCNT);
44*cd71b1d5SPaul Burton 	writew(0, wdt_regs + WDT_TDR);
45*cd71b1d5SPaul Burton 
46*cd71b1d5SPaul Burton 	jz4780_tcu_wdt_start();
47*cd71b1d5SPaul Burton 
48*cd71b1d5SPaul Burton 	/* WDT start */
49*cd71b1d5SPaul Burton 	writeb(WDT_TCER_TCEN, wdt_regs + WDT_TCER);
50*cd71b1d5SPaul Burton 
51*cd71b1d5SPaul Burton 	for (;;)
52*cd71b1d5SPaul Burton 		;
53*cd71b1d5SPaul Burton }
54