xref: /linux/drivers/clk/tegra/cvb.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*1802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2fa63aa3dSTuomas Tynkkynen /*
3fa63aa3dSTuomas Tynkkynen  * Utility functions for parsing Tegra CVB voltage tables
4fa63aa3dSTuomas Tynkkynen  */
5fa63aa3dSTuomas Tynkkynen 
6fa63aa3dSTuomas Tynkkynen #ifndef __DRIVERS_CLK_TEGRA_CVB_H
7fa63aa3dSTuomas Tynkkynen #define __DRIVERS_CLK_TEGRA_CVB_H
8fa63aa3dSTuomas Tynkkynen 
9fa63aa3dSTuomas Tynkkynen #include <linux/types.h>
10fa63aa3dSTuomas Tynkkynen 
11fa63aa3dSTuomas Tynkkynen struct device;
12fa63aa3dSTuomas Tynkkynen 
13fa63aa3dSTuomas Tynkkynen #define MAX_DVFS_FREQS	40
14fa63aa3dSTuomas Tynkkynen 
15fa63aa3dSTuomas Tynkkynen struct rail_alignment {
16fa63aa3dSTuomas Tynkkynen 	int offset_uv;
17fa63aa3dSTuomas Tynkkynen 	int step_uv;
18fa63aa3dSTuomas Tynkkynen };
19fa63aa3dSTuomas Tynkkynen 
20fa63aa3dSTuomas Tynkkynen struct cvb_coefficients {
21fa63aa3dSTuomas Tynkkynen 	int c0;
22fa63aa3dSTuomas Tynkkynen 	int c1;
23fa63aa3dSTuomas Tynkkynen 	int c2;
24fa63aa3dSTuomas Tynkkynen };
25fa63aa3dSTuomas Tynkkynen 
26fa63aa3dSTuomas Tynkkynen struct cvb_table_freq_entry {
27fa63aa3dSTuomas Tynkkynen 	unsigned long freq;
28fa63aa3dSTuomas Tynkkynen 	struct cvb_coefficients coefficients;
29fa63aa3dSTuomas Tynkkynen };
30fa63aa3dSTuomas Tynkkynen 
31fa63aa3dSTuomas Tynkkynen struct cvb_cpu_dfll_data {
32fa63aa3dSTuomas Tynkkynen 	u32 tune0_low;
33fa63aa3dSTuomas Tynkkynen 	u32 tune0_high;
34fa63aa3dSTuomas Tynkkynen 	u32 tune1;
352b2dbc2fSJoseph Lo 	unsigned int tune_high_min_millivolts;
36fa63aa3dSTuomas Tynkkynen };
37fa63aa3dSTuomas Tynkkynen 
38fa63aa3dSTuomas Tynkkynen struct cvb_table {
39fa63aa3dSTuomas Tynkkynen 	int speedo_id;
40fa63aa3dSTuomas Tynkkynen 	int process_id;
41fa63aa3dSTuomas Tynkkynen 
42fa63aa3dSTuomas Tynkkynen 	int min_millivolts;
43fa63aa3dSTuomas Tynkkynen 	int max_millivolts;
44fa63aa3dSTuomas Tynkkynen 
45fa63aa3dSTuomas Tynkkynen 	int speedo_scale;
46fa63aa3dSTuomas Tynkkynen 	int voltage_scale;
47e8f6a68cSThierry Reding 	struct cvb_table_freq_entry entries[MAX_DVFS_FREQS];
48fa63aa3dSTuomas Tynkkynen 	struct cvb_cpu_dfll_data cpu_dfll_data;
49fa63aa3dSTuomas Tynkkynen };
50fa63aa3dSTuomas Tynkkynen 
51e8f6a68cSThierry Reding const struct cvb_table *
52e8f6a68cSThierry Reding tegra_cvb_add_opp_table(struct device *dev, const struct cvb_table *cvb_tables,
53b3cf8d06SJoseph Lo 			size_t count, struct rail_alignment *align,
54b3cf8d06SJoseph Lo 			int process_id, int speedo_id, int speedo_value,
55b3cf8d06SJoseph Lo 			unsigned long max_freq);
56f7c42d98SThierry Reding void tegra_cvb_remove_opp_table(struct device *dev,
57f7c42d98SThierry Reding 				const struct cvb_table *table,
58f7c42d98SThierry Reding 				unsigned long max_freq);
59fa63aa3dSTuomas Tynkkynen 
60fa63aa3dSTuomas Tynkkynen #endif
61