xref: /OK3568_Linux_fs/kernel/arch/mips/loongson32/common/reset.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@gmail.com>
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/io.h>
7*4882a593Smuzhiyun #include <linux/pm.h>
8*4882a593Smuzhiyun #include <linux/sizes.h>
9*4882a593Smuzhiyun #include <asm/idle.h>
10*4882a593Smuzhiyun #include <asm/reboot.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <loongson1.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun static void __iomem *wdt_reg_base;
15*4882a593Smuzhiyun 
ls1x_halt(void)16*4882a593Smuzhiyun static void ls1x_halt(void)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun 	while (1) {
19*4882a593Smuzhiyun 		if (cpu_wait)
20*4882a593Smuzhiyun 			cpu_wait();
21*4882a593Smuzhiyun 	}
22*4882a593Smuzhiyun }
23*4882a593Smuzhiyun 
ls1x_restart(char * command)24*4882a593Smuzhiyun static void ls1x_restart(char *command)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	__raw_writel(0x1, wdt_reg_base + WDT_EN);
27*4882a593Smuzhiyun 	__raw_writel(0x1, wdt_reg_base + WDT_TIMER);
28*4882a593Smuzhiyun 	__raw_writel(0x1, wdt_reg_base + WDT_SET);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	ls1x_halt();
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun 
ls1x_power_off(void)33*4882a593Smuzhiyun static void ls1x_power_off(void)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	ls1x_halt();
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun 
ls1x_reboot_setup(void)38*4882a593Smuzhiyun static int __init ls1x_reboot_setup(void)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	wdt_reg_base = ioremap(LS1X_WDT_BASE, (SZ_4 + SZ_8));
41*4882a593Smuzhiyun 	if (!wdt_reg_base)
42*4882a593Smuzhiyun 		panic("Failed to remap watchdog registers");
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	_machine_restart = ls1x_restart;
45*4882a593Smuzhiyun 	_machine_halt = ls1x_halt;
46*4882a593Smuzhiyun 	pm_power_off = ls1x_power_off;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	return 0;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun arch_initcall(ls1x_reboot_setup);
52