blob: 4deff2c2e22121004cec791a68f09ad6e1430767 [file] [log] [blame]
/* linux/arch/arm64/mach-exynos/include/mach/asv.h
*
* copyright (c) 2014 samsung electronics co., ltd.
* http://www.samsung.com/
*
* EXYNOS - Adaptive Support Voltage Source File
*
* 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 __ASM_ARCH_NEW_ASV_H
#define __ASM_ARCH_NEW_ASV_H __FILE__
#include <linux/io.h>
#define ASV_GRP_NR(_id) _id##_ASV_GRP_NR
#define DVFS_LEVEL_NR(_id) _id##_DVFS_LEVEL_NR
#define MAX_VOLT(_id) _id##_MAX_VOLT
#define MAX_VOLT_VER(_id, _ver) _id##_MAX_VOLT_##_ver
#define ABB_X060 0
#define ABB_X065 1
#define ABB_X070 2
#define ABB_X075 3
#define ABB_X080 4
#define ABB_X085 5
#define ABB_X090 6
#define ABB_X095 7
#define ABB_X100 8
#define ABB_X105 9
#define ABB_X110 10
#define ABB_X115 11
#define ABB_X120 12
#define ABB_X125 13
#define ABB_X130 14
#define ABB_X135 15
#define ABB_X140 16
#define ABB_X145 17
#define ABB_X150 18
#define ABB_X155 19
#define ABB_X160 20
#define ABB_BYPASS 255
#define ABB_INIT (0x80000080)
#define ABB_INIT_BYPASS (0x80000000)
#define MAX_ASV_GRP_NR 16
#define MAX_ASV_SUB_GRP_NR 3
static inline void set_abb(void __iomem *target_reg, unsigned int target_value)
{
unsigned int tmp;
if (target_value == ABB_BYPASS)
tmp = ABB_INIT_BYPASS;
else
tmp = (ABB_INIT | target_value);
__raw_writel(tmp , target_reg);
}
enum asv_type_id {
ID_CL1,
ID_CL0,
ID_INT,
ID_MIF,
ID_G3D,
ID_ISP,
ASV_TYPE_END,
};
/* define Struct for ASV common */
struct asv_common {
char lot_name[5];
unsigned int ids_value;
unsigned int hpm_value;
unsigned int (*init)(void);
unsigned int (*regist_asv_member)(void);
struct asv_common_ops_cal *ops_cal;
};
/* operation for CAL */
struct asv_ops_cal {
u32 (*get_vol)(u32, s32 eLvl);
u32 (*get_freq)(u32 id, s32 eLvl);
u32 (*get_abb)(u32 id, s32 eLvl);
u32 (*get_rcc)(u32 id, s32 eLvl);
bool (*get_use_abb)(u32 id);
void (*set_abb)(u32 id, u32 eAbb);
u32 (*set_rcc)(u32 id, s32 level, u32 rcc);
u32 (*get_group)(u32 id, s32 level);
u32 (*get_sub_grp_idx)(u32 id, s32 level);
};
struct asv_common_ops_cal {
u32 (*get_max_volt)(u32 id);
s32 (*get_min_lv)(u32 id);
void (*init)(void);
u32 (*get_table_ver)(void);
bool (*is_fused_sp_gr)(void);
u32 (*get_asv_gr)(void);
u32 (*get_ids)(void);
u32 (*get_hpm)(void);
void (*set_rcc_limit_info)(void);
};
struct asv_freq_table {
unsigned int asv_freq;
unsigned int asv_value;
};
struct asv_grp_table {
unsigned int asv_sub_idx;
unsigned int asv_grp;
};
/* define struct for information of each ASV type */
struct asv_info {
struct list_head node;
enum asv_type_id asv_type;
const char *name;
struct asv_ops *ops;
unsigned int asv_group_nr;
unsigned int dvfs_level_nr;
unsigned int result_asv_grp;
unsigned int max_volt_value;
struct asv_freq_table *asv_volt;
struct asv_freq_table *asv_abb;
struct asv_freq_table *asv_rcc;
struct abb_common *abb_info;
struct asv_ops_cal *ops_cal;
struct asv_grp_table *asv_sub_grp;
};
/* Struct for ABB function */
struct abb_common {
unsigned int target_abb;
void (*set_target_abb)(struct asv_info *asv_inform);
};
/* Operation for ASV*/
struct asv_ops {
unsigned int (*get_asv_group)(struct asv_common *asv_comm);
void (*set_asv_info)(struct asv_info *asv_inform,
bool show_value);
unsigned int (*get_asv_sub_group)(struct asv_info *asv_inform,
unsigned int lv);
void (*set_rcc_info)(struct asv_info *asv_inform);
};
/* define function for common asv */
extern void add_asv_member(struct asv_info *exynos_asv_info);
extern struct asv_info *asv_get(enum asv_type_id exynos_asv_type_id);
#if defined (CONFIG_EXYNOS_ASV)
extern unsigned int get_match_volt(enum asv_type_id target_type, unsigned int target_freq);
/* define function for initialize of SoC */
extern int exynos_init_asv(struct asv_common *asv_info);
extern unsigned int exynos_get_table_ver(void);
extern void exynos_set_ema(enum asv_type_id type, unsigned int volt);
extern unsigned int exynos_get_asv_info(int id);
extern unsigned int get_sub_grp_match_asv_grp(enum asv_type_id target_type, unsigned int lv);
#else
static inline int get_match_volt(enum asv_type_id target_type, unsigned int target_freq){return 0;}
static inline int exynos_init_asv(struct asv_common *asv_info){return 0;}
static inline unsigned int exynos_get_table_ver(void){return 0;}
static inline void exynos_set_ema(enum asv_type_id type, unsigned int volt){};
static inline unsigned int exynos_get_asv_info(int id){return 0;};
extern inline unsigned int get_sub_grp_match_asv_grp(enum asv_type_id target_type, unsigned int lv){return 0;}
#endif
#if defined (CONFIG_EXYNOS_ASV_DYNAMIC_ABB)
extern unsigned int get_match_abb(enum asv_type_id target_type, unsigned int target_freq);
extern unsigned int set_match_abb(enum asv_type_id target_type, unsigned int target_abb);
extern bool is_set_abb_first(enum asv_type_id target_type, unsigned int old_freq, unsigned int target_freq);
#else
static inline unsigned int get_match_abb(enum asv_type_id target_type, unsigned int target_freq)
{return ABB_BYPASS;}
static inline unsigned int set_match_abb(enum asv_type_id target_type, unsigned int target_abb)
{return 0;}
static inline bool is_set_abb_first(enum asv_type_id target_type, unsigned int old_freq, unsigned int target_freq)
{return false;}
#endif
#ifdef CONFIG_EXYNOS_ASV_SUPPORT_RCC
extern void set_rcc_info(void);
#else
static inline void set_rcc_info(void){};
#endif
#endif /* __ASM_ARCH_NEW_ASV_H */