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