Qualcomm Technologies, Inc. CPR3 Regulator - MMSS Specific Bindings MMSS CPR3 controllers each support one CPR thread that monitors the voltage of the graphics processor (MMSS) supply regulator. The CPR open-loop voltages are stored in hardware fuses for MMSS CPR3 controllers. However, the CPR target quotients must be defined in device tree. This document describes the MMSS specific CPR3 bindings. ======================= Required Node Structure ======================= CPR3 regulators must be described in three levels of devices nodes. The first level describes the CPR3 controller. The second level describes exacly one hardware thread managed by the controller. The third level describes one or more logical regulators handled by the CPR thread. All platform independent cpr3-regulator binding guidelines defined in cpr3-regulator.txt also apply to cpr3-hmss-regulator devices. ==================================== First Level Nodes - CPR3 Controllers ==================================== MMSS specific properties: - compatible Usage: required Value type: Definition: should be "qcom,cpr3-msm8996-mmss-regulator" - clocks Usage: required Value type: Definition: Array of clock tuples in which each tuple consists of a phandle to a clock device and a clock ID number. The following clocks must be specified: MMSS RBCPR, MMSS RBCPR AHB, and MMSS MMAGIC AHB. - clock-names Usage: required Value type: Definition: Clock names. This list must match up 1-to-1 with the clocks specified in the 'clocks' property. "core_clk", "iface_clk", and "bus_clk" must be specified. ================================================= Second Level Nodes - CPR Threads for a Controller ================================================= MMSS specific properties: N/A =============================================== Third Level Nodes - CPR Regulators for a Thread =============================================== MMSS specific properties: - qcom,cpr-fuse-corners Usage: required Value type: Definition: Specifies the number of fuse corners. This value must be 4 for MMSS. - qcom,cpr-fuse-combos Usage: required Value type: Definition: Specifies the number of fuse combinations being supported by the device. This value is utilized by several other properties. Supported values are 1 up to the maximum possible for a given regulator type. For MMSS the maximum supported value is 8. These combos correspond to CPR revision fuse values from 0 to 7 in order. - qcom,cpr-speed-bins Usage: optional Value type: Definition: Specifies the number of speed bins being supported by the device. This value is utilized by several other properties. Supported values are 1 up to the maximum possible for a given regulator type. For MMSS the maximum supported value is 1. - qcom,mem-acc-voltage Usage: required if mem-acc-supply is specified for the CPR3 controller containing this CPR3 regulator Value type: Definition: A list of integer tuples which each define the mem-acc-supply corner for each voltage corner in order from lowest to highest. The list must contain qcom,cpr-fuse-combos number of tuples in which case the tuples are matched to fuse combinations 1-to-1 or qcom,cpr-speed-bins number of tuples in which case the tuples are matched to speed bins 1-to-1 or exactly 1 tuple which is used regardless of the fuse combination and speed bin found on a given chip. Each tuple must be of the length defined in the corresponding element of the qcom,cpr-corners property or the qcom,cpr-speed-bins property. A single tuple may only be specified if all of the corner counts in qcom,cpr-corners are the same. - qcom,cpr-target-quotients Usage: required Value type: Definition: A grouping of integer tuple lists. Each tuple defines the CPR target quotient for each ring oscillator (RO) for a given corner. Since CPR3 supports exactly 16 ROs, each tuple must contain 16 elements corresponding to RO0 through RO15 in order. If a given RO is unused for a corner, then its target quotient should be specified as 0. Each tuple list in the grouping must meet the same size requirements as those specified for qcom,mem-acc-voltage above. The tuples in a given list are ordered from the lowest corner to the highest corner. - qcom,cpr-ro-scaling-factor Usage: required if qcom,cpr-closed-loop-voltage-adjustment is specified Value type: Definition: The common definition of this property in cpr3-regulator.txt is accurate for MMSS CPR3 controllers except for this modification: Each tuple list must contain the number of tuples defined in the corresponding element of the qcom,cpr-corners property or the qcom,cpr-speed-bins property as opposed to the value of the qcom,cpr-fuse-corners property. - qcom,cpr-fused-closed-loop-voltage-adjustment-map Usage: optional Value type: Definition: A list of integer tuples which each define the CPR fused corner closed-loop offset adjustment fuse to utilize for each voltage corner in order from lowest to highest. The list must contain qcom,cpr-fuse-combos number of tuples in which case the tuples are matched to fuse combinations 1-to-1 or qcom,cpr-speed-bins number of tuples in which case the tuples are matched to speed bins 1-to-1 or exactly 1 tuple which is used regardless of the fuse combination and speed bin found on a given chip. Each tuple must be of the length defined in the corresponding element of the qcom,cpr-corners property or the qcom,cpr-speed-bins property. A single tuple may only be specified if all of the corner counts in qcom,cpr-corners are the same. Each tuple element must be either 0 or in the range 1 to qcom,cpr-fuse-corners. A value of 0 signifies that no fuse based adjustment should be applied to the fuse corner. Values 1 to qcom,cpr-fuse-corners denote the specific fuse corner that should be used by a given voltage corner. Note that the qcom,cpr-closed-loop-voltage-fuse-adjustment property is not meaningful for MMSS CPR3 regulator nodes since target quotients are not defined in fuses. ======= Example ======= gfx_cpr: cpr3-ctrl@838000 { compatible = "qcom,cpr3-msm8996-mmss-regulator"; reg = <0x00838000 0x4000>, <0x00074000 0x1000>; reg-names = "cpr_ctrl", "fuse_base"; clocks = <&clock_mmss clk_mmss_rbcpr_clk>, <&clock_mmss clk_mmss_rbcpr_ahb_clk>, <&clock_mmss clk_mmss_mmagic_ahb_clk>; clock-names = "core_clk", "iface_clk", "bus_clk"; interrupts = <0 166 0>; interrupt-names = "cpr"; qcom,cpr-ctrl-name = "gfx"; qcom,cpr-sensor-time = <1000>; qcom,cpr-loop-time = <5000000>; qcom,cpr-idle-cycles = <15>; qcom,cpr-step-quot-init-min = <13>; qcom,cpr-step-quot-init-max = <13>; qcom,cpr-count-mode = <2>; vdd-supply = <&pmi8994_s2>; qcom,voltage-step = <5000>; qcom,cpr-enable; qcom,cpr-aging-ref-voltage = <905000>; thread@0 { qcom,cpr-thread-id = <0>; qcom,cpr-consecutive-up = <0>; qcom,cpr-consecutive-down = <2>; qcom,cpr-up-threshold = <0>; qcom,cpr-down-threshold = <2>; gfx_vreg: regulator { regulator-name = "gfx_corner"; regulator-min-microvolt = <1>; regulator-max-microvolt = <4>; qcom,cpr-fuse-corners = <4>; qcom,cpr-fuse-combos = <1>; qcom,cpr-corners = <4>; qcom,cpr-corner-fmax-map = <1 2 3 4>; qcom,cpr-voltage-ceiling = <670000 745000 905000 1015000>; qcom,cpr-voltage-floor = <545000 625000 755000 855000>; qcom,mem-acc-voltage = <1 1 2 2>; qcom,corner-frequencies = <120000000 205000000 360000000 480000000>; qcom,cpr-target-quotients = < 0 0 0 0 249 232 0 394 0 422 0 0 0 0 0 0>, < 0 0 0 0 400 363 0 565 0 603 0 0 0 0 0 0>, < 0 0 0 0 669 601 0 851 0 905 0 0 0 0 0 0>, < 0 0 0 0 899 806 0 1084 0 1149 0 0 0 0 0 0>; qcom,cpr-ro-scaling-factor = < 0 0 0 0 2268 2004 0 2408 0 2539 0 0 0 0 0 0>, < 0 0 0 0 2268 2004 0 2408 0 2539 0 0 0 0 0 0>, < 0 0 0 0 2268 2004 0 2408 0 2539 0 0 0 0 0 0>, < 0 0 0 0 2268 2004 0 2408 0 2539 0 0 0 0 0 0>; qcom,cpr-open-loop-voltage-fuse-adjustment = <35000 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = <45000 0 0 0>; qcom,cpr-fused-closed-loop-voltage-adjustment-map = <2 2 0 4>; qcom,allow-voltage-interpolation; qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <25000>; qcom,cpr-aging-ref-corner = <3>; qcom,cpr-aging-ro-scaling-factor = <2950>; qcom,cpr-aging-derate = <1000 1000 1000 1000>; qcom,allow-aging-voltage-adjustment = <1>; }; }; };