424 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			424 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
* 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
 | 
						|
 | 
						|
- In case of Exynos5433, there is VDD_INT power line as following:
 | 
						|
	VDD_INT |--- G2D (parent device)
 | 
						|
		|--- MSCL
 | 
						|
		|--- GSCL
 | 
						|
		|--- JPEG
 | 
						|
		|--- MFC
 | 
						|
		|--- HEVC
 | 
						|
		|--- BUS0
 | 
						|
		|--- BUS1
 | 
						|
		|--- BUS2
 | 
						|
		|--- PERIS (Fixed clock rate)
 | 
						|
		|--- PERIC (Fixed clock rate)
 | 
						|
		|--- FSYS  (Fixed clock rate)
 | 
						|
 | 
						|
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";
 | 
						|
	};
 |