15ea42859SSylwester Nawrocki /* SPDX-License-Identifier: GPL-2.0 */ 25ea42859SSylwester Nawrocki /* 35ea42859SSylwester Nawrocki * Copyright (c) 2019 Samsung Electronics Co., Ltd. 45ea42859SSylwester Nawrocki * http://www.samsung.com/ 55ea42859SSylwester Nawrocki * Author: Sylwester Nawrocki <s.nawrocki@samsung.com> 65ea42859SSylwester Nawrocki * 75ea42859SSylwester Nawrocki * Samsung Exynos SoC Adaptive Supply Voltage support 85ea42859SSylwester Nawrocki */ 95ea42859SSylwester Nawrocki #ifndef __LINUX_SOC_EXYNOS_ASV_H 105ea42859SSylwester Nawrocki #define __LINUX_SOC_EXYNOS_ASV_H 115ea42859SSylwester Nawrocki 125ea42859SSylwester Nawrocki struct regmap; 135ea42859SSylwester Nawrocki 145ea42859SSylwester Nawrocki /* HPM, IDS values to select target group */ 155ea42859SSylwester Nawrocki struct asv_limit_entry { 165ea42859SSylwester Nawrocki unsigned int hpm; 175ea42859SSylwester Nawrocki unsigned int ids; 185ea42859SSylwester Nawrocki }; 195ea42859SSylwester Nawrocki 205ea42859SSylwester Nawrocki struct exynos_asv_table { 215ea42859SSylwester Nawrocki unsigned int num_rows; 225ea42859SSylwester Nawrocki unsigned int num_cols; 235ea42859SSylwester Nawrocki u32 *buf; 245ea42859SSylwester Nawrocki }; 255ea42859SSylwester Nawrocki 265ea42859SSylwester Nawrocki struct exynos_asv_subsys { 275ea42859SSylwester Nawrocki struct exynos_asv *asv; 285ea42859SSylwester Nawrocki const char *cpu_dt_compat; 295ea42859SSylwester Nawrocki int id; 305ea42859SSylwester Nawrocki struct exynos_asv_table table; 315ea42859SSylwester Nawrocki 325ea42859SSylwester Nawrocki unsigned int base_volt; 335ea42859SSylwester Nawrocki unsigned int offset_volt_h; 345ea42859SSylwester Nawrocki unsigned int offset_volt_l; 355ea42859SSylwester Nawrocki }; 365ea42859SSylwester Nawrocki 375ea42859SSylwester Nawrocki struct exynos_asv { 385ea42859SSylwester Nawrocki struct device *dev; 395ea42859SSylwester Nawrocki struct regmap *chipid_regmap; 405ea42859SSylwester Nawrocki struct exynos_asv_subsys subsys[2]; 415ea42859SSylwester Nawrocki 425ea42859SSylwester Nawrocki int (*opp_get_voltage)(const struct exynos_asv_subsys *subs, 435ea42859SSylwester Nawrocki int level, unsigned int voltage); 445ea42859SSylwester Nawrocki unsigned int group; 455ea42859SSylwester Nawrocki unsigned int table; 465ea42859SSylwester Nawrocki 475ea42859SSylwester Nawrocki /* True if SG fields from PKG_ID register should be used */ 485ea42859SSylwester Nawrocki bool use_sg; 495ea42859SSylwester Nawrocki /* ASV bin read from DT */ 505ea42859SSylwester Nawrocki int of_bin; 515ea42859SSylwester Nawrocki }; 525ea42859SSylwester Nawrocki 535ea42859SSylwester Nawrocki static inline u32 __asv_get_table_entry(const struct exynos_asv_table *table, 545ea42859SSylwester Nawrocki unsigned int row, unsigned int col) 555ea42859SSylwester Nawrocki { 565ea42859SSylwester Nawrocki return table->buf[row * (table->num_cols) + col]; 575ea42859SSylwester Nawrocki } 585ea42859SSylwester Nawrocki 595ea42859SSylwester Nawrocki static inline u32 exynos_asv_opp_get_voltage(const struct exynos_asv_subsys *subsys, 605ea42859SSylwester Nawrocki unsigned int level, unsigned int group) 615ea42859SSylwester Nawrocki { 625ea42859SSylwester Nawrocki return __asv_get_table_entry(&subsys->table, level, group + 1); 635ea42859SSylwester Nawrocki } 645ea42859SSylwester Nawrocki 655ea42859SSylwester Nawrocki static inline u32 exynos_asv_opp_get_frequency(const struct exynos_asv_subsys *subsys, 665ea42859SSylwester Nawrocki unsigned int level) 675ea42859SSylwester Nawrocki { 685ea42859SSylwester Nawrocki return __asv_get_table_entry(&subsys->table, level, 0); 695ea42859SSylwester Nawrocki } 705ea42859SSylwester Nawrocki 715ea42859SSylwester Nawrocki #endif /* __LINUX_SOC_EXYNOS_ASV_H */ 72