forked from Mirrors/opensbi
		
	platform: generic: Add system suspend test
When the system-suspend-test property is present in the domain config
node as shown below, implement system suspend with a simple 5 second
delay followed by a WFI. This allows testing system suspend when the
low-level firmware doesn't support it.
  / {
    chosen {
      opensbi-domains {
          compatible = "opensbi,domain,config";
          system-suspend-test;
      };
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
			
			
This commit is contained in:
		@@ -17,6 +17,7 @@
 | 
			
		||||
#include <sbi/sbi_system.h>
 | 
			
		||||
#include <sbi/sbi_ipi.h>
 | 
			
		||||
#include <sbi/sbi_init.h>
 | 
			
		||||
#include <sbi/sbi_timer.h>
 | 
			
		||||
 | 
			
		||||
static SBI_LIST_HEAD(reset_devices_list);
 | 
			
		||||
 | 
			
		||||
@@ -108,6 +109,36 @@ void sbi_system_suspend_set_device(struct sbi_system_suspend_device *dev)
 | 
			
		||||
	suspend_dev = dev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sbi_system_suspend_test_check(u32 sleep_type)
 | 
			
		||||
{
 | 
			
		||||
	return sleep_type == SBI_SUSP_SLEEP_TYPE_SUSPEND;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sbi_system_suspend_test_suspend(u32 sleep_type,
 | 
			
		||||
					   unsigned long mmode_resume_addr)
 | 
			
		||||
{
 | 
			
		||||
	if (sleep_type != SBI_SUSP_SLEEP_TYPE_SUSPEND)
 | 
			
		||||
		return SBI_EINVAL;
 | 
			
		||||
 | 
			
		||||
	sbi_timer_mdelay(5000);
 | 
			
		||||
 | 
			
		||||
	/* Wait for interrupt */
 | 
			
		||||
	wfi();
 | 
			
		||||
 | 
			
		||||
	return SBI_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct sbi_system_suspend_device sbi_system_suspend_test = {
 | 
			
		||||
	.name = "system-suspend-test",
 | 
			
		||||
	.system_suspend_check = sbi_system_suspend_test_check,
 | 
			
		||||
	.system_suspend = sbi_system_suspend_test_suspend,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void sbi_system_suspend_test_enable(void)
 | 
			
		||||
{
 | 
			
		||||
	sbi_system_suspend_set_device(&sbi_system_suspend_test);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool sbi_system_suspend_supported(u32 sleep_type)
 | 
			
		||||
{
 | 
			
		||||
	return suspend_dev && suspend_dev->system_suspend_check &&
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user