soc: infineon: Support for power management on 20829

- Initial changes in board, dts, and soc files to support
 system power management

Signed-off-by: Sreeram Tatapudi <sreeram.praveen@infineon.com>
This commit is contained in:
Sreeram Tatapudi 2024-09-04 14:15:52 -07:00 committed by Anas Nashif
commit 0a9c0f4017
9 changed files with 113 additions and 1 deletions

View file

@ -81,6 +81,10 @@ uart2: &scb2 {
status = "okay";
};
&mcwdt0 {
status = "okay";
};
&bluetooth {
status = "okay";
};

View file

@ -4,7 +4,6 @@
#
# General configuration
CONFIG_CORTEX_M_SYSTICK=y
CONFIG_BUILD_OUTPUT_HEX=y
CONFIG_BUILD_OUTPUT_BIN=y

View file

@ -16,6 +16,21 @@
device_type = "cpu";
compatible = "arm,cortex-m33";
reg = <0>;
cpu-power-states = <&idle &suspend_to_ram>;
};
power-states {
idle: idle {
compatible = "zephyr,power-state";
power-state-name = "suspend-to-idle";
min-residency-us = <1000000>;
};
suspend_to_ram: suspend_to_ram {
compatible = "zephyr,power-state";
power-state-name = "suspend-to-ram";
min-residency-us = <2000000>;
};
};
};

View file

@ -90,6 +90,8 @@ if(CONFIG_SOC_FAMILY_INFINEON_CAT1B)
zephyr_library_sources(${pdl_drv_dir}/source/cy_systick_v2.c)
zephyr_library_sources(${pdl_drv_dir}/source/cy_syspm_v2.c)
zephyr_library_sources(${pdl_drv_dir}/source/cy_syspm_btss.c)
zephyr_library_sources(${pdl_drv_dir}/source/cy_syspm_ppu.c)
zephyr_library_sources(${pdl_drv_dir}/source/ppu_v1.c)
endif()
zephyr_library_sources(${pdl_drv_dir}/source/cy_syslib.c)
zephyr_library_sources(${pdl_drv_dir}/source/cy_syspm.c)

View file

@ -5,6 +5,8 @@ zephyr_sources(soc.c)
zephyr_sources(app_header.c)
zephyr_include_directories(.)
zephyr_sources_ifdef(CONFIG_PM power.c)
# CAT1B family defines
zephyr_compile_definitions_ifdef(CONFIG_SOC_FAMILY_INFINEON_CAT1 CY_USING_HAL)
zephyr_compile_definitions_ifdef(CONFIG_SOC_FAMILY_INFINEON_CAT1B COMPONENT_CAT1B)

View file

@ -12,3 +12,4 @@ config SOC_SERIES_CYW20829
select CPU_HAS_FPU
select DYNAMIC_INTERRUPTS
select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE
select HAS_PM

View file

@ -6,6 +6,12 @@
if SOC_DIE_CYW20829
config INFINEON_CAT1_LP_TIMER
bool
config CORTEX_M_SYSTICK
default n if INFINEON_CAT1_LP_TIMER
config NUM_IRQS
default 70

View file

@ -0,0 +1,73 @@
/*
* Copyright (c) 2021 Cypress Semiconductor Corporation (an Infineon company) or
* an affiliate of Cypress Semiconductor Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/pm/pm.h>
#include <zephyr/logging/log.h>
#include <cyhal_syspm.h>
#include <cyhal_lptimer.h>
LOG_MODULE_REGISTER(soc_power, CONFIG_SOC_LOG_LEVEL);
/*
* Called from pm_system_suspend(int32_t ticks) in subsys/power.c
* For deep sleep pm_system_suspend has executed all the driver
* power management call backs.
*/
void pm_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
/* Set BASEPRI to 0 */
irq_unlock(0);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
LOG_DBG("Entering PM state suspend to idle");
cyhal_syspm_sleep();
break;
case PM_STATE_SUSPEND_TO_RAM:
LOG_DBG("Entering PM state suspend to RAM");
cyhal_syspm_deepsleep();
/*
* The HAL function doesn't clear this bit. It is a problem
* if the Zephyr idle function executes the wfi instruction
* with this bit set. We will always clear it here to avoid
* that situation.
*/
SCB_SCR &= (uint32_t)~SCB_SCR_SLEEPDEEP_Msk;
break;
default:
LOG_DBG("Unsupported power state %u", state);
break;
}
}
void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
case PM_STATE_SUSPEND_TO_RAM:
break;
default:
break;
}
}
int ifx_pm_init(void)
{
/* System Domain Idle Power Mode Configuration */
Cy_SysPm_SetDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP);
return cyhal_syspm_init();
}

View file

@ -11,10 +11,13 @@
#include <zephyr/device.h>
#include <zephyr/init.h>
#include <zephyr/kernel.h>
#include <cy_sysint.h>
#include <system_cat1b.h>
#include "cy_pdl.h"
extern int ifx_pm_init(void);
cy_en_sysint_status_t Cy_SysInt_Init(const cy_stc_sysint_t *config, cy_israddress userIsr)
{
CY_ASSERT_L3(CY_SYSINT_IS_PRIORITY_VALID(config->intrPriority));
@ -94,3 +97,10 @@ static int init_cycfg_platform_wrapper(void)
}
SYS_INIT(init_cycfg_platform_wrapper, PRE_KERNEL_1, 0);
#ifdef CONFIG_PM
void soc_early_init_hook(void)
{
ifx_pm_init();
}
#endif