vfs: do bulk POLL* -> EPOLL* replacement
[sfrench/cifs-2.6.git] / drivers / firmware / psci.c
index e9493da2b111e67ce5169bd91f031e29e0be92fc..c80ec1d03274413863fb8e3f917f26daa8f868c2 100644 (file)
@@ -61,6 +61,7 @@ bool psci_tos_resident_on(int cpu)
 
 struct psci_operations psci_ops = {
        .conduit = PSCI_CONDUIT_NONE,
+       .smccc_version = SMCCC_VERSION_1_0,
 };
 
 typedef unsigned long (psci_fn)(unsigned long, unsigned long,
@@ -511,6 +512,31 @@ static void __init psci_init_migrate(void)
        pr_info("Trusted OS resident on physical CPU 0x%lx\n", cpuid);
 }
 
+static void __init psci_init_smccc(void)
+{
+       u32 ver = ARM_SMCCC_VERSION_1_0;
+       int feature;
+
+       feature = psci_features(ARM_SMCCC_VERSION_FUNC_ID);
+
+       if (feature != PSCI_RET_NOT_SUPPORTED) {
+               u32 ret;
+               ret = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0);
+               if (ret == ARM_SMCCC_VERSION_1_1) {
+                       psci_ops.smccc_version = SMCCC_VERSION_1_1;
+                       ver = ret;
+               }
+       }
+
+       /*
+        * Conveniently, the SMCCC and PSCI versions are encoded the
+        * same way. No, this isn't accidental.
+        */
+       pr_info("SMC Calling Convention v%d.%d\n",
+               PSCI_VERSION_MAJOR(ver), PSCI_VERSION_MINOR(ver));
+
+}
+
 static void __init psci_0_2_set_functions(void)
 {
        pr_info("Using standard PSCI v0.2 function IDs\n");
@@ -559,6 +585,7 @@ static int __init psci_probe(void)
        psci_init_migrate();
 
        if (PSCI_VERSION_MAJOR(ver) >= 1) {
+               psci_init_smccc();
                psci_init_cpu_suspend();
                psci_init_system_suspend();
        }