idle.c (918B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Low-level idle sequences 4 */ 5 6#include <linux/cpu.h> 7#include <linux/irqflags.h> 8 9#include <asm/barrier.h> 10#include <asm/cpuidle.h> 11#include <asm/cpufeature.h> 12#include <asm/sysreg.h> 13 14/* 15 * cpu_do_idle() 16 * 17 * Idle the processor (wait for interrupt). 18 * 19 * If the CPU supports priority masking we must do additional work to 20 * ensure that interrupts are not masked at the PMR (because the core will 21 * not wake up if we block the wake up signal in the interrupt controller). 22 */ 23void noinstr cpu_do_idle(void) 24{ 25 struct arm_cpuidle_irq_context context; 26 27 arm_cpuidle_save_irq_context(&context); 28 29 dsb(sy); 30 wfi(); 31 32 arm_cpuidle_restore_irq_context(&context); 33} 34 35/* 36 * This is our default idle handler. 37 */ 38void noinstr arch_cpu_idle(void) 39{ 40 /* 41 * This should do all the clock switching and wait for interrupt 42 * tricks 43 */ 44 cpu_do_idle(); 45 raw_local_irq_enable(); 46}