/* * Copyright (c) 2015 Samsung Electronics Co., Ltd. * http://www.samsung.com/ * * EXYNOS - PMU(Power Management Unit) support * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __EXYNOS_POWERMODE_H #define __EXYNOS_POWERMODE_H __FILE__ #if defined(CONFIG_PMUCAL_MOD) #include "../../../drivers/soc/samsung/pwrcal/pmucal_mod/pmucal_system.h" #endif #if !defined(CONFIG_PMUCAL_MOD) /** * System power down mode */ #if defined(CONFIG_SOC_EXYNOS7570) enum sys_powerdown { SYS_SICD, SYS_AFTR, SYS_STOP, SYS_LPD, SYS_LPA, SYS_DSTOP, SYS_SLEEP, NUM_SYS_POWERDOWN, }; #else enum sys_powerdown { SYS_SICD, #if !defined(CONFIG_SOC_EXYNOS7870) SYS_SICD_CPD, #endif SYS_AFTR, SYS_STOP, #if !defined(CONFIG_SOC_EXYNOS7870) SYS_DSTOP, #endif SYS_LPD, #if !defined(CONFIG_SOC_EXYNOS7870) SYS_ALPA, #endif SYS_SLEEP, NUM_SYS_POWERDOWN, }; #endif #endif extern void exynos_prepare_sys_powerdown(enum sys_powerdown mode, bool is_suspend); extern void exynos_wakeup_sys_powerdown(enum sys_powerdown mode, bool early_wakeup); extern int determine_lpm(void); /** * Functions for cpuidle driver */ extern int enter_c2(unsigned int cpu, int index); extern void wakeup_from_c2(unsigned int cpu, int early_wakeup); /** * Cluster power down blocker */ extern void block_cpd(void); extern void release_cpd(void); /** * Checking cluster idle state */ extern int check_cluster_idle_state(unsigned int cpu); /** IDLE_IP control */ #define IDLE_IP_REG_SIZE 32 #define IDLE_IP_MAX_INDEX 127 #define IDLE_IP_FIX_INDEX_COUNT 2 #define IDLE_IP_MAX_CONFIGURABLE_INDEX (IDLE_IP_MAX_INDEX - IDLE_IP_FIX_INDEX_COUNT) #ifdef CONFIG_CPU_IDLE void exynos_update_ip_idle_status(int index, int idle); int exynos_get_idle_ip_index(const char *name); void exynos_get_idle_ip_list(char *(*idle_ip_list)[IDLE_IP_REG_SIZE]); #else static inline void exynos_update_ip_idle_status(int index, int idle) { return; } static inline int exynos_get_idle_ip_index(const char *name) { return 0; } static inline void exynos_get_idle_ip_list(char *(*idle_ip_list)[IDLE_IP_REG_SIZE]) { return; } #endif enum exynos_idle_ip { IDLE_IP0, IDLE_IP1, IDLE_IP2, IDLE_IP3, NUM_IDLE_IP, }; #define MAX_CLUSTER 2 /** IDLE_IP control */ #define for_each_idle_ip(num) \ for ((num) = 0; (num) < NUM_IDLE_IP; (num)++) #define for_each_syspower_mode(mode) \ for ((mode) = 0; (mode) < NUM_SYS_POWERDOWN; (mode)++) #define for_each_cluster(id) \ for ((id) = 0; (id) < MAX_CLUSTER; (id)++) /** * external driver APIs */ #ifdef CONFIG_SERIAL_SAMSUNG extern void s3c24xx_serial_fifo_wait(void); #else static inline void s3c24xx_serial_fifo_wait(void) { } #endif #ifdef CONFIG_PINCTRL_EXYNOS extern u64 exynos_get_eint_wake_mask(void); #else static inline u64 exynos_get_eint_wake_mask(void) { return 0xffffffffL; } #endif #define EXYNOS_SS_SICD_INDEX ('S' + 'I' + 'C' + 'D') /* 291 */ #endif /* __EXYNOS_POWERMODE_H */