From a7eadeaa24eb044bac38bfe783e4e56e33cdf254 Mon Sep 17 00:00:00 2001 From: Larry Bassel Date: Thu, 14 Jul 2011 10:46:00 -0700 Subject: [PATCH] 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 --- arch/arm/mach-msm/board-msm8960.c | 7 +++++++ arch/arm/mach-msm/include/mach/memory.h | 2 ++ arch/arm/mach-msm/memory.c | 15 +++++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c index 3b3fc417510..c5fb20542c4 100644 --- a/arch/arm/mach-msm/board-msm8960.c +++ b/arch/arm/mach-msm/board-msm8960.c @@ -740,6 +740,12 @@ static void __init msm8960_reserve(void) 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 @@ static void __init msm8960_cdp_init(void) 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 d5858fb907a..00189346c1e 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_remove_pages(unsigned long, unsigned long); 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 c38071ca3ca..2ece32eb752 100644 --- a/arch/arm/mach-msm/memory.c +++ b/arch/arm/mach-msm/memory.c @@ -194,25 +194,32 @@ void *alloc_bootmem_aligned(unsigned long size, unsigned long alignment) 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",