162306a36Sopenharmony_ciNVIDIA Tegra124 DFLL FCPU clocksource
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciThis binding uses the common clock binding:
462306a36Sopenharmony_ciDocumentation/devicetree/bindings/clock/clock-bindings.txt
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciThe DFLL IP block on Tegra is a root clocksource designed for clocking
762306a36Sopenharmony_cithe fast CPU cluster. It consists of a free-running voltage controlled
862306a36Sopenharmony_cioscillator connected to the CPU voltage rail (VDD_CPU), and a closed loop
962306a36Sopenharmony_cicontrol module that will automatically adjust the VDD_CPU voltage by
1062306a36Sopenharmony_cicommunicating with an off-chip PMIC either via an I2C bus or via PWM signals.
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciRequired properties:
1362306a36Sopenharmony_ci- compatible : should be one of:
1462306a36Sopenharmony_ci  - "nvidia,tegra124-dfll": for Tegra124
1562306a36Sopenharmony_ci  - "nvidia,tegra210-dfll": for Tegra210
1662306a36Sopenharmony_ci- reg : Defines the following set of registers, in the order listed:
1762306a36Sopenharmony_ci        - registers for the DFLL control logic.
1862306a36Sopenharmony_ci        - registers for the I2C output logic.
1962306a36Sopenharmony_ci        - registers for the integrated I2C master controller.
2062306a36Sopenharmony_ci        - look-up table RAM for voltage register values.
2162306a36Sopenharmony_ci- interrupts: Should contain the DFLL block interrupt.
2262306a36Sopenharmony_ci- clocks: Must contain an entry for each entry in clock-names.
2362306a36Sopenharmony_ci  See clock-bindings.txt for details.
2462306a36Sopenharmony_ci- clock-names: Must include the following entries:
2562306a36Sopenharmony_ci  - soc: Clock source for the DFLL control logic.
2662306a36Sopenharmony_ci  - ref: The closed loop reference clock
2762306a36Sopenharmony_ci  - i2c: Clock source for the integrated I2C master.
2862306a36Sopenharmony_ci- resets: Must contain an entry for each entry in reset-names.
2962306a36Sopenharmony_ci  See ../reset/reset.txt for details.
3062306a36Sopenharmony_ci- reset-names: Must include the following entries:
3162306a36Sopenharmony_ci  - dvco: Reset control for the DFLL DVCO.
3262306a36Sopenharmony_ci- #clock-cells: Must be 0.
3362306a36Sopenharmony_ci- clock-output-names: Name of the clock output.
3462306a36Sopenharmony_ci- vdd-cpu-supply: Regulator for the CPU voltage rail that the DFLL
3562306a36Sopenharmony_ci  hardware will start controlling. The regulator will be queried for
3662306a36Sopenharmony_ci  the I2C register, control values and supported voltages.
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciRequired properties for the control loop parameters:
3962306a36Sopenharmony_ci- nvidia,sample-rate: Sample rate of the DFLL control loop.
4062306a36Sopenharmony_ci- nvidia,droop-ctrl: See the register CL_DVFS_DROOP_CTRL in the TRM.
4162306a36Sopenharmony_ci- nvidia,force-mode: See the field DFLL_PARAMS_FORCE_MODE in the TRM.
4262306a36Sopenharmony_ci- nvidia,cf: Numeric value, see the field DFLL_PARAMS_CF_PARAM in the TRM.
4362306a36Sopenharmony_ci- nvidia,ci: Numeric value, see the field DFLL_PARAMS_CI_PARAM in the TRM.
4462306a36Sopenharmony_ci- nvidia,cg: Numeric value, see the field DFLL_PARAMS_CG_PARAM in the TRM.
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciOptional properties for the control loop parameters:
4762306a36Sopenharmony_ci- nvidia,cg-scale: Boolean value, see the field DFLL_PARAMS_CG_SCALE in the TRM.
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciOptional properties for mode selection:
5062306a36Sopenharmony_ci- nvidia,pwm-to-pmic: Use PWM to control regulator rather then I2C.
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciRequired properties for I2C mode:
5362306a36Sopenharmony_ci- nvidia,i2c-fs-rate: I2C transfer rate, if using full speed mode.
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciRequired properties for PWM mode:
5662306a36Sopenharmony_ci- nvidia,pwm-period-nanoseconds: period of PWM square wave in nanoseconds.
5762306a36Sopenharmony_ci- nvidia,pwm-tristate-microvolts: Regulator voltage in micro volts when PWM
5862306a36Sopenharmony_ci  control is disabled and the PWM output is tristated. Note that this voltage is
5962306a36Sopenharmony_ci  configured in hardware, typically via a resistor divider.
6062306a36Sopenharmony_ci- nvidia,pwm-min-microvolts: Regulator voltage in micro volts when PWM control
6162306a36Sopenharmony_ci  is enabled and PWM output is low. Hence, this is the minimum output voltage
6262306a36Sopenharmony_ci  that the regulator supports when PWM control is enabled.
6362306a36Sopenharmony_ci- nvidia,pwm-voltage-step-microvolts: Voltage increase in micro volts
6462306a36Sopenharmony_ci  corresponding to a 1/33th increase in duty cycle. Eg the voltage for 2/33th
6562306a36Sopenharmony_ci  duty cycle would be: nvidia,pwm-min-microvolts +
6662306a36Sopenharmony_ci  nvidia,pwm-voltage-step-microvolts * 2.
6762306a36Sopenharmony_ci- pinctrl-0: I/O pad configuration when PWM control is enabled.
6862306a36Sopenharmony_ci- pinctrl-1: I/O pad configuration when PWM control is disabled.
6962306a36Sopenharmony_ci- pinctrl-names: must include the following entries:
7062306a36Sopenharmony_ci  - dvfs_pwm_enable: I/O pad configuration when PWM control is enabled.
7162306a36Sopenharmony_ci  - dvfs_pwm_disable: I/O pad configuration when PWM control is disabled.
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ciExample for I2C:
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciclock@70110000 {
7662306a36Sopenharmony_ci        compatible = "nvidia,tegra124-dfll";
7762306a36Sopenharmony_ci        reg = <0 0x70110000 0 0x100>, /* DFLL control */
7862306a36Sopenharmony_ci              <0 0x70110000 0 0x100>, /* I2C output control */
7962306a36Sopenharmony_ci              <0 0x70110100 0 0x100>, /* Integrated I2C controller */
8062306a36Sopenharmony_ci              <0 0x70110200 0 0x100>; /* Look-up table RAM */
8162306a36Sopenharmony_ci        interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
8262306a36Sopenharmony_ci        clocks = <&tegra_car TEGRA124_CLK_DFLL_SOC>,
8362306a36Sopenharmony_ci                 <&tegra_car TEGRA124_CLK_DFLL_REF>,
8462306a36Sopenharmony_ci                 <&tegra_car TEGRA124_CLK_I2C5>;
8562306a36Sopenharmony_ci        clock-names = "soc", "ref", "i2c";
8662306a36Sopenharmony_ci        resets = <&tegra_car TEGRA124_RST_DFLL_DVCO>;
8762306a36Sopenharmony_ci        reset-names = "dvco";
8862306a36Sopenharmony_ci        #clock-cells = <0>;
8962306a36Sopenharmony_ci        clock-output-names = "dfllCPU_out";
9062306a36Sopenharmony_ci        vdd-cpu-supply = <&vdd_cpu>;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci        nvidia,sample-rate = <12500>;
9362306a36Sopenharmony_ci        nvidia,droop-ctrl = <0x00000f00>;
9462306a36Sopenharmony_ci        nvidia,force-mode = <1>;
9562306a36Sopenharmony_ci        nvidia,cf = <10>;
9662306a36Sopenharmony_ci        nvidia,ci = <0>;
9762306a36Sopenharmony_ci        nvidia,cg = <2>;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci        nvidia,i2c-fs-rate = <400000>;
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciExample for PWM:
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciclock@70110000 {
10562306a36Sopenharmony_ci	compatible = "nvidia,tegra124-dfll";
10662306a36Sopenharmony_ci	reg = <0 0x70110000 0 0x100>, /* DFLL control */
10762306a36Sopenharmony_ci	      <0 0x70110000 0 0x100>, /* I2C output control */
10862306a36Sopenharmony_ci	      <0 0x70110100 0 0x100>, /* Integrated I2C controller */
10962306a36Sopenharmony_ci	      <0 0x70110200 0 0x100>; /* Look-up table RAM */
11062306a36Sopenharmony_ci	interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
11162306a36Sopenharmony_ci	clocks = <&tegra_car TEGRA210_CLK_DFLL_SOC>,
11262306a36Sopenharmony_ci	         <&tegra_car TEGRA210_CLK_DFLL_REF>,
11362306a36Sopenharmony_ci		 <&tegra_car TEGRA124_CLK_I2C5>;;
11462306a36Sopenharmony_ci	clock-names = "soc", "ref", "i2c";
11562306a36Sopenharmony_ci	resets = <&tegra_car TEGRA124_RST_DFLL_DVCO>;
11662306a36Sopenharmony_ci	reset-names = "dvco";
11762306a36Sopenharmony_ci	#clock-cells = <0>;
11862306a36Sopenharmony_ci	clock-output-names = "dfllCPU_out";
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	nvidia,sample-rate = <25000>;
12162306a36Sopenharmony_ci	nvidia,droop-ctrl = <0x00000f00>;
12262306a36Sopenharmony_ci	nvidia,force-mode = <1>;
12362306a36Sopenharmony_ci	nvidia,cf = <6>;
12462306a36Sopenharmony_ci	nvidia,ci = <0>;
12562306a36Sopenharmony_ci	nvidia,cg = <2>;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	nvidia,pwm-min-microvolts = <708000>; /* 708mV */
12862306a36Sopenharmony_ci	nvidia,pwm-period-nanoseconds = <2500>; /* 2.5us */
12962306a36Sopenharmony_ci	nvidia,pwm-to-pmic;
13062306a36Sopenharmony_ci	nvidia,pwm-tristate-microvolts = <1000000>;
13162306a36Sopenharmony_ci	nvidia,pwm-voltage-step-microvolts = <19200>; /* 19.2mV */
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	pinctrl-names = "dvfs_pwm_enable", "dvfs_pwm_disable";
13462306a36Sopenharmony_ci	pinctrl-0 = <&dvfs_pwm_active_state>;
13562306a36Sopenharmony_ci	pinctrl-1 = <&dvfs_pwm_inactive_state>;
13662306a36Sopenharmony_ci};
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci/* pinmux nodes added for completeness. Binding doc can be found in:
13962306a36Sopenharmony_ci * Documentation/devicetree/bindings/pinctrl/nvidia,tegra210-pinmux.yaml
14062306a36Sopenharmony_ci */
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cipinmux: pinmux@700008d4 {
14362306a36Sopenharmony_ci	dvfs_pwm_active_state: dvfs_pwm_active {
14462306a36Sopenharmony_ci		dvfs_pwm_pbb1 {
14562306a36Sopenharmony_ci			nvidia,pins = "dvfs_pwm_pbb1";
14662306a36Sopenharmony_ci			nvidia,tristate = <TEGRA_PIN_DISABLE>;
14762306a36Sopenharmony_ci		};
14862306a36Sopenharmony_ci	};
14962306a36Sopenharmony_ci	dvfs_pwm_inactive_state: dvfs_pwm_inactive {
15062306a36Sopenharmony_ci		dvfs_pwm_pbb1 {
15162306a36Sopenharmony_ci			nvidia,pins = "dvfs_pwm_pbb1";
15262306a36Sopenharmony_ci			nvidia,tristate = <TEGRA_PIN_ENABLE>;
15362306a36Sopenharmony_ci		};
15462306a36Sopenharmony_ci	};
15562306a36Sopenharmony_ci};
156