162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2008 IBM Corp. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Based on arch/powerpc/platforms/pasemi/idle.c: 662306a36Sopenharmony_ci * Copyright (C) 2006-2007 PA Semi, Inc 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Added by: Jerone Young <jyoung5@us.ibm.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include <linux/kernel.h> 1362306a36Sopenharmony_ci#include <asm/machdep.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic int mode_spin; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic void ppc44x_idle(void) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci unsigned long msr_save; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci msr_save = mfmsr(); 2262306a36Sopenharmony_ci /* set wait state MSR */ 2362306a36Sopenharmony_ci mtmsr(msr_save|MSR_WE|MSR_EE|MSR_CE|MSR_DE); 2462306a36Sopenharmony_ci isync(); 2562306a36Sopenharmony_ci /* return to initial state */ 2662306a36Sopenharmony_ci mtmsr(msr_save); 2762306a36Sopenharmony_ci isync(); 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciint __init ppc44x_idle_init(void) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci if (!mode_spin) { 3362306a36Sopenharmony_ci /* If we are not setting spin mode 3462306a36Sopenharmony_ci then we set to wait mode */ 3562306a36Sopenharmony_ci ppc_md.power_save = &ppc44x_idle; 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciarch_initcall(ppc44x_idle_init); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic int __init idle_param(char *p) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci if (!strcmp("spin", p)) { 4762306a36Sopenharmony_ci mode_spin = 1; 4862306a36Sopenharmony_ci ppc_md.power_save = NULL; 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return 0; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ciearly_param("idle", idle_param); 55