msm: allow for platform-specific memory power routines
We now support more than one platform whose memory
can be turned on and off and whose way of doing so
differs from platform to platform, so call the appropriate
platform-specific routine if one exists.
Signed-off-by: Larry Bassel <lbassel@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
index 3b3fc41..c5fb205 100644
--- a/arch/arm/mach-msm/board-msm8960.c
+++ b/arch/arm/mach-msm/board-msm8960.c
@@ -740,6 +740,12 @@
msm_reserve();
}
+static int msm8960_change_memory_power(unsigned long start_pfn,
+ unsigned long nr_pages, int change_type)
+{
+ return 1;
+}
+
#ifdef CONFIG_MSM_CAMERA
static int msm_cam_gpio_tbl[] = {
@@ -3377,6 +3383,7 @@
msm_pm_set_rpm_wakeup_irq(RPM_APCC_CPU0_WAKE_UP_IRQ);
msm_cpuidle_set_states(msm_cstates, ARRAY_SIZE(msm_cstates),
msm_pm_data);
+ change_memory_power = &msm8960_change_memory_power;
}
MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
diff --git a/arch/arm/mach-msm/include/mach/memory.h b/arch/arm/mach-msm/include/mach/memory.h
index d5858fb..0018934 100644
--- a/arch/arm/mach-msm/include/mach/memory.h
+++ b/arch/arm/mach-msm/include/mach/memory.h
@@ -67,6 +67,8 @@
int platform_physical_active_pages(unsigned long, unsigned long);
int platform_physical_low_power_pages(unsigned long, unsigned long);
+extern int (*change_memory_power)(unsigned long, unsigned long, int);
+
#if defined(CONFIG_ARCH_MSM_ARM11) || defined(CONFIG_ARCH_MSM_CORTEX_A5)
void write_to_strongly_ordered_memory(void);
void map_page_strongly_ordered(void);
diff --git a/arch/arm/mach-msm/memory.c b/arch/arm/mach-msm/memory.c
index c38071ca..2ece32e 100644
--- a/arch/arm/mach-msm/memory.c
+++ b/arch/arm/mach-msm/memory.c
@@ -194,25 +194,32 @@
return (void *)addr;
}
+int (*change_memory_power)(unsigned long, unsigned long, int);
+
int platform_physical_remove_pages(unsigned long start_pfn,
unsigned long nr_pages)
{
- return 1;
+ if (!change_memory_power)
+ return 0;
+ return change_memory_power(start_pfn, nr_pages, MEMORY_DEEP_POWERDOWN);
}
int platform_physical_active_pages(unsigned long start_pfn,
unsigned long nr_pages)
{
- return 1;
+ if (!change_memory_power)
+ return 0;
+ return change_memory_power(start_pfn, nr_pages, MEMORY_ACTIVE);
}
int platform_physical_low_power_pages(unsigned long start_pfn,
unsigned long nr_pages)
{
- return 1;
+ if (!change_memory_power)
+ return 0;
+ return change_memory_power(start_pfn, nr_pages, MEMORY_SELF_REFRESH);
}
-
char *memtype_name[] = {
"SMI_KERNEL",
"SMI",