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