mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-08 09:08:05 -04:00
145 lines
3.1 KiB
C
145 lines
3.1 KiB
C
/*
|
|
* 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 */
|