xref: /openbmc/linux/drivers/soc/samsung/exynos-asv.h (revision 352bfbb3)
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 
__asv_get_table_entry(const struct exynos_asv_table * table,unsigned int row,unsigned int col)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 
exynos_asv_opp_get_voltage(const struct exynos_asv_subsys * subsys,unsigned int level,unsigned int group)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 
exynos_asv_opp_get_frequency(const struct exynos_asv_subsys * subsys,unsigned int level)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 
71*352bfbb3SKrzysztof Kozlowski int exynos_asv_init(struct device *dev, struct regmap *regmap);
72*352bfbb3SKrzysztof Kozlowski 
735ea42859SSylwester Nawrocki #endif /* __LINUX_SOC_EXYNOS_ASV_H */
74