123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- * Generic Exynos Bus frequency device
- The Samsung Exynos SoC has many buses for data transfer between DRAM
- and sub-blocks in SoC. Most Exynos SoCs share the common architecture
- for buses. Generally, each bus of Exynos SoC includes a source clock
- and a power line, which are able to change the clock frequency
- of the bus in runtime. To monitor the usage of each bus in runtime,
- the driver uses the PPMU (Platform Performance Monitoring Unit), which
- is able to measure the current load of sub-blocks.
- The Exynos SoC includes the various sub-blocks which have the each AXI bus.
- The each AXI bus has the owned source clock but, has not the only owned
- power line. The power line might be shared among one more sub-blocks.
- So, we can divide into two type of device as the role of each sub-block.
- There are two type of bus devices as following:
- - parent bus device
- - passive bus device
- Basically, parent and passive bus device share the same power line.
- The parent bus device can only change the voltage of shared power line
- and the rest bus devices (passive bus device) depend on the decision of
- the parent bus device. If there are three blocks which share the VDD_xxx
- power line, Only one block should be parent device and then the rest blocks
- should depend on the parent device as passive device.
- VDD_xxx |--- A block (parent)
- |--- B block (passive)
- |--- C block (passive)
- There are a little different composition among Exynos SoC because each Exynos
- SoC has different sub-blocks. Therefore, such difference should be specified
- in devicetree file instead of each device driver. In result, this driver
- is able to support the bus frequency for all Exynos SoCs.
- Required properties for all bus devices:
- - compatible: Should be "samsung,exynos-bus".
- - clock-names : the name of clock used by the bus, "bus".
- - clocks : phandles for clock specified in "clock-names" property.
- - operating-points-v2: the OPP table including frequency/voltage information
- to support DVFS (Dynamic Voltage/Frequency Scaling) feature.
- Required properties only for parent bus device:
- - vdd-supply: the regulator to provide the buses with the voltage.
- - devfreq-events: the devfreq-event device to monitor the current utilization
- of buses.
- Required properties only for passive bus device:
- - devfreq: the parent bus device.
- Optional properties only for parent bus device:
- - exynos,saturation-ratio: the percentage value which is used to calibrate
- the performance count against total cycle count.
- - exynos,voltage-tolerance: the percentage value for bus voltage tolerance
- which is used to calculate the max voltage.
- Detailed correlation between sub-blocks and power line according to Exynos SoC:
- - In case of Exynos3250, there are two power line as following:
- VDD_MIF |--- DMC
- VDD_INT |--- LEFTBUS (parent device)
- |--- PERIL
- |--- MFC
- |--- G3D
- |--- RIGHTBUS
- |--- PERIR
- |--- FSYS
- |--- LCD0
- |--- PERIR
- |--- ISP
- |--- CAM
- - In case of Exynos4210, there is one power line as following:
- VDD_INT |--- DMC (parent device)
- |--- LEFTBUS
- |--- PERIL
- |--- MFC(L)
- |--- G3D
- |--- TV
- |--- LCD0
- |--- RIGHTBUS
- |--- PERIR
- |--- MFC(R)
- |--- CAM
- |--- FSYS
- |--- GPS
- |--- LCD0
- |--- LCD1
- - In case of Exynos4x12, there are two power line as following:
- VDD_MIF |--- DMC
- VDD_INT |--- LEFTBUS (parent device)
- |--- PERIL
- |--- MFC(L)
- |--- G3D
- |--- TV
- |--- IMAGE
- |--- RIGHTBUS
- |--- PERIR
- |--- MFC(R)
- |--- CAM
- |--- FSYS
- |--- GPS
- |--- LCD0
- |--- ISP
- - In case of Exynos5422, there are two power line as following:
- VDD_MIF |--- DREX 0 (parent device, DRAM EXpress controller)
- |--- DREX 1
- VDD_INT |--- NoC_Core (parent device)
- |--- G2D
- |--- G3D
- |--- DISP1
- |--- NoC_WCORE
- |--- GSCL
- |--- MSCL
- |--- ISP
- |--- MFC
- |--- GEN
- |--- PERIS
- |--- PERIC
- |--- FSYS
- |--- FSYS2
- Example1:
- Show the AXI buses of Exynos3250 SoC. Exynos3250 divides the buses to
- power line (regulator). The MIF (Memory Interface) AXI bus is used to
- transfer data between DRAM and CPU and uses the VDD_MIF regulator.
- - MIF (Memory Interface) block
- : VDD_MIF |--- DMC (Dynamic Memory Controller)
- - INT (Internal) block
- : VDD_INT |--- LEFTBUS (parent device)
- |--- PERIL
- |--- MFC
- |--- G3D
- |--- RIGHTBUS
- |--- FSYS
- |--- LCD0
- |--- PERIR
- |--- ISP
- |--- CAM
- - MIF bus's frequency/voltage table
- -----------------------
- |Lv| Freq | Voltage |
- -----------------------
- |L1| 50000 |800000 |
- |L2| 100000 |800000 |
- |L3| 134000 |800000 |
- |L4| 200000 |825000 |
- |L5| 400000 |875000 |
- -----------------------
- - INT bus's frequency/voltage table
- ----------------------------------------------------------
- |Block|LEFTBUS|RIGHTBUS|MCUISP |ISP |PERIL ||VDD_INT |
- | name| |LCD0 | | | || |
- | | |FSYS | | | || |
- | | |MFC | | | || |
- ----------------------------------------------------------
- |Mode |*parent|passive |passive|passive|passive|| |
- ----------------------------------------------------------
- |Lv |Frequency ||Voltage |
- ----------------------------------------------------------
- |L1 |50000 |50000 |50000 |50000 |50000 ||900000 |
- |L2 |80000 |80000 |80000 |80000 |80000 ||900000 |
- |L3 |100000 |100000 |100000 |100000 |100000 ||1000000 |
- |L4 |134000 |134000 |200000 |200000 | ||1000000 |
- |L5 |200000 |200000 |400000 |300000 | ||1000000 |
- ----------------------------------------------------------
- Example2 :
- The bus of DMC (Dynamic Memory Controller) block in exynos3250.dtsi
- is listed below:
- bus_dmc: bus_dmc {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu_dmc CLK_DIV_DMC>;
- clock-names = "bus";
- operating-points-v2 = <&bus_dmc_opp_table>;
- status = "disabled";
- };
- bus_dmc_opp_table: opp_table1 {
- compatible = "operating-points-v2";
- opp-shared;
- opp@50000000 {
- opp-hz = /bits/ 64 <50000000>;
- opp-microvolt = <800000>;
- };
- opp@100000000 {
- opp-hz = /bits/ 64 <100000000>;
- opp-microvolt = <800000>;
- };
- opp@134000000 {
- opp-hz = /bits/ 64 <134000000>;
- opp-microvolt = <800000>;
- };
- opp@200000000 {
- opp-hz = /bits/ 64 <200000000>;
- opp-microvolt = <825000>;
- };
- opp@400000000 {
- opp-hz = /bits/ 64 <400000000>;
- opp-microvolt = <875000>;
- };
- };
- bus_leftbus: bus_leftbus {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_GDL>;
- clock-names = "bus";
- operating-points-v2 = <&bus_leftbus_opp_table>;
- status = "disabled";
- };
- bus_rightbus: bus_rightbus {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_GDR>;
- clock-names = "bus";
- operating-points-v2 = <&bus_leftbus_opp_table>;
- status = "disabled";
- };
- bus_lcd0: bus_lcd0 {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_ACLK_160>;
- clock-names = "bus";
- operating-points-v2 = <&bus_leftbus_opp_table>;
- status = "disabled";
- };
- bus_fsys: bus_fsys {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_ACLK_200>;
- clock-names = "bus";
- operating-points-v2 = <&bus_leftbus_opp_table>;
- status = "disabled";
- };
- bus_mcuisp: bus_mcuisp {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_ACLK_400_MCUISP>;
- clock-names = "bus";
- operating-points-v2 = <&bus_mcuisp_opp_table>;
- status = "disabled";
- };
- bus_isp: bus_isp {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_ACLK_266>;
- clock-names = "bus";
- operating-points-v2 = <&bus_isp_opp_table>;
- status = "disabled";
- };
- bus_peril: bus_peril {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_DIV_ACLK_100>;
- clock-names = "bus";
- operating-points-v2 = <&bus_peril_opp_table>;
- status = "disabled";
- };
- bus_mfc: bus_mfc {
- compatible = "samsung,exynos-bus";
- clocks = <&cmu CLK_SCLK_MFC>;
- clock-names = "bus";
- operating-points-v2 = <&bus_leftbus_opp_table>;
- status = "disabled";
- };
- bus_leftbus_opp_table: opp_table1 {
- compatible = "operating-points-v2";
- opp-shared;
- opp@50000000 {
- opp-hz = /bits/ 64 <50000000>;
- opp-microvolt = <900000>;
- };
- opp@80000000 {
- opp-hz = /bits/ 64 <80000000>;
- opp-microvolt = <900000>;
- };
- opp@100000000 {
- opp-hz = /bits/ 64 <100000000>;
- opp-microvolt = <1000000>;
- };
- opp@134000000 {
- opp-hz = /bits/ 64 <134000000>;
- opp-microvolt = <1000000>;
- };
- opp@200000000 {
- opp-hz = /bits/ 64 <200000000>;
- opp-microvolt = <1000000>;
- };
- };
- bus_mcuisp_opp_table: opp_table2 {
- compatible = "operating-points-v2";
- opp-shared;
- opp@50000000 {
- opp-hz = /bits/ 64 <50000000>;
- };
- opp@80000000 {
- opp-hz = /bits/ 64 <80000000>;
- };
- opp@100000000 {
- opp-hz = /bits/ 64 <100000000>;
- };
- opp@200000000 {
- opp-hz = /bits/ 64 <200000000>;
- };
- opp@400000000 {
- opp-hz = /bits/ 64 <400000000>;
- };
- };
- bus_isp_opp_table: opp_table3 {
- compatible = "operating-points-v2";
- opp-shared;
- opp@50000000 {
- opp-hz = /bits/ 64 <50000000>;
- };
- opp@80000000 {
- opp-hz = /bits/ 64 <80000000>;
- };
- opp@100000000 {
- opp-hz = /bits/ 64 <100000000>;
- };
- opp@200000000 {
- opp-hz = /bits/ 64 <200000000>;
- };
- opp@300000000 {
- opp-hz = /bits/ 64 <300000000>;
- };
- };
- bus_peril_opp_table: opp_table4 {
- compatible = "operating-points-v2";
- opp-shared;
- opp@50000000 {
- opp-hz = /bits/ 64 <50000000>;
- };
- opp@80000000 {
- opp-hz = /bits/ 64 <80000000>;
- };
- opp@100000000 {
- opp-hz = /bits/ 64 <100000000>;
- };
- };
- Usage case to handle the frequency and voltage of bus on runtime
- in exynos3250-rinato.dts is listed below:
- &bus_dmc {
- devfreq-events = <&ppmu_dmc0_3>, <&ppmu_dmc1_3>;
- vdd-supply = <&buck1_reg>; /* VDD_MIF */
- status = "okay";
- };
- &bus_leftbus {
- devfreq-events = <&ppmu_leftbus_3>, <&ppmu_rightbus_3>;
- vdd-supply = <&buck3_reg>;
- status = "okay";
- };
- &bus_rightbus {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
- &bus_lcd0 {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
- &bus_fsys {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
- &bus_mcuisp {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
- &bus_isp {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
- &bus_peril {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
- &bus_mfc {
- devfreq = <&bus_leftbus>;
- status = "okay";
- };
|