Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1* Generic Exynos Bus frequency device
2
3The Samsung Exynos SoC has many buses for data transfer between DRAM
4and sub-blocks in SoC. Most Exynos SoCs share the common architecture
5for buses. Generally, each bus of Exynos SoC includes a source clock
6and a power line, which are able to change the clock frequency
7of the bus in runtime. To monitor the usage of each bus in runtime,
8the driver uses the PPMU (Platform Performance Monitoring Unit), which
9is able to measure the current load of sub-blocks.
10
11The Exynos SoC includes the various sub-blocks which have the each AXI bus.
12The each AXI bus has the owned source clock but, has not the only owned
13power line. The power line might be shared among one more sub-blocks.
14So, we can divide into two type of device as the role of each sub-block.
15There are two type of bus devices as following:
16- parent bus device
17- passive bus device
18
19Basically, parent and passive bus device share the same power line.
20The parent bus device can only change the voltage of shared power line
21and the rest bus devices (passive bus device) depend on the decision of
22the parent bus device. If there are three blocks which share the VDD_xxx
23power line, Only one block should be parent device and then the rest blocks
24should depend on the parent device as passive device.
25
26 VDD_xxx |--- A block (parent)
27 |--- B block (passive)
28 |--- C block (passive)
29
30There are a little different composition among Exynos SoC because each Exynos
31SoC has different sub-blocks. Therefore, such difference should be specified
32in devicetree file instead of each device driver. In result, this driver
33is able to support the bus frequency for all Exynos SoCs.
34
35Required properties for all bus devices:
36- compatible: Should be "samsung,exynos-bus".
37- clock-names : the name of clock used by the bus, "bus".
38- clocks : phandles for clock specified in "clock-names" property.
39- operating-points-v2: the OPP table including frequency/voltage information
40 to support DVFS (Dynamic Voltage/Frequency Scaling) feature.
41
42Required properties only for parent bus device:
43- vdd-supply: the regulator to provide the buses with the voltage.
44- devfreq-events: the devfreq-event device to monitor the current utilization
45 of buses.
46
47Required properties only for passive bus device:
48- devfreq: the parent bus device.
49
50Optional properties only for parent bus device:
51- exynos,saturation-ratio: the percentage value which is used to calibrate
52 the performance count against total cycle count.
53- exynos,voltage-tolerance: the percentage value for bus voltage tolerance
54 which is used to calculate the max voltage.
55
56Detailed correlation between sub-blocks and power line according to Exynos SoC:
57- In case of Exynos3250, there are two power line as following:
58 VDD_MIF |--- DMC
59
60 VDD_INT |--- LEFTBUS (parent device)
61 |--- PERIL
62 |--- MFC
63 |--- G3D
64 |--- RIGHTBUS
65 |--- PERIR
66 |--- FSYS
67 |--- LCD0
68 |--- PERIR
69 |--- ISP
70 |--- CAM
71
72- In case of Exynos4210, there is one power line as following:
73 VDD_INT |--- DMC (parent device)
74 |--- LEFTBUS
75 |--- PERIL
76 |--- MFC(L)
77 |--- G3D
78 |--- TV
79 |--- LCD0
80 |--- RIGHTBUS
81 |--- PERIR
82 |--- MFC(R)
83 |--- CAM
84 |--- FSYS
85 |--- GPS
86 |--- LCD0
87 |--- LCD1
88
89- In case of Exynos4x12, there are two power line as following:
90 VDD_MIF |--- DMC
91
92 VDD_INT |--- LEFTBUS (parent device)
93 |--- PERIL
94 |--- MFC(L)
95 |--- G3D
96 |--- TV
97 |--- IMAGE
98 |--- RIGHTBUS
99 |--- PERIR
100 |--- MFC(R)
101 |--- CAM
102 |--- FSYS
103 |--- GPS
104 |--- LCD0
105 |--- ISP
106
107- In case of Exynos5422, there are two power line as following:
108 VDD_MIF |--- DREX 0 (parent device, DRAM EXpress controller)
109 |--- DREX 1
110
111 VDD_INT |--- NoC_Core (parent device)
112 |--- G2D
113 |--- G3D
114 |--- DISP1
115 |--- NoC_WCORE
116 |--- GSCL
117 |--- MSCL
118 |--- ISP
119 |--- MFC
120 |--- GEN
121 |--- PERIS
122 |--- PERIC
123 |--- FSYS
124 |--- FSYS2
125
126- In case of Exynos5433, there is VDD_INT power line as following:
127 VDD_INT |--- G2D (parent device)
128 |--- MSCL
129 |--- GSCL
130 |--- JPEG
131 |--- MFC
132 |--- HEVC
133 |--- BUS0
134 |--- BUS1
135 |--- BUS2
136 |--- PERIS (Fixed clock rate)
137 |--- PERIC (Fixed clock rate)
138 |--- FSYS (Fixed clock rate)
139
140Example1:
141 Show the AXI buses of Exynos3250 SoC. Exynos3250 divides the buses to
142 power line (regulator). The MIF (Memory Interface) AXI bus is used to
143 transfer data between DRAM and CPU and uses the VDD_MIF regulator.
144
145 - MIF (Memory Interface) block
146 : VDD_MIF |--- DMC (Dynamic Memory Controller)
147
148 - INT (Internal) block
149 : VDD_INT |--- LEFTBUS (parent device)
150 |--- PERIL
151 |--- MFC
152 |--- G3D
153 |--- RIGHTBUS
154 |--- FSYS
155 |--- LCD0
156 |--- PERIR
157 |--- ISP
158 |--- CAM
159
160 - MIF bus's frequency/voltage table
161 -----------------------
162 |Lv| Freq | Voltage |
163 -----------------------
164 |L1| 50000 |800000 |
165 |L2| 100000 |800000 |
166 |L3| 134000 |800000 |
167 |L4| 200000 |825000 |
168 |L5| 400000 |875000 |
169 -----------------------
170
171 - INT bus's frequency/voltage table
172 ----------------------------------------------------------
173 |Block|LEFTBUS|RIGHTBUS|MCUISP |ISP |PERIL ||VDD_INT |
174 | name| |LCD0 | | | || |
175 | | |FSYS | | | || |
176 | | |MFC | | | || |
177 ----------------------------------------------------------
178 |Mode |*parent|passive |passive|passive|passive|| |
179 ----------------------------------------------------------
180 |Lv |Frequency ||Voltage |
181 ----------------------------------------------------------
182 |L1 |50000 |50000 |50000 |50000 |50000 ||900000 |
183 |L2 |80000 |80000 |80000 |80000 |80000 ||900000 |
184 |L3 |100000 |100000 |100000 |100000 |100000 ||1000000 |
185 |L4 |134000 |134000 |200000 |200000 | ||1000000 |
186 |L5 |200000 |200000 |400000 |300000 | ||1000000 |
187 ----------------------------------------------------------
188
189Example2 :
190 The bus of DMC (Dynamic Memory Controller) block in exynos3250.dtsi
191 is listed below:
192
193 bus_dmc: bus_dmc {
194 compatible = "samsung,exynos-bus";
195 clocks = <&cmu_dmc CLK_DIV_DMC>;
196 clock-names = "bus";
197 operating-points-v2 = <&bus_dmc_opp_table>;
198 status = "disabled";
199 };
200
201 bus_dmc_opp_table: opp_table1 {
202 compatible = "operating-points-v2";
203 opp-shared;
204
205 opp-50000000 {
206 opp-hz = /bits/ 64 <50000000>;
207 opp-microvolt = <800000>;
208 };
209 opp-100000000 {
210 opp-hz = /bits/ 64 <100000000>;
211 opp-microvolt = <800000>;
212 };
213 opp-134000000 {
214 opp-hz = /bits/ 64 <134000000>;
215 opp-microvolt = <800000>;
216 };
217 opp-200000000 {
218 opp-hz = /bits/ 64 <200000000>;
219 opp-microvolt = <825000>;
220 };
221 opp-400000000 {
222 opp-hz = /bits/ 64 <400000000>;
223 opp-microvolt = <875000>;
224 };
225 };
226
227 bus_leftbus: bus_leftbus {
228 compatible = "samsung,exynos-bus";
229 clocks = <&cmu CLK_DIV_GDL>;
230 clock-names = "bus";
231 operating-points-v2 = <&bus_leftbus_opp_table>;
232 status = "disabled";
233 };
234
235 bus_rightbus: bus_rightbus {
236 compatible = "samsung,exynos-bus";
237 clocks = <&cmu CLK_DIV_GDR>;
238 clock-names = "bus";
239 operating-points-v2 = <&bus_leftbus_opp_table>;
240 status = "disabled";
241 };
242
243 bus_lcd0: bus_lcd0 {
244 compatible = "samsung,exynos-bus";
245 clocks = <&cmu CLK_DIV_ACLK_160>;
246 clock-names = "bus";
247 operating-points-v2 = <&bus_leftbus_opp_table>;
248 status = "disabled";
249 };
250
251 bus_fsys: bus_fsys {
252 compatible = "samsung,exynos-bus";
253 clocks = <&cmu CLK_DIV_ACLK_200>;
254 clock-names = "bus";
255 operating-points-v2 = <&bus_leftbus_opp_table>;
256 status = "disabled";
257 };
258
259 bus_mcuisp: bus_mcuisp {
260 compatible = "samsung,exynos-bus";
261 clocks = <&cmu CLK_DIV_ACLK_400_MCUISP>;
262 clock-names = "bus";
263 operating-points-v2 = <&bus_mcuisp_opp_table>;
264 status = "disabled";
265 };
266
267 bus_isp: bus_isp {
268 compatible = "samsung,exynos-bus";
269 clocks = <&cmu CLK_DIV_ACLK_266>;
270 clock-names = "bus";
271 operating-points-v2 = <&bus_isp_opp_table>;
272 status = "disabled";
273 };
274
275 bus_peril: bus_peril {
276 compatible = "samsung,exynos-bus";
277 clocks = <&cmu CLK_DIV_ACLK_100>;
278 clock-names = "bus";
279 operating-points-v2 = <&bus_peril_opp_table>;
280 status = "disabled";
281 };
282
283 bus_mfc: bus_mfc {
284 compatible = "samsung,exynos-bus";
285 clocks = <&cmu CLK_SCLK_MFC>;
286 clock-names = "bus";
287 operating-points-v2 = <&bus_leftbus_opp_table>;
288 status = "disabled";
289 };
290
291 bus_leftbus_opp_table: opp_table1 {
292 compatible = "operating-points-v2";
293 opp-shared;
294
295 opp-50000000 {
296 opp-hz = /bits/ 64 <50000000>;
297 opp-microvolt = <900000>;
298 };
299 opp-80000000 {
300 opp-hz = /bits/ 64 <80000000>;
301 opp-microvolt = <900000>;
302 };
303 opp-100000000 {
304 opp-hz = /bits/ 64 <100000000>;
305 opp-microvolt = <1000000>;
306 };
307 opp-134000000 {
308 opp-hz = /bits/ 64 <134000000>;
309 opp-microvolt = <1000000>;
310 };
311 opp-200000000 {
312 opp-hz = /bits/ 64 <200000000>;
313 opp-microvolt = <1000000>;
314 };
315 };
316
317 bus_mcuisp_opp_table: opp_table2 {
318 compatible = "operating-points-v2";
319 opp-shared;
320
321 opp-50000000 {
322 opp-hz = /bits/ 64 <50000000>;
323 };
324 opp-80000000 {
325 opp-hz = /bits/ 64 <80000000>;
326 };
327 opp-100000000 {
328 opp-hz = /bits/ 64 <100000000>;
329 };
330 opp-200000000 {
331 opp-hz = /bits/ 64 <200000000>;
332 };
333 opp-400000000 {
334 opp-hz = /bits/ 64 <400000000>;
335 };
336 };
337
338 bus_isp_opp_table: opp_table3 {
339 compatible = "operating-points-v2";
340 opp-shared;
341
342 opp-50000000 {
343 opp-hz = /bits/ 64 <50000000>;
344 };
345 opp-80000000 {
346 opp-hz = /bits/ 64 <80000000>;
347 };
348 opp-100000000 {
349 opp-hz = /bits/ 64 <100000000>;
350 };
351 opp-200000000 {
352 opp-hz = /bits/ 64 <200000000>;
353 };
354 opp-300000000 {
355 opp-hz = /bits/ 64 <300000000>;
356 };
357 };
358
359 bus_peril_opp_table: opp_table4 {
360 compatible = "operating-points-v2";
361 opp-shared;
362
363 opp-50000000 {
364 opp-hz = /bits/ 64 <50000000>;
365 };
366 opp-80000000 {
367 opp-hz = /bits/ 64 <80000000>;
368 };
369 opp-100000000 {
370 opp-hz = /bits/ 64 <100000000>;
371 };
372 };
373
374
375 Usage case to handle the frequency and voltage of bus on runtime
376 in exynos3250-rinato.dts is listed below:
377
378 &bus_dmc {
379 devfreq-events = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
380 vdd-supply = <&buck1_reg>; /* VDD_MIF */
381 status = "okay";
382 };
383
384 &bus_leftbus {
385 devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>;
386 vdd-supply = <&buck3_reg>;
387 status = "okay";
388 };
389
390 &bus_rightbus {
391 devfreq = <&bus_leftbus>;
392 status = "okay";
393 };
394
395 &bus_lcd0 {
396 devfreq = <&bus_leftbus>;
397 status = "okay";
398 };
399
400 &bus_fsys {
401 devfreq = <&bus_leftbus>;
402 status = "okay";
403 };
404
405 &bus_mcuisp {
406 devfreq = <&bus_leftbus>;
407 status = "okay";
408 };
409
410 &bus_isp {
411 devfreq = <&bus_leftbus>;
412 status = "okay";
413 };
414
415 &bus_peril {
416 devfreq = <&bus_leftbus>;
417 status = "okay";
418 };
419
420 &bus_mfc {
421 devfreq = <&bus_leftbus>;
422 status = "okay";
423 };