162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * PS3 System Manager core. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2007 Sony Computer Entertainment Inc. 662306a36Sopenharmony_ci * Copyright 2007 Sony Corp. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/export.h> 1162306a36Sopenharmony_ci#include <asm/lv1call.h> 1262306a36Sopenharmony_ci#include <asm/ps3.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/** 1562306a36Sopenharmony_ci * Staticly linked routines that allow late binding of a loaded sys-manager 1662306a36Sopenharmony_ci * module. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic struct ps3_sys_manager_ops ps3_sys_manager_ops; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/** 2262306a36Sopenharmony_ci * ps3_register_sys_manager_ops - Bind ps3_sys_manager_ops to a module. 2362306a36Sopenharmony_ci * @ops: struct ps3_sys_manager_ops. 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * To be called from ps3_sys_manager_probe() and ps3_sys_manager_remove() to 2662306a36Sopenharmony_ci * register call back ops for power control. Copies data to the static 2762306a36Sopenharmony_ci * variable ps3_sys_manager_ops. 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_civoid ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci BUG_ON(!ops); 3362306a36Sopenharmony_ci BUG_ON(!ops->dev); 3462306a36Sopenharmony_ci ps3_sys_manager_ops = *ops; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(ps3_sys_manager_register_ops); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_civoid __noreturn ps3_sys_manager_power_off(void) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci if (ps3_sys_manager_ops.power_off) 4162306a36Sopenharmony_ci ps3_sys_manager_ops.power_off(ps3_sys_manager_ops.dev); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci ps3_sys_manager_halt(); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_civoid __noreturn ps3_sys_manager_restart(void) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci if (ps3_sys_manager_ops.restart) 4962306a36Sopenharmony_ci ps3_sys_manager_ops.restart(ps3_sys_manager_ops.dev); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci ps3_sys_manager_halt(); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_civoid __noreturn ps3_sys_manager_halt(void) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci pr_emerg("System Halted, OK to turn off power\n"); 5762306a36Sopenharmony_ci local_irq_disable(); 5862306a36Sopenharmony_ci while (1) 5962306a36Sopenharmony_ci lv1_pause(1); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 62