18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
58c2ecf20Sopenharmony_ci * Author: Fuxin Zhang, zhangfx@lemote.com
68c2ecf20Sopenharmony_ci * Copyright (C) 2009 Lemote, Inc.
78c2ecf20Sopenharmony_ci * Author: Zhangjin Wu, wuzhangjin@gmail.com
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#include <linux/init.h>
108c2ecf20Sopenharmony_ci#include <linux/pm.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <asm/idle.h>
138c2ecf20Sopenharmony_ci#include <asm/reboot.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <loongson.h>
168c2ecf20Sopenharmony_ci#include <boot_param.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistatic void loongson_restart(char *command)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci	fw_restart();
248c2ecf20Sopenharmony_ci	while (1) {
258c2ecf20Sopenharmony_ci		if (cpu_wait)
268c2ecf20Sopenharmony_ci			cpu_wait();
278c2ecf20Sopenharmony_ci	}
288c2ecf20Sopenharmony_ci}
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic void loongson_poweroff(void)
318c2ecf20Sopenharmony_ci{
328c2ecf20Sopenharmony_ci	void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	fw_poweroff();
358c2ecf20Sopenharmony_ci	while (1) {
368c2ecf20Sopenharmony_ci		if (cpu_wait)
378c2ecf20Sopenharmony_ci			cpu_wait();
388c2ecf20Sopenharmony_ci	}
398c2ecf20Sopenharmony_ci}
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistatic void loongson_halt(void)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	pr_notice("\n\n** You can safely turn off the power now **\n\n");
448c2ecf20Sopenharmony_ci	while (1) {
458c2ecf20Sopenharmony_ci		if (cpu_wait)
468c2ecf20Sopenharmony_ci			cpu_wait();
478c2ecf20Sopenharmony_ci	}
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic int __init mips_reboot_setup(void)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	_machine_restart = loongson_restart;
538c2ecf20Sopenharmony_ci	_machine_halt = loongson_halt;
548c2ecf20Sopenharmony_ci	pm_power_off = loongson_poweroff;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	return 0;
578c2ecf20Sopenharmony_ci}
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ciarch_initcall(mips_reboot_setup);
60