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