Blame view

tools/omap/clocks_get_m_n.c 5.61 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
3776801d0   Aneesh V   omap4: add clock ...
2
3
4
5
6
7
8
9
  /*
   * Program for finding M & N values for DPLLs
   * To be run on Host PC
   *
   * (C) Copyright 2010
   * Texas Instruments, <www.ti.com>
   *
   * Aneesh V <aneesh@ti.com>
3776801d0   Aneesh V   omap4: add clock ...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
   */
  #include <stdlib.h>
  #include <stdio.h>
  typedef unsigned int u32;
  #define MAX_N	127
  
  /*
   * get_m_n_optimized() - Finds optimal DPLL multiplier(M) and divider(N)
   * values based on the reference frequency, required output frequency,
   * maximum tolerance for output frequency etc.
   *
   * target_freq_khz - output frequency required in KHz
   * ref_freq_khz - reference(input) frequency in KHz
   * m - pointer to computed M value
   * n - pointer to computed N value
   * tolerance_khz - tolerance for the output frequency. When the algorithm
   * succeeds in finding vialble M and N values the corresponding output
   * frequency will be in the range:
   *	[target_freq_khz - tolerance_khz, target_freq_khz]
   *
   * Formula:
   *	Fdpll = (2 * M * Fref) / (N + 1)
   *
   * Considerations for lock-time:
   *	- Smaller the N, better lock-time, especially lock-time will be
   *	- For acceptable lock-times:
   *		Fref / (M + 1) >= 1 MHz
   *
   * Considerations for power:
   *	- The difference in power for different N values giving the same
   *	  output is negligible. So, we optimize for lock-time
   *
   * Hard-constraints:
   *	- N can not be greater than 127(7 bit field for representing N)
   *
   * Usage:
   *	$ gcc clocks_get_m_n.c
   *	$ ./a.out
   */
28a181ff8   Aneesh V   omap: Improve PLL...
49
  int get_m_n_optimized(u32 target_freq_khz, u32 ref_freq_khz, u32 *M, u32 *N)
3776801d0   Aneesh V   omap4: add clock ...
50
  {
28a181ff8   Aneesh V   omap: Improve PLL...
51
52
53
54
  	u32 freq = target_freq_khz;
  	u32 m_optimal, n_optimal, freq_optimal = 0, freq_old;
  	u32 m, n;
  	n = 1;
3776801d0   Aneesh V   omap4: add clock ...
55
  	while (1) {
28a181ff8   Aneesh V   omap: Improve PLL...
56
  		m = target_freq_khz / ref_freq_khz / 2 * n;
3776801d0   Aneesh V   omap4: add clock ...
57
58
  		freq_old = 0;
  		while (1) {
28a181ff8   Aneesh V   omap: Improve PLL...
59
60
  			freq = ref_freq_khz * 2 * m / n;
  			if (freq > target_freq_khz) {
3776801d0   Aneesh V   omap4: add clock ...
61
  				freq = freq_old;
28a181ff8   Aneesh V   omap: Improve PLL...
62
  				m--;
3776801d0   Aneesh V   omap4: add clock ...
63
64
  				break;
  			}
28a181ff8   Aneesh V   omap: Improve PLL...
65
  			m++;
3776801d0   Aneesh V   omap4: add clock ...
66
67
  			freq_old = freq;
  		}
28a181ff8   Aneesh V   omap: Improve PLL...
68
69
70
71
72
73
74
75
  		if (freq > freq_optimal) {
  			freq_optimal = freq;
  			m_optimal = m;
  			n_optimal = n;
  		}
  		n++;
  		if ((freq_optimal == target_freq_khz) ||
  			((ref_freq_khz / n) < 1000)) {
3776801d0   Aneesh V   omap4: add clock ...
76
  			break;
3776801d0   Aneesh V   omap4: add clock ...
77
78
  		}
  	}
28a181ff8   Aneesh V   omap: Improve PLL...
79
80
81
82
83
84
  	n--;
  	*M = m_optimal;
  	*N = n_optimal - 1;
  	printf("ref %d m %d n %d target %d locked %d
  ", ref_freq_khz,
  		m_optimal, n_optimal - 1, target_freq_khz, freq_optimal);
3776801d0   Aneesh V   omap4: add clock ...
85
86
87
88
89
90
91
92
93
  	return 0;
  }
  
  void main(void)
  {
  	u32 m, n;
  	printf("
  MPU - 2000000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
94
95
96
97
98
99
100
  	get_m_n_optimized(2000000, 12000, &m, &n);
  	get_m_n_optimized(2000000, 13000, &m, &n);
  	get_m_n_optimized(2000000, 16800, &m, &n);
  	get_m_n_optimized(2000000, 19200, &m, &n);
  	get_m_n_optimized(2000000, 26000, &m, &n);
  	get_m_n_optimized(2000000, 27000, &m, &n);
  	get_m_n_optimized(2000000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
101
102
103
104
  
  	printf("
  MPU - 1200000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
105
106
107
108
109
110
111
  	get_m_n_optimized(1200000, 12000, &m, &n);
  	get_m_n_optimized(1200000, 13000, &m, &n);
  	get_m_n_optimized(1200000, 16800, &m, &n);
  	get_m_n_optimized(1200000, 19200, &m, &n);
  	get_m_n_optimized(1200000, 26000, &m, &n);
  	get_m_n_optimized(1200000, 27000, &m, &n);
  	get_m_n_optimized(1200000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
112
113
114
115
  
  	printf("
  MPU - 1584000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
116
117
118
119
120
121
122
  	get_m_n_optimized(1584000, 12000, &m, &n);
  	get_m_n_optimized(1584000, 13000, &m, &n);
  	get_m_n_optimized(1584000, 16800, &m, &n);
  	get_m_n_optimized(1584000, 19200, &m, &n);
  	get_m_n_optimized(1584000, 26000, &m, &n);
  	get_m_n_optimized(1584000, 27000, &m, &n);
  	get_m_n_optimized(1584000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
123
124
125
126
  
  	printf("
  Core 1600000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
127
128
129
130
131
132
133
  	get_m_n_optimized(1600000, 12000, &m, &n);
  	get_m_n_optimized(1600000, 13000, &m, &n);
  	get_m_n_optimized(1600000, 16800, &m, &n);
  	get_m_n_optimized(1600000, 19200, &m, &n);
  	get_m_n_optimized(1600000, 26000, &m, &n);
  	get_m_n_optimized(1600000, 27000, &m, &n);
  	get_m_n_optimized(1600000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
134
135
136
137
  
  	printf("
  PER 1536000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
138
139
140
141
142
143
144
  	get_m_n_optimized(1536000, 12000, &m, &n);
  	get_m_n_optimized(1536000, 13000, &m, &n);
  	get_m_n_optimized(1536000, 16800, &m, &n);
  	get_m_n_optimized(1536000, 19200, &m, &n);
  	get_m_n_optimized(1536000, 26000, &m, &n);
  	get_m_n_optimized(1536000, 27000, &m, &n);
  	get_m_n_optimized(1536000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
145
146
147
148
  
  	printf("
  IVA 1862000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  	get_m_n_optimized(1862000, 12000, &m, &n);
  	get_m_n_optimized(1862000, 13000, &m, &n);
  	get_m_n_optimized(1862000, 16800, &m, &n);
  	get_m_n_optimized(1862000, 19200, &m, &n);
  	get_m_n_optimized(1862000, 26000, &m, &n);
  	get_m_n_optimized(1862000, 27000, &m, &n);
  	get_m_n_optimized(1862000, 38400, &m, &n);
  
  	printf("
  IVA Nitro - 1290000
  ");
  	get_m_n_optimized(1290000, 12000, &m, &n);
  	get_m_n_optimized(1290000, 13000, &m, &n);
  	get_m_n_optimized(1290000, 16800, &m, &n);
  	get_m_n_optimized(1290000, 19200, &m, &n);
  	get_m_n_optimized(1290000, 26000, &m, &n);
  	get_m_n_optimized(1290000, 27000, &m, &n);
  	get_m_n_optimized(1290000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
167
168
169
170
  
  	printf("
  ABE 196608 sys clk
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
171
172
173
174
175
176
177
  	get_m_n_optimized(196608, 12000, &m, &n);
  	get_m_n_optimized(196608, 13000, &m, &n);
  	get_m_n_optimized(196608, 16800, &m, &n);
  	get_m_n_optimized(196608, 19200, &m, &n);
  	get_m_n_optimized(196608, 26000, &m, &n);
  	get_m_n_optimized(196608, 27000, &m, &n);
  	get_m_n_optimized(196608, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
178
179
180
181
  
  	printf("
  ABE 196608 32K
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
182
  	get_m_n_optimized(196608000/4, 32768, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
183
184
185
186
  
  	printf("
  USB 1920000
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
187
188
189
190
191
192
193
  	get_m_n_optimized(1920000, 12000, &m, &n);
  	get_m_n_optimized(1920000, 13000, &m, &n);
  	get_m_n_optimized(1920000, 16800, &m, &n);
  	get_m_n_optimized(1920000, 19200, &m, &n);
  	get_m_n_optimized(1920000, 26000, &m, &n);
  	get_m_n_optimized(1920000, 27000, &m, &n);
  	get_m_n_optimized(1920000, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
194
195
196
197
  
  	printf("
  Core ES1 1523712
  ");
28a181ff8   Aneesh V   omap: Improve PLL...
198
199
200
201
202
203
  	get_m_n_optimized(1524000, 12000, &m, &n);
  	get_m_n_optimized(1524000, 13000, &m, &n);
  	get_m_n_optimized(1524000, 16800, &m, &n);
  	get_m_n_optimized(1524000, 19200, &m, &n);
  	get_m_n_optimized(1524000, 26000, &m, &n);
  	get_m_n_optimized(1524000, 27000, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
204
205
  
  	/* exact recommendation for SDPs */
28a181ff8   Aneesh V   omap: Improve PLL...
206
  	get_m_n_optimized(1523712, 38400, &m, &n);
3776801d0   Aneesh V   omap4: add clock ...
207
208
  
  }