Add standby state support in PSCI cpu_suspend api

This patch adds support in the generic PSCI implementation to call a
platform specific function to enter a standby state using an example
implementation in ARM FVP port

Fixes ARM-software/tf-issues#94
Change-Id: Ic1263fcf25f28e09162ad29dca954125f9aa8cc9
diff --git a/services/std_svc/psci/psci_main.c b/services/std_svc/psci/psci_main.c
index 6bf0583..2d61ec0 100644
--- a/services/std_svc/psci/psci_main.c
+++ b/services/std_svc/psci/psci_main.c
@@ -85,31 +85,28 @@
 	unsigned long mpidr;
 	unsigned int target_afflvl, pstate_type;
 
-	/* TODO: Standby states are not supported at the moment */
-	pstate_type = psci_get_pstate_type(power_state);
-	if (pstate_type == 0) {
-		rc = PSCI_E_INVALID_PARAMS;
-		goto exit;
-	}
-
 	/* Sanity check the requested state */
 	target_afflvl = psci_get_pstate_afflvl(power_state);
-	if (target_afflvl > MPIDR_MAX_AFFLVL) {
-		rc = PSCI_E_INVALID_PARAMS;
-		goto exit;
+	if (target_afflvl > MPIDR_MAX_AFFLVL)
+		return PSCI_E_INVALID_PARAMS;
+
+	pstate_type = psci_get_pstate_type(power_state);
+	if (pstate_type == PSTATE_TYPE_STANDBY) {
+		if  (psci_plat_pm_ops->affinst_standby)
+			rc = psci_plat_pm_ops->affinst_standby(power_state);
+		else
+			return PSCI_E_INVALID_PARAMS;
+	} else {
+		mpidr = read_mpidr();
+		rc = psci_afflvl_suspend(mpidr,
+					 entrypoint,
+					 context_id,
+					 power_state,
+					 MPIDR_AFFLVL0,
+					 target_afflvl);
 	}
 
-	mpidr = read_mpidr();
-	rc = psci_afflvl_suspend(mpidr,
-				 entrypoint,
-				 context_id,
-				 power_state,
-				 MPIDR_AFFLVL0,
-				 target_afflvl);
-
-exit:
-	if (rc != PSCI_E_SUCCESS)
-		assert(rc == PSCI_E_INVALID_PARAMS);
+	assert(rc == PSCI_E_INVALID_PARAMS || rc == PSCI_E_SUCCESS);
 	return rc;
 }