blob: 774bcea819c13bfde91ef277418bfc8ce8400682 [file] [log] [blame]
/*
* Copyright (c) 2019 Microchip Technology Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __DEVICE_POWER_H
#define __DEVICE_POWER_H
#ifndef _ASMLANGUAGE
#define DEBUG_SLEEP
#define DEBUG_DEEP_SLEEP_CLK_REQ
/*
* Disable UART deep sleep save/restore. If a UART TX FIFO has data on deep
* sleep entry it will de-assert its CLK_REQ once TX FIFO empties. If the
* UART has TX empty interrupt enabled then the system will wake.
*/
/* #define DEEP_SLEEP_UART_SAVE_RESTORE */
/* Enable SoC control over peripherals only when drivers do not support
* power management
*/
#ifndef CONFIG_PM_DEVICE
/* Comment out to use JTAG without interruptions.
* Beware this blocks PLL going off, hence should be enabled
* for power consumption measurements
* Note: To attach JTAG for any debug need to be performed with breakpoint
* prior to deep sleep entry.
*/
/* #define DEEP_SLEEP_JTAG */
/*
* Enabling this would take a snapshot from clock requested values,
* these can be dump on exit to identify which HW block is blocking.
*/
#define DEEP_SLEEP_CLK_REQ_DUMP
/*
* Some peripherals if enabled always assert their CLK_REQ bits.
* For example, any peripheral with a clock generator such as
* timers, counters, UART, etc. We save the enables for these
* peripherals, disable them, and restore the enabled state upon
* wake.
*/
#define DEEP_SLEEP_PERIPH_SAVE_RESTORE
/* Power optimization if certain HW blocks are not used.
* These are not part of any Zephyr subsystem.
* #define DEEP_SLEEP_PERIPH_SAVE_RESTORE_EXTENDED
*/
#define DEEP_SLEEP_PERIPH_SAVE_RESTORE_EXTENDED
#define NUM_DS_TIMER_ENTRIES 6
struct ds_timer_info {
uintptr_t addr;
uint32_t stop_mask;
uint32_t restore_mask;
};
struct ds_peci_info {
uint32_t peci_ctrl;
uint32_t peci_dis;
};
struct ds_dev_info {
uint32_t ecs[2];
uint32_t timers[NUM_DS_TIMER_ENTRIES];
#ifdef DEEP_SLEEP_UART_SAVE_RESTORE
uint8_t uart_info[MCHP_UART_INSTANCES];
#endif
/* Analog power */
#ifdef CONFIG_PECI
struct ds_peci_info peci_info;
#endif
#ifdef CONFIG_I2C
uint32_t smb_info[MCHP_I2C_SMB_INSTANCES];
#endif
uint32_t slwclk_info;
uint8_t tfdp_en;
uint8_t comp_en;
};
#endif /* CONFIG_PM_DEVICE */
void soc_deep_sleep_periph_save(void);
void soc_deep_sleep_periph_restore(void);
void soc_deep_sleep_non_wake_en(void);
void soc_deep_sleep_non_wake_dis(void);
void soc_deep_sleep_wake_en(void);
void soc_deep_sleep_wake_dis(void);
#ifdef DEBUG_DEEP_SLEEP_CLK_REQ
void soc_debug_sleep_clk_req(void);
#endif
#endif /* _ASMLANGUAGE */
#endif /* __DEVICE_POWER_H */