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:
parent
041f9821ca
commit
0a9c0f4017
9 changed files with 113 additions and 1 deletions
|
@ -81,6 +81,10 @@ uart2: &scb2 {
|
|||
status = "okay";
|
||||
};
|
||||
|
||||
&mcwdt0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bluetooth {
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
#
|
||||
|
||||
# General configuration
|
||||
CONFIG_CORTEX_M_SYSTICK=y
|
||||
CONFIG_BUILD_OUTPUT_HEX=y
|
||||
CONFIG_BUILD_OUTPUT_BIN=y
|
||||
|
||||
|
|
|
@ -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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,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
|
||||
|
||||
|
|
73
soc/infineon/cat1b/cyw20829/power.c
Normal file
73
soc/infineon/cat1b/cyw20829/power.c
Normal 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();
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue