1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright 2008 IBM Corp. 4 * 5 * Based on arch/powerpc/platforms/pasemi/idle.c: 6 * Copyright (C) 2006-2007 PA Semi, Inc 7 * 8 * Added by: Jerone Young <jyoung5@us.ibm.com> 9 */ 10 11 #include <linux/of.h> 12 #include <linux/kernel.h> 13 #include <asm/machdep.h> 14 15 static int mode_spin; 16 17 static void ppc44x_idle(void) 18 { 19 unsigned long msr_save; 20 21 msr_save = mfmsr(); 22 /* set wait state MSR */ 23 mtmsr(msr_save|MSR_WE|MSR_EE|MSR_CE|MSR_DE); 24 isync(); 25 /* return to initial state */ 26 mtmsr(msr_save); 27 isync(); 28 } 29 30 int __init ppc44x_idle_init(void) 31 { 32 if (!mode_spin) { 33 /* If we are not setting spin mode 34 then we set to wait mode */ 35 ppc_md.power_save = &ppc44x_idle; 36 } 37 38 return 0; 39 } 40 41 arch_initcall(ppc44x_idle_init); 42 43 static int __init idle_param(char *p) 44 { 45 46 if (!strcmp("spin", p)) { 47 mode_spin = 1; 48 ppc_md.power_save = NULL; 49 } 50 51 return 0; 52 } 53 54 early_param("idle", idle_param); 55