Commit 96446e21 authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Thierry Reding
Browse files

ARM: trusted_foundations: Make prepare_idle call to take mode argument



The Trusted Foundations firmware call varies depending on the required
suspend-mode. Make the firmware API to take the mode argument in order
to expose all of the modes to firmware user.

Tested-by: default avatarRobert Yang <decatf@gmail.com>
Tested-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent ebca2a6e
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -67,9 +67,34 @@ static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
	return 0;
}

static int tf_prepare_idle(void)
static int tf_prepare_idle(unsigned long mode)
{
	tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S1_NOFLUSH_L2, cpu_boot_addr);
	switch (mode) {
	case TF_PM_MODE_LP0:
		tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S3, cpu_boot_addr);
		break;

	case TF_PM_MODE_LP1:
		tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S2, cpu_boot_addr);
		break;

	case TF_PM_MODE_LP1_NO_MC_CLK:
		tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S2_NO_MC_CLK,
			       cpu_boot_addr);
		break;

	case TF_PM_MODE_LP2:
		tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S1, cpu_boot_addr);
		break;

	case TF_PM_MODE_LP2_NOFLUSH_L2:
		tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S1_NOFLUSH_L2,
			       cpu_boot_addr);
		break;

	default:
		return -EINVAL;
	}

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ struct firmware_ops {
	/*
	 * Inform the firmware we intend to enter CPU idle mode
	 */
	int (*prepare_idle)(void);
	int (*prepare_idle)(unsigned long mode);
	/*
	 * Enters CPU idle mode
	 */
+6 −0
Original line number Diff line number Diff line
@@ -35,6 +35,12 @@
#include <asm/hardware/cache-l2x0.h>
#include <asm/outercache.h>

#define TF_PM_MODE_LP0			0
#define TF_PM_MODE_LP1			1
#define TF_PM_MODE_LP1_NO_MC_CLK	2
#define TF_PM_MODE_LP2			3
#define TF_PM_MODE_LP2_NOFLUSH_L2	4

struct trusted_foundations_platform_data {
	unsigned int version_major;
	unsigned int version_minor;
+2 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <asm/cpuidle.h>
#include <asm/smp_plat.h>
#include <asm/suspend.h>
#include <asm/trusted_foundations.h>
#include <asm/psci.h>

#include "cpuidle.h"
@@ -46,7 +47,7 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev,
	tegra_set_cpu_in_lp2();
	cpu_pm_enter();

	call_firmware_op(prepare_idle);
	call_firmware_op(prepare_idle, TF_PM_MODE_LP2_NOFLUSH_L2);

	/* Do suspend by ourselves if the firmware does not implement it */
	if (call_firmware_op(do_idle, 0) == -ENOSYS)