1 * Generic Exynos Bus frequency device
3 The Samsung Exynos SoC has many buses for data transfer between DRAM
4 and sub-blocks in SoC. Most Exynos SoCs share the common architecture
5 for buses. Generally, each bus of Exynos SoC includes a source clock
6 and a power line, which are able to change the clock frequency
7 of the bus in runtime. To monitor the usage of each bus in runtime,
8 the driver uses the PPMU (Platform Performance Monitoring Unit), which
9 is able to measure the current load of sub-blocks.
11 The Exynos SoC includes the various sub-blocks which have the each AXI bus.
12 The each AXI bus has the owned source clock but, has not the only owned
13 power line. The power line might be shared among one more sub-blocks.
14 So, we can divide into two type of device as the role of each sub-block.
15 There are two type of bus devices as following:
19 Basically, parent and passive bus device share the same power line.
20 The parent bus device can only change the voltage of shared power line
21 and the rest bus devices (passive bus device) depend on the decision of
22 the parent bus device. If there are three blocks which share the VDD_xxx
23 power line, Only one block should be parent device and then the rest blocks
24 should depend on the parent device as passive device.
26 VDD_xxx |--- A block (parent)
27 |--- B block (passive)
28 |--- C block (passive)
30 There are a little different composition among Exynos SoC because each Exynos
31 SoC has different sub-blocks. Therefore, such difference should be specified
32 in devicetree file instead of each device driver. In result, this driver
33 is able to support the bus frequency for all Exynos SoCs.
35 Required 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.
42 Required 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
47 Required properties only for passive bus device:
48 - devfreq: the parent bus device.
50 Optional 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.
56 Detailed correlation between sub-blocks and power line according to Exynos SoC:
57 - In case of Exynos3250, there are two power line as following:
60 VDD_INT |--- LEFTBUS (parent device)
72 - In case of Exynos4210, there is one power line as following:
73 VDD_INT |--- DMC (parent device)
89 - In case of Exynos4x12, there are two power line as following:
92 VDD_INT |--- LEFTBUS (parent device)
107 - In case of Exynos5422, there are two power line as following:
108 VDD_MIF |--- DREX 0 (parent device, DRAM EXpress controller)
111 VDD_INT |--- NoC_Core (parent device)
126 - In case of Exynos5433, there is VDD_INT power line as following:
127 VDD_INT |--- G2D (parent device)
136 |--- PERIS (Fixed clock rate)
137 |--- PERIC (Fixed clock rate)
138 |--- FSYS (Fixed clock rate)
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.
145 - MIF (Memory Interface) block
146 : VDD_MIF |--- DMC (Dynamic Memory Controller)
148 - INT (Internal) block
149 : VDD_INT |--- LEFTBUS (parent device)
160 - MIF bus's frequency/voltage table
161 -----------------------
162 |Lv| Freq | Voltage |
163 -----------------------
165 |L2| 100000 |800000 |
166 |L3| 134000 |800000 |
167 |L4| 200000 |825000 |
168 |L5| 400000 |875000 |
169 -----------------------
171 - INT bus's frequency/voltage table
172 ----------------------------------------------------------
173 |Block|LEFTBUS|RIGHTBUS|MCUISP |ISP |PERIL ||VDD_INT |
174 | name| |LCD0 | | | || |
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 ----------------------------------------------------------
190 The bus of DMC (Dynamic Memory Controller) block in exynos3250.dtsi
194 compatible = "samsung,exynos-bus";
195 clocks = <&cmu_dmc CLK_DIV_DMC>;
197 operating-points-v2 = <&bus_dmc_opp_table>;
201 bus_dmc_opp_table: opp_table1 {
202 compatible = "operating-points-v2";
206 opp-hz = /bits/ 64 <50000000>;
207 opp-microvolt = <800000>;
210 opp-hz = /bits/ 64 <100000000>;
211 opp-microvolt = <800000>;
214 opp-hz = /bits/ 64 <134000000>;
215 opp-microvolt = <800000>;
218 opp-hz = /bits/ 64 <200000000>;
219 opp-microvolt = <825000>;
222 opp-hz = /bits/ 64 <400000000>;
223 opp-microvolt = <875000>;
227 bus_leftbus: bus_leftbus {
228 compatible = "samsung,exynos-bus";
229 clocks = <&cmu CLK_DIV_GDL>;
231 operating-points-v2 = <&bus_leftbus_opp_table>;
235 bus_rightbus: bus_rightbus {
236 compatible = "samsung,exynos-bus";
237 clocks = <&cmu CLK_DIV_GDR>;
239 operating-points-v2 = <&bus_leftbus_opp_table>;
244 compatible = "samsung,exynos-bus";
245 clocks = <&cmu CLK_DIV_ACLK_160>;
247 operating-points-v2 = <&bus_leftbus_opp_table>;
252 compatible = "samsung,exynos-bus";
253 clocks = <&cmu CLK_DIV_ACLK_200>;
255 operating-points-v2 = <&bus_leftbus_opp_table>;
259 bus_mcuisp: bus_mcuisp {
260 compatible = "samsung,exynos-bus";
261 clocks = <&cmu CLK_DIV_ACLK_400_MCUISP>;
263 operating-points-v2 = <&bus_mcuisp_opp_table>;
268 compatible = "samsung,exynos-bus";
269 clocks = <&cmu CLK_DIV_ACLK_266>;
271 operating-points-v2 = <&bus_isp_opp_table>;
275 bus_peril: bus_peril {
276 compatible = "samsung,exynos-bus";
277 clocks = <&cmu CLK_DIV_ACLK_100>;
279 operating-points-v2 = <&bus_peril_opp_table>;
284 compatible = "samsung,exynos-bus";
285 clocks = <&cmu CLK_SCLK_MFC>;
287 operating-points-v2 = <&bus_leftbus_opp_table>;
291 bus_leftbus_opp_table: opp_table1 {
292 compatible = "operating-points-v2";
296 opp-hz = /bits/ 64 <50000000>;
297 opp-microvolt = <900000>;
300 opp-hz = /bits/ 64 <80000000>;
301 opp-microvolt = <900000>;
304 opp-hz = /bits/ 64 <100000000>;
305 opp-microvolt = <1000000>;
308 opp-hz = /bits/ 64 <134000000>;
309 opp-microvolt = <1000000>;
312 opp-hz = /bits/ 64 <200000000>;
313 opp-microvolt = <1000000>;
317 bus_mcuisp_opp_table: opp_table2 {
318 compatible = "operating-points-v2";
322 opp-hz = /bits/ 64 <50000000>;
325 opp-hz = /bits/ 64 <80000000>;
328 opp-hz = /bits/ 64 <100000000>;
331 opp-hz = /bits/ 64 <200000000>;
334 opp-hz = /bits/ 64 <400000000>;
338 bus_isp_opp_table: opp_table3 {
339 compatible = "operating-points-v2";
343 opp-hz = /bits/ 64 <50000000>;
346 opp-hz = /bits/ 64 <80000000>;
349 opp-hz = /bits/ 64 <100000000>;
352 opp-hz = /bits/ 64 <200000000>;
355 opp-hz = /bits/ 64 <300000000>;
359 bus_peril_opp_table: opp_table4 {
360 compatible = "operating-points-v2";
364 opp-hz = /bits/ 64 <50000000>;
367 opp-hz = /bits/ 64 <80000000>;
370 opp-hz = /bits/ 64 <100000000>;
375 Usage case to handle the frequency and voltage of bus on runtime
376 in exynos3250-rinato.dts is listed below:
379 devfreq-events = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
380 vdd-supply = <&buck1_reg>; /* VDD_MIF */
385 devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>;
386 vdd-supply = <&buck3_reg>;
391 devfreq = <&bus_leftbus>;
396 devfreq = <&bus_leftbus>;
401 devfreq = <&bus_leftbus>;
406 devfreq = <&bus_leftbus>;
411 devfreq = <&bus_leftbus>;
416 devfreq = <&bus_leftbus>;
421 devfreq = <&bus_leftbus>;