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 2, 2024
1 parent c710f88 commit dfd6c7e
Show file tree
Hide file tree
Showing 9 changed files with 151 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
7 changes: 7 additions & 0 deletions soc/infineon/cat1b/cyw20829/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@

if SOC_DIE_CYW20829

config INFINEON_CAT1_LP_TIMER
bool
default n

config CORTEX_M_SYSTICK
default n if INFINEON_CAT1_LP_TIMER

config NUM_IRQS
default 70

Expand Down
106 changes: 106 additions & 0 deletions soc/infineon/cat1b/cyw20829/power.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* 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);

static uint32_t sleep_attempt_counts;
static uint32_t sleep_counts;
static uint32_t deepsleep_attempt_counts;
static uint32_t deepsleep_counts;
static int64_t last_sleep_start;
static int64_t last_sleep_duration;

void get_sleep_info(uint32_t *sleepattempts, uint32_t *sleepcounts, uint32_t *deepsleepattempts,
uint32_t *deepsleepcounts, int64_t *sleeptime)
{
*sleepattempts = sleep_attempt_counts;
*sleepcounts = sleep_counts;
*deepsleepattempts = deepsleep_attempt_counts;
*deepsleepcounts = deepsleep_counts;
*sleeptime = last_sleep_duration;
}

/*
* 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.
*/
__weak 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");
sleep_attempt_counts++;
last_sleep_start = k_uptime_ticks();
if (cyhal_syspm_sleep() == CY_RSLT_SUCCESS) {
sleep_counts++;
}

break;
case PM_STATE_SUSPEND_TO_RAM:
LOG_DBG("Entering PM state suspend to RAM");
deepsleep_attempt_counts++;
last_sleep_start = k_uptime_ticks();
if (cyhal_syspm_deepsleep() == CY_RSLT_SUCCESS) {
deepsleep_counts++;
}

/*
* 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;
}
}

__weak 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:
last_sleep_duration = last_sleep_start - k_uptime_ticks();
break;

default:
break;
}
}

static int ifx_pm_init(void)
{
#if defined(CONFIG_BOARD_CYW920829M2EVK_02)

/* System Domain Idle Power Mode Configuration */
Cy_SysPm_SetDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP);

#endif

return cyhal_syspm_init();
}

SYS_INIT(ifx_pm_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);
14 changes: 14 additions & 0 deletions soc/infineon/cat1b/cyw20829/power.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright (c) 2021 Cypress Semiconductor Corporation (an Infineon company) or
* an affiliate of Cypress Semiconductor Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef __IFX_POWER_H
#define __IFX_POWER_H

void get_sleep_info(uint32_t *sleepattempts, uint32_t *sleepcounts, uint32_t *deepsleepattempts,
uint32_t *deepsleepcounts, int64_t *sleeptime);

#endif

0 comments on commit dfd6c7e

Please sign in to comment.