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);
+}