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

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
...@@ -67,9 +67,34 @@ static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr) ...@@ -67,9 +67,34 @@ static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
return 0; 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; return 0;
} }
......
...@@ -24,7 +24,7 @@ struct firmware_ops { ...@@ -24,7 +24,7 @@ struct firmware_ops {
/* /*
* Inform the firmware we intend to enter CPU idle mode * Inform the firmware we intend to enter CPU idle mode
*/ */
int (*prepare_idle)(void); int (*prepare_idle)(unsigned long mode);
/* /*
* Enters CPU idle mode * Enters CPU idle mode
*/ */
......
...@@ -35,6 +35,12 @@ ...@@ -35,6 +35,12 @@
#include <asm/hardware/cache-l2x0.h> #include <asm/hardware/cache-l2x0.h>
#include <asm/outercache.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 { struct trusted_foundations_platform_data {
unsigned int version_major; unsigned int version_major;
unsigned int version_minor; unsigned int version_minor;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <asm/cpuidle.h> #include <asm/cpuidle.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include <asm/suspend.h> #include <asm/suspend.h>
#include <asm/trusted_foundations.h>
#include <asm/psci.h> #include <asm/psci.h>
#include "cpuidle.h" #include "cpuidle.h"
...@@ -46,7 +47,7 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev, ...@@ -46,7 +47,7 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev,
tegra_set_cpu_in_lp2(); tegra_set_cpu_in_lp2();
cpu_pm_enter(); 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 */ /* Do suspend by ourselves if the firmware does not implement it */
if (call_firmware_op(do_idle, 0) == -ENOSYS) if (call_firmware_op(do_idle, 0) == -ENOSYS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment