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