board-msm7627a: mmc: Vote against idle power collapse when SDCC is active
Vote against idle power collapse during active SDCC
transfers help resolve an issue where the commands
sent to the card fail (due to timeout or CRC errors)
during SDCC resume.
CRs-Fixed: 328462
Change-Id: I7c3aa8155edeadc66ed21db03c0e069a59e415a8
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-msm7627a-storage.c b/arch/arm/mach-msm/board-msm7627a-storage.c
index 88a519d..3bb9c8b 100644
--- a/arch/arm/mach-msm/board-msm7627a-storage.c
+++ b/arch/arm/mach-msm/board-msm7627a-storage.c
@@ -19,6 +19,7 @@
#include <mach/board.h>
#include "devices.h"
+#include "pm.h"
#include "board-msm7627a.h"
#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\
@@ -366,6 +367,8 @@
#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
if (mmc_regulator_init(3, "emmc", 3000000))
return;
+ sdc3_plat_data.swfi_latency = msm7627a_power_collapse_latency(
+ MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT);
msm_add_sdcc(3, &sdc3_plat_data);
#endif
/* Micro-SD slot */
@@ -374,6 +377,8 @@
if (mmc_regulator_init(1, "mmc", 2850000))
return;
sdc1_plat_data.status_irq = MSM_GPIO_TO_INT(gpio_sdc1_hw_det);
+ sdc1_plat_data.swfi_latency = msm7627a_power_collapse_latency(
+ MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT);
msm_add_sdcc(1, &sdc1_plat_data);
#endif
/* SDIO WLAN slot */
diff --git a/arch/arm/mach-msm/board-msm7627a.h b/arch/arm/mach-msm/board-msm7627a.h
index b0481a0..dfd013c 100644
--- a/arch/arm/mach-msm/board-msm7627a.h
+++ b/arch/arm/mach-msm/board-msm7627a.h
@@ -13,6 +13,7 @@
#ifndef __ARCH_ARM_MACH_MSM_BOARD_7627A__
#define __ARCH_ARM_MACH_MSM_BOARD_7627A__
+#include "pm.h"
void __init msm7627a_init_mmc(void);
void __init msm_msm7627a_allocate_memory_regions(void);
@@ -103,5 +104,5 @@
#endif
void __init msm7627a_camera_init(void);
-
+u32 msm7627a_power_collapse_latency(enum msm_pm_sleep_mode);
#endif
diff --git a/arch/arm/mach-msm/board-msm7x27a.c b/arch/arm/mach-msm/board-msm7x27a.c
index d059b8d..d1c68f3 100644
--- a/arch/arm/mach-msm/board-msm7x27a.c
+++ b/arch/arm/mach-msm/board-msm7x27a.c
@@ -362,6 +362,26 @@
},
};
+u32 msm7627a_power_collapse_latency(enum msm_pm_sleep_mode mode)
+{
+ switch (mode) {
+ case MSM_PM_SLEEP_MODE_POWER_COLLAPSE:
+ return msm7x27a_pm_data
+ [MSM_PM_SLEEP_MODE_POWER_COLLAPSE].latency;
+ case MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN:
+ return msm7x27a_pm_data
+ [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN].latency;
+ case MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT:
+ return msm7x27a_pm_data
+ [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency;
+ case MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT:
+ return msm7x27a_pm_data
+ [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT].latency;
+ default:
+ return 0;
+ }
+}
+
static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
.mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS,
.p_addr = 0,