Commit 65880ab1 authored by Dave Gerlach's avatar Dave Gerlach Committed by Tony Lindgren

ARM: OMAP2+: pm33xx-core: Extend platform_data ops for cpuidle

In order for am335x and am437x to properly enter deeper c-states in
cpuidle they must always call into the sleep33/43xx suspend code and
also sometimes invoke the wkup_m3_ipc driver. These are both controlled
by the pm33xx module so we must provide a method for the platform code
to call back into the module when it is available as the core cpuidle
ops that are invoked by the cpuidle-arm driver must remain as built in.

Extend the init platform op to take an idle function as an argument so
that we can use this to call into the pm33xx module for c-states that
need it. Also add a deinit op so we can unregister this idle function
from the PM core when the pm33xx module gets unloaded.
Acked-by: default avatarSantosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: default avatarDave Gerlach <d-gerlach@ti.com>
Acked-by: default avatarSantosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 06ee7a95
...@@ -79,7 +79,7 @@ static int am43xx_check_off_mode_enable(void) ...@@ -79,7 +79,7 @@ static int am43xx_check_off_mode_enable(void)
return 0; return 0;
} }
static int amx3_common_init(void) static int amx3_common_init(int (*idle)(u32 wfi_flags))
{ {
gfx_pwrdm = pwrdm_lookup("gfx_pwrdm"); gfx_pwrdm = pwrdm_lookup("gfx_pwrdm");
per_pwrdm = pwrdm_lookup("per_pwrdm"); per_pwrdm = pwrdm_lookup("per_pwrdm");
...@@ -99,10 +99,12 @@ static int amx3_common_init(void) ...@@ -99,10 +99,12 @@ static int amx3_common_init(void)
else else
omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF); omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF);
idle_fn = idle;
return 0; return 0;
} }
static int am33xx_suspend_init(void) static int am33xx_suspend_init(int (*idle)(u32 wfi_flags))
{ {
int ret; int ret;
...@@ -113,12 +115,12 @@ static int am33xx_suspend_init(void) ...@@ -113,12 +115,12 @@ static int am33xx_suspend_init(void)
return -ENODEV; return -ENODEV;
} }
ret = amx3_common_init(); ret = amx3_common_init(idle);
return ret; return ret;
} }
static int am43xx_suspend_init(void) static int am43xx_suspend_init(int (*idle)(u32 wfi_flags))
{ {
int ret = 0; int ret = 0;
...@@ -128,11 +130,17 @@ static int am43xx_suspend_init(void) ...@@ -128,11 +130,17 @@ static int am43xx_suspend_init(void)
return ret; return ret;
} }
ret = amx3_common_init(); ret = amx3_common_init(idle);
return ret; return ret;
} }
static int amx3_suspend_deinit(void)
{
idle_fn = NULL;
return 0;
}
static void amx3_pre_suspend_common(void) static void amx3_pre_suspend_common(void)
{ {
omap_set_pwrdm_state(gfx_pwrdm, PWRDM_POWER_OFF); omap_set_pwrdm_state(gfx_pwrdm, PWRDM_POWER_OFF);
...@@ -301,6 +309,7 @@ static void am43xx_prepare_rtc_resume(void) ...@@ -301,6 +309,7 @@ static void am43xx_prepare_rtc_resume(void)
static struct am33xx_pm_platform_data am33xx_ops = { static struct am33xx_pm_platform_data am33xx_ops = {
.init = am33xx_suspend_init, .init = am33xx_suspend_init,
.deinit = amx3_suspend_deinit,
.soc_suspend = am33xx_suspend, .soc_suspend = am33xx_suspend,
.cpu_suspend = am33xx_cpu_suspend, .cpu_suspend = am33xx_cpu_suspend,
.begin_suspend = amx3_begin_suspend, .begin_suspend = amx3_begin_suspend,
...@@ -316,6 +325,7 @@ static struct am33xx_pm_platform_data am33xx_ops = { ...@@ -316,6 +325,7 @@ static struct am33xx_pm_platform_data am33xx_ops = {
static struct am33xx_pm_platform_data am43xx_ops = { static struct am33xx_pm_platform_data am43xx_ops = {
.init = am43xx_suspend_init, .init = am43xx_suspend_init,
.deinit = amx3_suspend_deinit,
.soc_suspend = am43xx_suspend, .soc_suspend = am43xx_suspend,
.cpu_suspend = am43xx_cpu_suspend, .cpu_suspend = am43xx_cpu_suspend,
.begin_suspend = amx3_begin_suspend, .begin_suspend = amx3_begin_suspend,
......
...@@ -503,7 +503,7 @@ static int am33xx_pm_probe(struct platform_device *pdev) ...@@ -503,7 +503,7 @@ static int am33xx_pm_probe(struct platform_device *pdev)
suspend_wfi_flags |= WFI_FLAG_WAKE_M3; suspend_wfi_flags |= WFI_FLAG_WAKE_M3;
#endif /* CONFIG_SUSPEND */ #endif /* CONFIG_SUSPEND */
ret = pm_ops->init(); ret = pm_ops->init(NULL);
if (ret) { if (ret) {
dev_err(dev, "Unable to call core pm init!\n"); dev_err(dev, "Unable to call core pm init!\n");
ret = -ENODEV; ret = -ENODEV;
......
...@@ -46,7 +46,8 @@ struct am33xx_pm_sram_addr { ...@@ -46,7 +46,8 @@ struct am33xx_pm_sram_addr {
}; };
struct am33xx_pm_platform_data { struct am33xx_pm_platform_data {
int (*init)(void); int (*init)(int (*idle)(u32 wfi_flags));
int (*deinit)(void);
int (*soc_suspend)(unsigned int state, int (*fn)(unsigned long), int (*soc_suspend)(unsigned int state, int (*fn)(unsigned long),
unsigned long args); unsigned long args);
int (*cpu_suspend)(int (*fn)(unsigned long), unsigned long args); int (*cpu_suspend)(int (*fn)(unsigned long), unsigned long args);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment