18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * PS3 System Manager core. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2007 Sony Computer Entertainment Inc. 68c2ecf20Sopenharmony_ci * Copyright 2007 Sony Corp. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/export.h> 118c2ecf20Sopenharmony_ci#include <asm/lv1call.h> 128c2ecf20Sopenharmony_ci#include <asm/ps3.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/** 158c2ecf20Sopenharmony_ci * Staticly linked routines that allow late binding of a loaded sys-manager 168c2ecf20Sopenharmony_ci * module. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic struct ps3_sys_manager_ops ps3_sys_manager_ops; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci/** 228c2ecf20Sopenharmony_ci * ps3_register_sys_manager_ops - Bind ps3_sys_manager_ops to a module. 238c2ecf20Sopenharmony_ci * @ops: struct ps3_sys_manager_ops. 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * To be called from ps3_sys_manager_probe() and ps3_sys_manager_remove() to 268c2ecf20Sopenharmony_ci * register call back ops for power control. Copies data to the static 278c2ecf20Sopenharmony_ci * variable ps3_sys_manager_ops. 288c2ecf20Sopenharmony_ci */ 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_civoid ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci BUG_ON(!ops); 338c2ecf20Sopenharmony_ci BUG_ON(!ops->dev); 348c2ecf20Sopenharmony_ci ps3_sys_manager_ops = *ops; 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(ps3_sys_manager_register_ops); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_civoid __noreturn ps3_sys_manager_power_off(void) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci if (ps3_sys_manager_ops.power_off) 418c2ecf20Sopenharmony_ci ps3_sys_manager_ops.power_off(ps3_sys_manager_ops.dev); 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci ps3_sys_manager_halt(); 448c2ecf20Sopenharmony_ci} 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_civoid __noreturn ps3_sys_manager_restart(void) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci if (ps3_sys_manager_ops.restart) 498c2ecf20Sopenharmony_ci ps3_sys_manager_ops.restart(ps3_sys_manager_ops.dev); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci ps3_sys_manager_halt(); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_civoid __noreturn ps3_sys_manager_halt(void) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci pr_emerg("System Halted, OK to turn off power\n"); 578c2ecf20Sopenharmony_ci local_irq_disable(); 588c2ecf20Sopenharmony_ci while (1) 598c2ecf20Sopenharmony_ci lv1_pause(1); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 62