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 ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops * ops)30void 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 ps3_sys_manager_power_off(void)38void __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 ps3_sys_manager_restart(void)46void __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 ps3_sys_manager_halt(void)54void __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