diff options
Diffstat (limited to 'drivers/firmware/psci/psci.c')
-rw-r--r-- | drivers/firmware/psci/psci.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index e480e0af632c..eabd01383cd6 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c | |||
@@ -95,6 +95,11 @@ static inline bool psci_has_ext_power_state(void) | |||
95 | PSCI_1_0_FEATURES_CPU_SUSPEND_PF_MASK; | 95 | PSCI_1_0_FEATURES_CPU_SUSPEND_PF_MASK; |
96 | } | 96 | } |
97 | 97 | ||
98 | static inline bool psci_has_osi_support(void) | ||
99 | { | ||
100 | return psci_cpu_suspend_feature & PSCI_1_0_OS_INITIATED; | ||
101 | } | ||
102 | |||
98 | static inline bool psci_power_state_loses_context(u32 state) | 103 | static inline bool psci_power_state_loses_context(u32 state) |
99 | { | 104 | { |
100 | const u32 mask = psci_has_ext_power_state() ? | 105 | const u32 mask = psci_has_ext_power_state() ? |
@@ -659,10 +664,24 @@ static int __init psci_0_1_init(struct device_node *np) | |||
659 | return 0; | 664 | return 0; |
660 | } | 665 | } |
661 | 666 | ||
667 | static int __init psci_1_0_init(struct device_node *np) | ||
668 | { | ||
669 | int err; | ||
670 | |||
671 | err = psci_0_2_init(np); | ||
672 | if (err) | ||
673 | return err; | ||
674 | |||
675 | if (psci_has_osi_support()) | ||
676 | pr_info("OSI mode supported.\n"); | ||
677 | |||
678 | return 0; | ||
679 | } | ||
680 | |||
662 | static const struct of_device_id psci_of_match[] __initconst = { | 681 | static const struct of_device_id psci_of_match[] __initconst = { |
663 | { .compatible = "arm,psci", .data = psci_0_1_init}, | 682 | { .compatible = "arm,psci", .data = psci_0_1_init}, |
664 | { .compatible = "arm,psci-0.2", .data = psci_0_2_init}, | 683 | { .compatible = "arm,psci-0.2", .data = psci_0_2_init}, |
665 | { .compatible = "arm,psci-1.0", .data = psci_0_2_init}, | 684 | { .compatible = "arm,psci-1.0", .data = psci_1_0_init}, |
666 | {}, | 685 | {}, |
667 | }; | 686 | }; |
668 | 687 | ||