zephyr/soc/nordic/common/vpr/soc_idle.c

35 lines
722 B
C
Raw Normal View History

/*
* Copyright (C) 2024 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/irq.h>
#include <zephyr/sys/barrier.h>
#include <zephyr/tracing/tracing.h>
/*
* Due to a HW issue, VPR requires MSTATUS.MIE to be enabled when entering sleep.
* Otherwise it would not wake up.
*/
void arch_cpu_idle(void)
{
sys_trace_idle();
barrier_dsync_fence_full();
irq_unlock(MSTATUS_IEN);
__asm__ volatile("wfi");
}
void arch_cpu_atomic_idle(unsigned int key)
{
sys_trace_idle();
barrier_dsync_fence_full();
irq_unlock(MSTATUS_IEN);
__asm__ volatile("wfi");
/* Disable interrupts if needed. */
__asm__ volatile ("csrc mstatus, %0"
:
: "r" (~key & MSTATUS_IEN)
: "memory");
}