forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
918 B
46 lines
918 B
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* Low-level idle sequences |
|
*/ |
|
|
|
#include <linux/cpu.h> |
|
#include <linux/irqflags.h> |
|
|
|
#include <asm/barrier.h> |
|
#include <asm/cpuidle.h> |
|
#include <asm/cpufeature.h> |
|
#include <asm/sysreg.h> |
|
|
|
/* |
|
* cpu_do_idle() |
|
* |
|
* Idle the processor (wait for interrupt). |
|
* |
|
* If the CPU supports priority masking we must do additional work to |
|
* ensure that interrupts are not masked at the PMR (because the core will |
|
* not wake up if we block the wake up signal in the interrupt controller). |
|
*/ |
|
void noinstr cpu_do_idle(void) |
|
{ |
|
struct arm_cpuidle_irq_context context; |
|
|
|
arm_cpuidle_save_irq_context(&context); |
|
|
|
dsb(sy); |
|
wfi(); |
|
|
|
arm_cpuidle_restore_irq_context(&context); |
|
} |
|
|
|
/* |
|
* This is our default idle handler. |
|
*/ |
|
void noinstr arch_cpu_idle(void) |
|
{ |
|
/* |
|
* This should do all the clock switching and wait for interrupt |
|
* tricks |
|
*/ |
|
cpu_do_idle(); |
|
raw_local_irq_enable(); |
|
}
|
|
|