Merge pull request #402 from soby-mathew/sm/psci_cpu_off

PSCI: Update state only if CPU_OFF is not denied by SPD
diff --git a/services/std_svc/psci/psci_off.c b/services/std_svc/psci/psci_off.c
index f565ffb..9ed6f0c 100644
--- a/services/std_svc/psci/psci_off.c
+++ b/services/std_svc/psci/psci_off.c
@@ -62,7 +62,7 @@
  ******************************************************************************/
 int psci_do_cpu_off(unsigned int end_pwrlvl)
 {
-	int rc, idx = plat_my_core_pos();
+	int rc = PSCI_E_SUCCESS, idx = plat_my_core_pos();
 	psci_power_state_t state_info;
 
 	/*
@@ -121,22 +121,26 @@
 				      idx);
 
 	/*
-	 * Set the affinity info state to OFF. This writes directly to main
-	 * memory as caches are disabled, so cache maintenance is required
-	 * to ensure that later cached reads of aff_info_state return
-	 * AFF_STATE_OFF.
-	 */
-	flush_cpu_data(psci_svc_cpu_data.aff_info_state);
-	psci_set_aff_info_state(AFF_STATE_OFF);
-	inv_cpu_data(psci_svc_cpu_data.aff_info_state);
-
-	/*
 	 * Check if all actions needed to safely power down this cpu have
-	 * successfully completed. Enter a wfi loop which will allow the
-	 * power controller to physically power down this cpu.
+	 * successfully completed.
 	 */
-	if (rc == PSCI_E_SUCCESS)
+	if (rc == PSCI_E_SUCCESS) {
+		/*
+		 * Set the affinity info state to OFF. This writes directly to
+		 * main memory as caches are disabled, so cache maintenance is
+		 * required to ensure that later cached reads of aff_info_state
+		 * return AFF_STATE_OFF.
+		 */
+		flush_cpu_data(psci_svc_cpu_data.aff_info_state);
+		psci_set_aff_info_state(AFF_STATE_OFF);
+		inv_cpu_data(psci_svc_cpu_data.aff_info_state);
+
+		/*
+		 * Enter a wfi loop which will allow the power controller to
+		 * physically power down this cpu.
+		 */
 		psci_power_down_wfi();
+	}
 
 	return rc;
 }