18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Author: Huacai Chen, chenhuacai@loongson.cn
48c2ecf20Sopenharmony_ci * Copyright (C) 2020 Loongson Technology Co., Ltd.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci#include <linux/acpi.h>
78c2ecf20Sopenharmony_ci#include <linux/cpu.h>
88c2ecf20Sopenharmony_ci#include <linux/delay.h>
98c2ecf20Sopenharmony_ci#include <linux/efi.h>
108c2ecf20Sopenharmony_ci#include <linux/init.h>
118c2ecf20Sopenharmony_ci#include <linux/pm.h>
128c2ecf20Sopenharmony_ci#include <linux/slab.h>
138c2ecf20Sopenharmony_ci#include <acpi/reboot.h>
148c2ecf20Sopenharmony_ci#include <asm/bootinfo.h>
158c2ecf20Sopenharmony_ci#include <asm/delay.h>
168c2ecf20Sopenharmony_ci#include <asm/idle.h>
178c2ecf20Sopenharmony_ci#include <asm/reboot.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistatic void loongson_restart(void)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci#ifdef CONFIG_EFI
228c2ecf20Sopenharmony_ci	if (efi_capsule_pending(NULL))
238c2ecf20Sopenharmony_ci		efi_reboot(REBOOT_WARM, NULL);
248c2ecf20Sopenharmony_ci	else
258c2ecf20Sopenharmony_ci		efi_reboot(REBOOT_COLD, NULL);
268c2ecf20Sopenharmony_ci#endif
278c2ecf20Sopenharmony_ci	if (!acpi_disabled)
288c2ecf20Sopenharmony_ci		acpi_reboot();
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	while (1) {
318c2ecf20Sopenharmony_ci		__arch_cpu_idle();
328c2ecf20Sopenharmony_ci	}
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic void loongson_poweroff(void)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci#ifdef CONFIG_EFI
388c2ecf20Sopenharmony_ci	efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
398c2ecf20Sopenharmony_ci#endif
408c2ecf20Sopenharmony_ci	while (1) {
418c2ecf20Sopenharmony_ci		__arch_cpu_idle();
428c2ecf20Sopenharmony_ci	}
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic int __init loongarch_reboot_setup(void)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	pm_restart = loongson_restart;
488c2ecf20Sopenharmony_ci	pm_power_off = loongson_poweroff;
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	return 0;
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ciarch_initcall(loongarch_reboot_setup);
54