Commit da48b67c authored by Huacai Chen's avatar Huacai Chen

LoongArch: Cleanup reset routines with new API

Cleanup reset routines by using new do_kernel_power_off() instead of old
pm_power_off(), and then simplify the whole file (reset.c) organization
by inlining some functions. This cleanup also fix a poweroff error if EFI
runtime is disabled.
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 84e76206
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
*/
#ifndef _ASM_REBOOT_H
#define _ASM_REBOOT_H
extern void (*pm_restart)(void);
#endif /* _ASM_REBOOT_H */
...@@ -15,10 +15,16 @@ ...@@ -15,10 +15,16 @@
#include <acpi/reboot.h> #include <acpi/reboot.h>
#include <asm/idle.h> #include <asm/idle.h>
#include <asm/loongarch.h> #include <asm/loongarch.h>
#include <asm/reboot.h>
static void default_halt(void) void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
void machine_halt(void)
{ {
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
local_irq_disable(); local_irq_disable();
clear_csr_ecfg(ECFG0_IM); clear_csr_ecfg(ECFG0_IM);
...@@ -30,18 +36,29 @@ static void default_halt(void) ...@@ -30,18 +36,29 @@ static void default_halt(void)
} }
} }
static void default_poweroff(void) void machine_power_off(void)
{ {
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
do_kernel_power_off();
#ifdef CONFIG_EFI #ifdef CONFIG_EFI
efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL); efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
#endif #endif
while (true) { while (true) {
__arch_cpu_idle(); __arch_cpu_idle();
} }
} }
static void default_restart(void) void machine_restart(char *command)
{ {
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
do_kernel_restart(command);
#ifdef CONFIG_EFI #ifdef CONFIG_EFI
if (efi_capsule_pending(NULL)) if (efi_capsule_pending(NULL))
efi_reboot(REBOOT_WARM, NULL); efi_reboot(REBOOT_WARM, NULL);
...@@ -55,47 +72,3 @@ static void default_restart(void) ...@@ -55,47 +72,3 @@ static void default_restart(void)
__arch_cpu_idle(); __arch_cpu_idle();
} }
} }
void (*pm_restart)(void);
EXPORT_SYMBOL(pm_restart);
void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
void machine_halt(void)
{
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
default_halt();
}
void machine_power_off(void)
{
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
pm_power_off();
}
void machine_restart(char *command)
{
#ifdef CONFIG_SMP
preempt_disable();
smp_send_stop();
#endif
do_kernel_restart(command);
pm_restart();
}
static int __init loongarch_reboot_setup(void)
{
pm_restart = default_restart;
pm_power_off = default_poweroff;
return 0;
}
arch_initcall(loongarch_reboot_setup);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment