18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2008 IBM Corp. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Based on arch/powerpc/platforms/pasemi/idle.c: 68c2ecf20Sopenharmony_ci * Copyright (C) 2006-2007 PA Semi, Inc 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Added by: Jerone Young <jyoung5@us.ibm.com> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/of.h> 128c2ecf20Sopenharmony_ci#include <linux/kernel.h> 138c2ecf20Sopenharmony_ci#include <asm/machdep.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic int mode_spin; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic void ppc44x_idle(void) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci unsigned long msr_save; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci msr_save = mfmsr(); 228c2ecf20Sopenharmony_ci /* set wait state MSR */ 238c2ecf20Sopenharmony_ci mtmsr(msr_save|MSR_WE|MSR_EE|MSR_CE|MSR_DE); 248c2ecf20Sopenharmony_ci isync(); 258c2ecf20Sopenharmony_ci /* return to initial state */ 268c2ecf20Sopenharmony_ci mtmsr(msr_save); 278c2ecf20Sopenharmony_ci isync(); 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ciint __init ppc44x_idle_init(void) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci if (!mode_spin) { 338c2ecf20Sopenharmony_ci /* If we are not setting spin mode 348c2ecf20Sopenharmony_ci then we set to wait mode */ 358c2ecf20Sopenharmony_ci ppc_md.power_save = &ppc44x_idle; 368c2ecf20Sopenharmony_ci } 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci return 0; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciarch_initcall(ppc44x_idle_init); 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistatic int __init idle_param(char *p) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci if (!strcmp("spin", p)) { 478c2ecf20Sopenharmony_ci mode_spin = 1; 488c2ecf20Sopenharmony_ci ppc_md.power_save = NULL; 498c2ecf20Sopenharmony_ci } 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci return 0; 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ciearly_param("idle", idle_param); 55