Merge tag 'pm-5.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
[linux-2.6-microblaze.git] / drivers / ps3 / sys-manager-core.c
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;
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