1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  PS3 System Manager core.
4  *
5  *  Copyright (C) 2007 Sony Computer Entertainment Inc.
6  *  Copyright 2007 Sony Corp.
7  */
8 
9 #include <linux/kernel.h>
10 #include <linux/export.h>
11 #include <asm/lv1call.h>
12 #include <asm/ps3.h>
13 
14 /**
15  * Staticly linked routines that allow late binding of a loaded sys-manager
16  * module.
17  */
18 
19 static struct ps3_sys_manager_ops ps3_sys_manager_ops;
20 
21 /**
22  * ps3_register_sys_manager_ops - Bind ps3_sys_manager_ops to a module.
23  * @ops: struct ps3_sys_manager_ops.
24  *
25  * To be called from ps3_sys_manager_probe() and ps3_sys_manager_remove() to
26  * register call back ops for power control.  Copies data to the static
27  * variable ps3_sys_manager_ops.
28  */
29 
30 void ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops)
31 {
32 	BUG_ON(!ops);
33 	BUG_ON(!ops->dev);
34 	ps3_sys_manager_ops = ops ? *ops : ps3_sys_manager_ops;
35 }
36 EXPORT_SYMBOL_GPL(ps3_sys_manager_register_ops);
37 
38 void __noreturn ps3_sys_manager_power_off(void)
39 {
40 	if (ps3_sys_manager_ops.power_off)
41 		ps3_sys_manager_ops.power_off(ps3_sys_manager_ops.dev);
42 
43 	ps3_sys_manager_halt();
44 }
45 
46 void __noreturn ps3_sys_manager_restart(void)
47 {
48 	if (ps3_sys_manager_ops.restart)
49 		ps3_sys_manager_ops.restart(ps3_sys_manager_ops.dev);
50 
51 	ps3_sys_manager_halt();
52 }
53 
54 void __noreturn ps3_sys_manager_halt(void)
55 {
56 	pr_emerg("System Halted, OK to turn off power\n");
57 	local_irq_disable();
58 	while (1)
59 		lv1_pause(1);
60 }
61 
62