diff options
author | Alexandre Courbot <acourbot@nvidia.com> | 2014-02-06 23:35:05 -0500 |
---|---|---|
committer | Stephen Warren <swarren@nvidia.com> | 2014-02-18 15:46:46 -0500 |
commit | b77b6e885c592815f272d70749fb8d391038f97a (patch) | |
tree | 19c07df03d22f27cb3650dc9a29a242b44d6199a /arch/arm/firmware | |
parent | cd42145cd993fa1a7426d63648fc7e3423fb2e1d (diff) |
ARM: trusted_foundations: implement prepare_idle()
Support the prepare_idle() firmware call, which is necessary to properly
support CPU idling.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Acked-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Diffstat (limited to 'arch/arm/firmware')
-rw-r--r-- | arch/arm/firmware/trusted_foundations.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/arch/arm/firmware/trusted_foundations.c b/arch/arm/firmware/trusted_foundations.c index ef1e3d8f4af0..3fb1b5a1dce9 100644 --- a/arch/arm/firmware/trusted_foundations.c +++ b/arch/arm/firmware/trusted_foundations.c | |||
@@ -22,6 +22,15 @@ | |||
22 | 22 | ||
23 | #define TF_SET_CPU_BOOT_ADDR_SMC 0xfffff200 | 23 | #define TF_SET_CPU_BOOT_ADDR_SMC 0xfffff200 |
24 | 24 | ||
25 | #define TF_CPU_PM 0xfffffffc | ||
26 | #define TF_CPU_PM_S3 0xffffffe3 | ||
27 | #define TF_CPU_PM_S2 0xffffffe6 | ||
28 | #define TF_CPU_PM_S2_NO_MC_CLK 0xffffffe5 | ||
29 | #define TF_CPU_PM_S1 0xffffffe4 | ||
30 | #define TF_CPU_PM_S1_NOFLUSH_L2 0xffffffe7 | ||
31 | |||
32 | static unsigned long cpu_boot_addr; | ||
33 | |||
25 | static void __naked tf_generic_smc(u32 type, u32 arg1, u32 arg2) | 34 | static void __naked tf_generic_smc(u32 type, u32 arg1, u32 arg2) |
26 | { | 35 | { |
27 | asm volatile( | 36 | asm volatile( |
@@ -41,13 +50,22 @@ static void __naked tf_generic_smc(u32 type, u32 arg1, u32 arg2) | |||
41 | 50 | ||
42 | static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr) | 51 | static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr) |
43 | { | 52 | { |
44 | tf_generic_smc(TF_SET_CPU_BOOT_ADDR_SMC, boot_addr, 0); | 53 | cpu_boot_addr = boot_addr; |
54 | tf_generic_smc(TF_SET_CPU_BOOT_ADDR_SMC, cpu_boot_addr, 0); | ||
55 | |||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static int tf_prepare_idle(void) | ||
60 | { | ||
61 | tf_generic_smc(TF_CPU_PM, TF_CPU_PM_S1_NOFLUSH_L2, cpu_boot_addr); | ||
45 | 62 | ||
46 | return 0; | 63 | return 0; |
47 | } | 64 | } |
48 | 65 | ||
49 | static const struct firmware_ops trusted_foundations_ops = { | 66 | static const struct firmware_ops trusted_foundations_ops = { |
50 | .set_cpu_boot_addr = tf_set_cpu_boot_addr, | 67 | .set_cpu_boot_addr = tf_set_cpu_boot_addr, |
68 | .prepare_idle = tf_prepare_idle, | ||
51 | }; | 69 | }; |
52 | 70 | ||
53 | void register_trusted_foundations(struct trusted_foundations_platform_data *pd) | 71 | void register_trusted_foundations(struct trusted_foundations_platform_data *pd) |