ARM: OMAP2+: Block suspend for am3 and am4 if PM is not configured
[ Upstream commit 093a474ce10d8ea3db3ef2922aca5a38f34bab1b ] If the PM related modules are not loaded and PM firmware not configured, the system suspend fails to resume. Let's fix this by adding initial platform_suspend_ops to block suspend and warn about missing modules. When pm33xx and wkup_m3_ipc have been loaded and m3 coprocessor booted with it's firmware, pm33xx sets up working platform_suspend_ops. Note that we need to configure at least PM_SUSPEND_STANDBY to have suspend_set_ops(). Cc: Dave Gerlach <d-gerlach@ti.com> Cc: Suman Anna <s-anna@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
f40a7c9b8e
commit
ffa6f08be1
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include <linux/cpuidle.h>
|
#include <linux/cpuidle.h>
|
||||||
#include <linux/platform_data/pm33xx.h>
|
#include <linux/platform_data/pm33xx.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
#include <asm/cpuidle.h>
|
#include <asm/cpuidle.h>
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
#include <asm/suspend.h>
|
#include <asm/suspend.h>
|
||||||
@@ -324,6 +325,44 @@ static struct am33xx_pm_platform_data *am33xx_pm_get_pdata(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SUSPEND
|
||||||
|
/*
|
||||||
|
* Block system suspend initially. Later on pm33xx sets up it's own
|
||||||
|
* platform_suspend_ops after probe. That depends also on loaded
|
||||||
|
* wkup_m3_ipc and booted am335x-pm-firmware.elf.
|
||||||
|
*/
|
||||||
|
static int amx3_suspend_block(suspend_state_t state)
|
||||||
|
{
|
||||||
|
pr_warn("PM not initialized for pm33xx, wkup_m3_ipc, or am335x-pm-firmware.elf\n");
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int amx3_pm_valid(suspend_state_t state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case PM_SUSPEND_STANDBY:
|
||||||
|
return 1;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct platform_suspend_ops amx3_blocked_pm_ops = {
|
||||||
|
.begin = amx3_suspend_block,
|
||||||
|
.valid = amx3_pm_valid,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init amx3_block_suspend(void)
|
||||||
|
{
|
||||||
|
suspend_set_ops(&amx3_blocked_pm_ops);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void amx3_block_suspend(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_SUSPEND */
|
||||||
|
|
||||||
int __init amx3_common_pm_init(void)
|
int __init amx3_common_pm_init(void)
|
||||||
{
|
{
|
||||||
struct am33xx_pm_platform_data *pdata;
|
struct am33xx_pm_platform_data *pdata;
|
||||||
@@ -337,6 +376,7 @@ int __init amx3_common_pm_init(void)
|
|||||||
devinfo.size_data = sizeof(*pdata);
|
devinfo.size_data = sizeof(*pdata);
|
||||||
devinfo.id = -1;
|
devinfo.id = -1;
|
||||||
platform_device_register_full(&devinfo);
|
platform_device_register_full(&devinfo);
|
||||||
|
amx3_block_suspend();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user