Skip to content

Commit

Permalink
soc: infineon: Support for power management on 20829
Browse files Browse the repository at this point in the history
- Initial changes in board, dts, and soc files to support
 system power management

Signed-off-by: Sreeram Tatapudi <[email protected]>
  • Loading branch information
sreeramIfx committed Oct 24, 2024
1 parent 318b495 commit 3cea7c8
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 1 deletion.
4 changes: 4 additions & 0 deletions boards/infineon/cyw920829m2evk_02/cyw920829m2evk_02.dts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ uart2: &scb2 {
status = "okay";
};

&mcwdt0 {
status = "okay";
};

&bluetooth {
status = "okay";
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#

# General configuration
CONFIG_CORTEX_M_SYSTICK=y
CONFIG_BUILD_OUTPUT_HEX=y
CONFIG_BUILD_OUTPUT_BIN=y

Expand Down
15 changes: 15 additions & 0 deletions dts/arm/infineon/cat1b/cyw20829/cyw20829.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -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>;
};
};
};

Expand Down
2 changes: 2 additions & 0 deletions modules/hal_infineon/mtb-pdl-cat1/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,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)
Expand Down
2 changes: 2 additions & 0 deletions soc/infineon/cat1b/cyw20829/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions soc/infineon/cat1b/cyw20829/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 6 additions & 0 deletions soc/infineon/cat1b/cyw20829/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
73 changes: 73 additions & 0 deletions soc/infineon/cat1b/cyw20829/power.c
Original file line number Diff line number Diff line change
@@ -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();
}
10 changes: 10 additions & 0 deletions soc/infineon/cat1b/cyw20829/soc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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

0 comments on commit 3cea7c8

Please sign in to comment.