Blame view

kernel/linux-rt-4.4.41/arch/mips/loongson64/common/reset.c 1.9 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  /*
   * This program is free software; you can redistribute	it and/or modify it
   * under  the terms of	the GNU General	 Public License as published by the
   * Free Software Foundation;  either version 2 of the  License, or (at your
   * option) any later version.
   *
   * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
   * Author: Fuxin Zhang, zhangfx@lemote.com
   * Copyright (C) 2009 Lemote, Inc.
   * Author: Zhangjin Wu, wuzhangjin@gmail.com
   */
  #include <linux/init.h>
  #include <linux/pm.h>
  
  #include <asm/idle.h>
  #include <asm/reboot.h>
  
  #include <loongson.h>
  #include <boot_param.h>
  
  static inline void loongson_reboot(void)
  {
  #ifndef CONFIG_CPU_JUMP_WORKAROUNDS
  	((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
  #else
  	void (*func)(void);
  
  	func = (void *)ioremap_nocache(LOONGSON_BOOT_BASE, 4);
  
  	__asm__ __volatile__(
  	"	.set	noat						
  "
  	"	jr	%[func]						
  "
  	"	.set	at						
  "
  	: /* No outputs */
  	: [func] "r" (func));
  #endif
  }
  
  static void loongson_restart(char *command)
  {
  #ifndef CONFIG_LEFI_FIRMWARE_INTERFACE
  	/* do preparation for reboot */
  	mach_prepare_reboot();
  
  	/* reboot via jumping to boot base address */
  	loongson_reboot();
  #else
  	void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
  
  	fw_restart();
  	while (1) {
  		if (cpu_wait)
  			cpu_wait();
  	}
  #endif
  }
  
  static void loongson_poweroff(void)
  {
  #ifndef CONFIG_LEFI_FIRMWARE_INTERFACE
  	mach_prepare_shutdown();
  	unreachable();
  #else
  	void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
  
  	fw_poweroff();
  	while (1) {
  		if (cpu_wait)
  			cpu_wait();
  	}
  #endif
  }
  
  static void loongson_halt(void)
  {
  	pr_notice("
  
  ** You can safely turn off the power now **
  
  ");
  	while (1) {
  		if (cpu_wait)
  			cpu_wait();
  	}
  }
  
  static int __init mips_reboot_setup(void)
  {
  	_machine_restart = loongson_restart;
  	_machine_halt = loongson_halt;
  	pm_power_off = loongson_poweroff;
  
  	return 0;
  }
  
  arch_initcall(mips_reboot_setup);