msm_shared: mmc: Add support for sleep function

Add function to put the mmc card in sleep mode.

Change-Id: Ide76d8f7fa0e7985778e2b089cd2ffacd0e218f4
diff --git a/platform/msm_shared/mmc.c b/platform/msm_shared/mmc.c
index 851bb08..7783f10 100644
--- a/platform/msm_shared/mmc.c
+++ b/platform/msm_shared/mmc.c
@@ -552,8 +552,10 @@
 	/* 2a. Write command index in CMD_INDEX field */
 	cmd_index = cmd->cmd_index;
 	mmc_cmd |= cmd->cmd_index;
-	/* 2b. Set RESPONSE bit to 1 for all cmds except CMD0 */
-	if (cmd_index != CMD0_GO_IDLE_STATE) {
+	/* 2b. Set RESPONSE bit to 1 for all cmds except CMD0
+	 * And dont set RESPONSE bit for commands with no response
+	 */
+	if (cmd_index != CMD0_GO_IDLE_STATE && cmd->resp_type != MMC_BOOT_RESP_NONE) {
 		mmc_cmd |= MMC_BOOT_MCI_CMD_RESPONSE;
 	}
 
@@ -3405,3 +3407,32 @@
 {
 	return mmc_card.capacity;
 }
+
+void mmc_put_card_to_sleep(void)
+{
+	uint32_t mmc_ret;
+	struct mmc_boot_command cmd = {0};
+
+	cmd.cmd_index = CMD7_SELECT_DESELECT_CARD;
+	cmd.argument = 0x00000000;
+	cmd.cmd_type = MMC_BOOT_CMD_ADDRESS;
+	cmd.resp_type = MMC_BOOT_RESP_NONE;
+
+	/* send command */
+	mmc_ret = mmc_boot_send_command(&cmd);
+	if (mmc_ret != MMC_BOOT_E_SUCCESS)
+	{
+		dprintf(CRITICAL, "card deselect error: %d\n", mmc_ret);
+		return;
+	}
+
+	cmd.cmd_index = CMD5_SLEEP_AWAKE;
+	cmd.argument = (mmc_card.rca << MMC_CARD_RCA_BIT) | MMC_CARD_SLEEP;
+	cmd.cmd_type = MMC_BOOT_CMD_ADDRESS;
+	cmd.resp_type = MMC_BOOT_RESP_R1B;
+
+	/* send command */
+	mmc_ret = mmc_boot_send_command(&cmd);
+	if (mmc_ret != MMC_BOOT_E_SUCCESS)
+		dprintf(CRITICAL, "card sleep error: %d\n", mmc_ret);
+}