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