Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64fec1f3 authored by Osvaldo Banuelos's avatar Osvaldo Banuelos Committed by Gerrit - the friendly Code Review server
Browse files

regulator: cpr3-regulator: add support for CPRh-compliant controllers



Augment the cpr3-regulator driver to support controllers with full
hardware CPR operation also known as CPR hardening. Also, introduce
the cprh-kbss-regulator driver to handle CPU subsystem specific power
requirements of the msmcobalt chip.

Change-Id: Icac84f9533fa1895ca2466a3793ddaa8b7a4c89c
CRs-Fixed: 967275
Signed-off-by: default avatarOsvaldo Banuelos <osvaldob@codeaurora.org>
parent 2642c0ad
Loading
Loading
Loading
Loading
+411 −0
Original line number Diff line number Diff line
Qualcomm Technologies, Inc. CPRh Regulator - KBSS Specific Bindings

KBSS CPRh controllers each support one CPR thread that monitors the voltage
of a single Kryo-B CPU subystem (KBSS) cluster that is powered by a single
regulator supply. The DCVSh block interacts with the CPRh controller for full
hardware DCVS support.

Both CPR open-loop voltages and CPR target quotients are stored in hardware
fuses for KBSS CPRh controllers.

This document describes the KBSS specific CPRh bindings.

=======================
Required Node Structure
=======================

CPRh regulators must be described in three levels of devices nodes.  The first
level describes the CPRh controller.  The second level describes one hardware
thread managed by the controller.  The third level describes one regulator
handled by the CPR thread.

All platform independent cpr3-regulator binding guidelines defined in
cpr3-regulator.txt also apply to cprh-kbss-regulator devices.

====================================
First Level Nodes - CPR3 Controllers
====================================

KBSS specific properties:
- compatible
	Usage:      required
	Value type: <string>
	Definition: "qcom,cprh-msmcobalt-kbss-regulator".

- qcom,cpr-controller-id
	Usage:      required
	Value type: <u32>
	Definition: Identifies the controller number for subsystems that are managed
		    by multiple CPR controllers. For KBSS, the supported values are 0
		    and 1, corresponding to each cluster.

- qcom,apm-threshold-voltage
	Usage:      optional
	Value type: <u32>
	Definition: Specifies the APM threshold voltage in microvolts.  If the
		    VDD_APCC supply voltage is above this level, then the APM is
		    switched to use VDD_APCC.  If VDD_APCC is below this level,
		    then the APM is switched to use VDD_MX.

- qcom,apm-hysteresis-voltage
	Usage:      optional
	Value type: <u32>
	Definition: Specifies the voltage delta in microvolts between the APM
		    threshold voltage and the highest corner open-loop voltage
		    which may be used as the ceiling for the corner.  If this
		    property is not specified, then a value of 0 is assumed.

- qcom,voltage-base
	Usage:      required
	Value type: <u32>
	Definition: Specifies the voltage in microvolts used by the CRR controller
		    to resolve open-loop and floor voltages. In particular, this
		    voltage is added to the programmed open-loop and floor voltages
		    and it corresponds to the minimum supported setpoint of the
		    vdd-supply.

- qcom,cpr-saw-use-unit-mV
	Usage:      optional
	Value type: <empty>
	Definition: Boolean flag which indicates that the unit used in SAW PVC
		    interface is mV. Use this for vdd-supply regulators which
		    do not use PMIC voltage control register LSBs per actually
		    unique PMIC regulator output voltage.

- qcom,cpr-up-down-delay-time
	Usage:      required
	Value type: <u32>
	Definition: The time to delay in nanoseconds between consecutive CPR
		    measurements when the last measurement recommended
		    increasing or decreasing the vdd-supply voltage.

- qcom,cpr-down-error-step-limit
	Usage:      required
	Value type: <u32>
	Definition: CPRh hardware closed-loop down error step limit which
		    defines the maximum number of vdd-supply regulator steps
		    that the voltage may be reduced as the result of a single
		    CPR measurement.

- qcom,cpr-up-error-step-limit
	Usage:      required
	Value type: <u32>
	Definition: CPRh hardware closed-loop up error step limit which defines
		    the maximum number of vdd-supply regulator steps that the
                    voltage may be increased as the result of a single
		    CPR measurement.

- qcom,cpr-voltage-settling-time
	Usage:      optional
	Value type: <u32>
		    The time in nanoseconds that it takes for the vdd-supply
		    voltage to settle after being increased or decreased by
		    qcom,voltage-step microvolts. This is used as the wait
		    time after applying SDELTA voltage margin adjustments.

- qcom,cpr-corner-switch-delay-time
	Usage:      optional
	Value type: <u32>
		    The time in nanoseconds that the CPR controller must delay
		    to allow voltage settling after a corner change.

- qcom,cpr-hw-closed-loop
	Usage:      optional
	Value type: <empty>
	Definition: Boolean flag which indicates that the KBSS CPRh controller
		    should operate in hardware closed-loop mode as opposed to
		    open-loop.

- qcom,cpr-temp-point-map
	Usage:      required if qcom,corner-band-allow-temp-adjustment is specified
		    for at least one of the CPR3 regulators.
	Value type: <prop-encoded-array>
	Definition: The temperature points in decidegrees Celsius which indicate
		    the range of temperature bands supported. If t1, t2, and t3
		    are the temperature points, then the temperature bands are:
		    (-inf, t1], (t1, t2], (t2, t3], and (t3, inf). A maximum of
		    three temperature points can be specified to define a total
		    of four different temperature bands.

- qcom,cpr-initial-temp-band
	Usage:      required if qcom,corner-band-allow-temp-adjustment is specified
		    for at least one of the CPR3 regulators.
	Value type: <u32>
	Definition: The initial temp band considering 0-based index at which
		    the baseline target quotients are derived and fused.

=================================================
Second Level Nodes - CPR Threads for a Controller
=================================================

KBSS specific properties:
N/A

===============================================
Third Level Nodes - CPR Regulators for a Thread
===============================================

KBSS specific properties:
- qcom,cpr-fuse-corners
	Usage:      required
	Value type: <u32>
	Definition: Specifies the number of fuse corners.  This value must be 4
		    for KBSS.  These fuse corners are: LowSVS, SVS, Nominal,
		    and Turbo.

- qcom,cpr-fuse-combos
	Usage:      required
	Value type: <u32>
	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 KBSS the maximum
		    supported value is 8.  These combos correspond to CPR
		    revision fuse values 0 to 7 in order.

- qcom,allow-quotient-interpolation
	Usage:      optional
	Value type: <empty>
	Definition: Boolean flag which indicates that it is acceptable to use
		    interpolated CPR target quotient values.  These values are
		    interpolated between the target quotient Fmax fuse values.

- qcom,cpr-corner-bands
	Usage:      required if qcom,corner-band-allow-core-count-adjustment
		    or qcom,corner-band-allow-temp-adjustment is specified
		    for this CPR3 regulator.
	Value type: <prop-encoded-array>
	Definition: A list of integers which defines how many corner bands
		    exist for each fuse combination. Supported values are 1 to 4.
		    The list must contain either qcom,cpr-fuse-combos number of
		    elements in which case the corner band counts are applied to
		    fuse combinations 1-to-1 or the list must contain exactly 1
		    element which is used regardless of the fuse combination
		    found on a given chip.

- qcom,cpr-speed-bin-corner-bands
	Usage:      required if qcom,cpr-speed-bins and
		    qcom,corner-band-allow-core-count-adjustment or
		    qcom,corner-band-allow-temp-adjustment are specified for
		    this CPR3 regulator.
	Value type: <prop-encded-array>
	Definition: A list of integers which defines how many corner bands
		    are to be used for each speed bin. The list must contain
		    qcom,cpr-speed-bins number of elements.

- qcom,corner-band-allow-core-count-adjustment
	Usage:      optional
	Value type: <prop-encoded-array>
	Definition: A list of integer tuples which each define the CPR core
		    count adjustment feature enable state for each corner band
		    in order from lowest to highest. Each element in the tuple
		    should be either 0 (per-core-count adjustment not allowed)
		    or 1 (per-core-count adjustment allowed). A maximum of four
		    corner bands may be used to partition the corner space into
		    contiguous corner ranges. For all corners within a corner band,
		    the same per-core-count adjustments are applied.

		    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-corner-bands property.

- qcom,max-core-count
	Usage:      required if qcom,corner-band-allow-core-count-adjustment is
		    specified for this CPR3 regulator.
	Value type: <u32>
	Definition: The maximum number of cores considered for core-count vmin
		    adjustments specified for this regulator's corner bands.

- qcom,corner-band-allow-temp-adjustment
	Usage:      optional
	Value type: <prop-encoded-array>
	Definition: A list of integer tuples which each define the temperature
		    adjustment feature enable state for each corner band
		    in order from lowest to highest. Each element in the tuple
		    should be either 0 (temperature adjustment not allowed)
		    or 1 (temperature adjustment allowed). A maximum of four
		    corner bands may be used to partition the corner space into
		    contiguous corner ranges. For all corners within a corner band,
		    the same temperature adjustments are applied.

		    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-corner-bands property.

- qcom,cpr-corner-band-map
	Usage:      required if qcom,corner-band-allow-core-count-adjustment
		    or qcom,corner-band-allow-temp-adjustment is specified
		    for this CPR3 regulator.
	Value type: <prop-encoded-array>
	Definition: A list of integer tuples which correspond to corner numbers
		    and define the corner bands to be used for temperature or
		    per-core-count adjustments. The corner numbers must be specified
		    in increasing order to result in partitioning the corner space
		    into contiguous corner ranges. The supported tuple size is 1
		    to 4 elements. For example, a tuple with corners defined as
		    c1, c2, c3, c4 results in the following corner band mapping:

		    [c1, c2) -> Corner Band 1
		    [c2, c3) -> Corner Band 2
		    [c3, c4) -> Corner Band 3
		    [c4, inf)-> Corner Band 4

		    Corners less than c1 will have no per-core-count or temperature
		    adjustments. Adjustments associated with each corner band X are
		    defined in the corresponding
		    qcom,cpr-corner-bandX-temp-core-voltage-adjustment property.

		    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-corner-bands property.

- qcom,cpr-corner-bandX-temp-core-voltage-adjustment
	Usage:      required if qcom,corner-band-allow-core-count-adjustment
		    is specified for this CPR3 regulator.
	Value type: <prop-encoded-array>
	Definition: A grouping of integer tuple lists for corner bandX. The possible
		    values for X are 1 to 4. Each tuple defines the temperature based
		    voltage adjustment in microvolts for each temperature band
		    from lowest to highest for a given number of online cores. Each
		    tuple must have a number of elements equal to either (the number
		    of elements in qcom,cpr-temp-point-map + 1), if
		    qcom,cpr-temp-point-map is specified, or 1.

		    Each tuple list must contain a number of tuples equal to
		    either qcom,max-core-count, if qcom,max-core-count is
		    specified, or 1. The tuples should be ordered from lowest
		    to highest core count.

		    The tuple list grouping must contain qcom,cpr-fuse-combos
		    number of tuple lists in which case the lists are matched to
		    fuse combinations 1-to-1 or qcom,cpr-speed-bins number of
		    tuple lists in which case the lists are matched to
		    speed bins 1-to-1 or exactly 1 list which is used regardless
		    of the fuse combination and speed bin found on a given chip.

=======
Example
=======

apc0_cpr: cprh-ctrl@179c8000 {
	compatible = "qcom,cprh-msmcobalt-kbss-regulator";
	reg = <0x179c8000 0x4000>, <0x00784000 0x1000>;
	reg-names = "cpr_ctrl", "fuse_base";
	clocks = <&clock_gcc clk_gcc_hmss_rbcpr_clk>;
	clock-names = "core_clk";
	qcom,cpr-ctrl-name = "apc0";
	qcom,cpr-controller-id = <0>;

	qcom,cpr-sensor-time = <1000>;
	qcom,cpr-loop-time = <5000000>;
	qcom,cpr-idle-cycles = <15>;
	qcom,cpr-up-down-delay-time = <3000>;
	qcom,cpr-step-quot-init-min = <11>;
	qcom,cpr-step-quot-init-max = <13>;
	qcom,cpr-count-mode = <2>;		/* Staggered */
	qcom,cpr-down-error-step-limit = <1>;
	qcom,cpr-up-error-step-limit = <1>;
	qcom,cpr-corner-switch-delay-time = <1600>;
	qcom,cpr-voltage-settling-time = <1600>;

	qcom,apm-threshold-voltage = <800000>;
	qcom,apm-hysteresis-voltage = <4000>;
	qcom,voltage-step = <4000>;
	qcom,voltage-base = <352000>;
	qcom,cpr-saw-use-unit-mV;

	qcom,cpr-enable;
	qcom,cpr-hw-closed-loop;

	qcom,cpr-initial-temp-band = <3>;
	qcom,cpr-temp-point-map = <0 25 85>;

	thread@0 {
		qcom,cpr-thread-id = <0>;
		qcom,cpr-consecutive-up = <2>;
		qcom,cpr-consecutive-down = <2>;
		qcom,cpr-up-threshold = <0>;
		qcom,cpr-down-threshold = <0>;

		apc0_pwrcl_vreg: regulator-pwrcl {
			regulator-name = "apc0_pwrcl_corner";
			regulator-min-microvolt = <1>;
			regulator-max-microvolt = <24>;

			qcom,cpr-fuse-corners = <4>;
			qcom,cpr-fuse-combos = <1>;
			qcom,cpr-corners = <23>;

			qcom,cpr-corner-fmax-map = <7 10 17 23>;

			qcom,cpr-voltage-ceiling =
				<632000  632000  632000  632000  632000
				 632000  632000  700000  700000  700000
				 828000  828000  828000  828000  828000
				 828000  828000 1024000 1024000 1024000
				1024000 1024000 1024000>;

			qcom,cpr-voltage-floor =
				<572000  572000  572000  572000  572000
				 572000  572000  568000  568000  568000
				 684000  684000  684000  684000  684000
				 684000  684000  856000  856000  856000
				 856000  856000  856000>;

			qcom,corner-frequencies =
				<300000000  345600000  422400000
				 499200000  576000000  633600000
				 710400000  806400000  883200000
				 960000000 1036800000 1113600000
				1190400000 1248000000 1324800000
				1401600000 1478400000 1497600000
				1574400000 1651200000 1728000000
				1804800000 1881600000>;
			};

			qcom,cpr-corner-bands = <4>;
			qcom,corner-band-allow-core-count-adjustment = <1 1 1 1>;
			qcom,corner-band-allow-temp-adjustment = <1 0 0 0>;
			qcom,cpr-corner-band-map = <7 14 18 20>;
			qcom,max-core-count = <4>;
			qcom,cpr-corner-band1-temp-core-voltage-adjustment =
				<(-24000) (-20000) (-20000) (-16000)>,
				<(-16000) (-16000) (-12000) (-8000)>,
				<(-8000)  (-8000)  (-4000)  (-4000)>,
				<0     0     0     0>;
			qcom,cpr-corner-band2-temp-core-voltage-adjustment =
				<(-36000) 0 0 0>,
				<(-32000) 0 0 0>,
				<(-24000) 0 0 0>,
				<    0 0 0 0>;
			qcom,cpr-corner-band3-temp-core-voltage-adjustment =
				<(-40000) 0 0 0>,
				<(-36000) 0 0 0>,
				<(-32000) 0 0 0>,
				<    0 0 0 0>;
			qcom,cpr-corner-band4-temp-core-voltage-adjustment =
				<(-44000) 0 0 0>,
				<(-32000) 0 0 0>,
				<(-24000) 0 0 0>,
				<    0 0 0 0>;
		};
	};
}
+11 −0
Original line number Diff line number Diff line
@@ -877,6 +877,17 @@ config REGULATOR_CPR4_APSS
	  adjustments for performance boost mode. This driver reads both initial
	  voltage and CPR target quotient values out of hardware fuses.

config REGULATOR_CPRH_KBSS
	bool "CPRH regulator for KBSS"
	depends on OF
	select REGULATOR_CPR3
	help
	  This driver supports Qualcomm Technologies, Inc. KBSS application
	  processor specific features including CPR hardening (CPRh) and two
	  CPRh controllers which monitor the two KBSS clusters each powered by
	  independent voltage supplies. This driver reads both initial voltage
	  and CPR target quotient values out of hardware fuses.

config REGULATOR_KRYO
	bool "Kryo regulator driver"
	depends on OF
+1 −0
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ obj-$(CONFIG_REGULATOR_CPR3) += cpr3-regulator.o cpr3-util.o
obj-$(CONFIG_REGULATOR_CPR3_HMSS) += cpr3-hmss-regulator.o
obj-$(CONFIG_REGULATOR_CPR3_MMSS) += cpr3-mmss-regulator.o
obj-$(CONFIG_REGULATOR_CPR4_APSS) += cpr4-apss-regulator.o
obj-$(CONFIG_REGULATOR_CPRH_KBSS) += cprh-kbss-regulator.o
obj-$(CONFIG_REGULATOR_QPNP_LABIBB) += qpnp-labibb-regulator.o
obj-$(CONFIG_REGULATOR_STUB) += stub-regulator.o
obj-$(CONFIG_REGULATOR_KRYO) += kryo-regulator.o
+500 −38

File changed.

Preview size limit exceeded, changes collapsed.

+72 −1
Original line number Diff line number Diff line
@@ -105,7 +105,10 @@ struct cpr4_sdelta {
 * @mem_acc_volt:	The mem-acc-supply voltage in corners
 * @proc_freq:		Processor frequency in Hertz. For CPR rev. 3 and 4
 *			conrollers, this field is only used by platform specific
 *			CPR3 driver for interpolation.
 *			CPR3 driver for interpolation. For CPRh-compliant
 *			controllers, this frequency is also utilized by the
 *			clock driver to determine the corner to CPU clock
 *			frequency mappings.
 * @cpr_fuse_corner:	Fused corner index associated with this virtual corner
 *			(only used by platform specific CPR3 driver for
 *			mapping purposes)
@@ -125,6 +128,9 @@ struct cpr4_sdelta {
 *			E.g. a value of 900 would imply that the adjustment for
 *			this corner should be 90% (900/1000) of that for the
 *			reference corner.
 * @use_open_loop:	Boolean indicating that open-loop (i.e CPR disabled) as
 *			opposed to closed-loop operation must be used for this
 *			corner on CPRh controllers.
 * @sdelta:		The CPR4 controller specific data for this corner. This
 *			field is applicable for CPR4 controllers.
 *
@@ -149,6 +155,22 @@ struct cpr3_corner {
	u32			ro_mask;
	u32			irq_en;
	int			aging_derate;
	bool			use_open_loop;
	struct cpr4_sdelta	*sdelta;
};

/**
 * struct cprh_corner_band - CPRh controller specific data structure which
 *			encapsulates the range of corners and the SDELTA
 *			adjustment table to be applied to the corners within
 *			the min and max bounds of the corner band.
 * @corner:		Corner number which defines the corner band boundary
 * @sdelta:		The SDELTA adjustment table which contains core-count
 *			and temp based margin adjustments that are applicable
 *			to the corner band.
 */
struct cprh_corner_band {
	int			corner;
	struct cpr4_sdelta	*sdelta;
};

@@ -174,6 +196,9 @@ struct cpr3_corner {
 *			manage LDO retention bypass state
 * @corner:		Array of all corners supported by this CPR3 regulator
 * @corner_count:	The number of elements in the corner array
 * @corner_band:	Array of all corner bands supported by CPRh compatible
 *			controllers
 * @corner_band_count:	The number of elements in the corner band array
 * @platform_fuses:	Pointer to platform specific CPR fuse data (only used by
 *			platform specific CPR3 driver)
 * @speed_bin_fuse:	Value read from the speed bin fuse parameter
@@ -193,6 +218,17 @@ struct cpr3_corner {
 *			support is not required.
 * @speed_bin_offset:	The device tree property array offset for the selected
 *			speed bin
 * @fuse_combo_corner_band_sum: The sum of the corner band counts across all
 *			fuse combos
 * @fuse_combo_corner_band_offset: The device tree property array offset for
 *			the corner band count corresponding to the selected
 *			fuse combo
 * @speed_bin_corner_band_sum: The sum of the corner band counts across all
 *			speed bins. This may be specified as 0 if per speed bin
 *			parsing support is not required
 * @speed_bin_corner_band_offset: The device tree property array offset for the
 *			corner band count corresponding to the selected speed
 *			bin
 * @pd_bypass_mask:	Bit mask of power domains associated with this CPR3
 *			regulator
 * @dynamic_floor_corner: Index identifying the voltage corner for the CPR3
@@ -262,6 +298,8 @@ struct cpr3_regulator {
	struct regulator	*ldo_ret_regulator;
	struct cpr3_corner	*corner;
	int			corner_count;
	struct cprh_corner_band *corner_band;
	u32			corner_band_count;

	void			*platform_fuses;
	int			speed_bin_fuse;
@@ -274,6 +312,10 @@ struct cpr3_regulator {
	int			fuse_combo_offset;
	int			speed_bin_corner_sum;
	int			speed_bin_offset;
	int			fuse_combo_corner_band_sum;
	int			fuse_combo_corner_band_offset;
	int			speed_bin_corner_band_sum;
	int			speed_bin_corner_band_offset;
	u32			pd_bypass_mask;
	int			dynamic_floor_corner;
	bool			uses_dynamic_floor;
@@ -385,10 +427,12 @@ enum cpr3_count_mode {
 * enum cpr_controller_type - supported CPR controller hardware types
 * %CPR_CTRL_TYPE_CPR3:	HW has CPR3 controller
 * %CPR_CTRL_TYPE_CPR4:	HW has CPR4 controller
 * %CPR_CTRL_TYPE_CPRH:	HW has CPRh controller
 */
enum cpr_controller_type {
	CPR_CTRL_TYPE_CPR3,
	CPR_CTRL_TYPE_CPR4,
	CPR_CTRL_TYPE_CPRH,
};

/**
@@ -418,6 +462,8 @@ struct cpr3_aging_sensor_info {
 * struct cpr3_controller - CPR3 controller data structure
 * @dev:		Device pointer for the CPR3 controller device
 * @name:		Unique name for the CPR3 controller
 * @ctrl_id:		Controller ID corresponding to the VDD supply number
 *			that this CPR3 controller manages.
 * @cpr_ctrl_base:	Virtual address of the CPR3 controller base register
 * @fuse_base:		Virtual address of fuse row 0
 * @list:		list head used in a global cpr3-regulator list so that
@@ -466,6 +512,11 @@ struct cpr3_aging_sensor_info {
 *			or equal to the APM threshold voltage
 * @apm_low_supply:	APM supply to configure if the VDD voltage is less than
 *			the APM threshold voltage
 * @base_volt:		Minimum voltage in microvolts supported by the VDD
 *			supply managed by this CPR controller
 * @corner_switch_delay_time: The delay time in nanoseconds used by the CPR
 *			controller to wait for voltage settling before
 *			acknowledging the OSM block after corner changes
 * @cpr_clock_rate:	CPR reference clock frequency in Hz.
 * @sensor_time:	The time in nanoseconds that each sensor takes to
 *			perform a measurement.
@@ -588,6 +639,7 @@ struct cpr3_aging_sensor_info {
struct cpr3_controller {
	struct device		*dev;
	const char		*name;
	int			ctrl_id;
	void __iomem		*cpr_ctrl_base;
	void __iomem		*fuse_base;
	struct list_head	list;
@@ -614,6 +666,8 @@ struct cpr3_controller {
	int			apm_adj_volt;
	enum msm_apm_supply	apm_high_supply;
	enum msm_apm_supply	apm_low_supply;
	int			base_volt;
	u32			corner_switch_delay_time;
	u32			cpr_clock_rate;
	u32			sensor_time;
	u32			loop_time;
@@ -701,6 +755,8 @@ int cpr3_parse_array_property(struct cpr3_regulator *vreg,
			const char *prop_name, int tuple_size, u32 *out);
int cpr3_parse_corner_array_property(struct cpr3_regulator *vreg,
			const char *prop_name, int tuple_size, u32 *out);
int cpr3_parse_corner_band_array_property(struct cpr3_regulator *vreg,
			const char *prop_name, int tuple_size, u32 *out);
int cpr3_parse_common_corner_data(struct cpr3_regulator *vreg);
int cpr3_parse_thread_u32(struct cpr3_thread *thread, const char *propname,
			u32 *out_value, u32 value_min, u32 value_max);
@@ -720,6 +776,8 @@ int cpr3_voltage_adjustment(int ro_scale, int quot_adjust);
int cpr3_parse_closed_loop_voltage_adjustments(struct cpr3_regulator *vreg,
			u64 *ro_sel, int *volt_adjust,
			int *volt_adjust_fuse, int *ro_scale);
int cpr4_parse_core_count_temp_voltage_adj(struct cpr3_regulator *vreg,
			bool use_corner_band);
int cpr3_apm_init(struct cpr3_controller *ctrl);
int cpr3_mem_acc_init(struct cpr3_regulator *vreg);

@@ -793,6 +851,13 @@ static inline int cpr3_parse_corner_array_property(struct cpr3_regulator *vreg,
	return -EPERM;
}

static inline int cpr3_parse_corner_band_array_property(
			struct cpr3_regulator *vreg, const char *prop_name,
			int tuple_size, u32 *out)
{
	return -EPERM;
}

static inline int cpr3_parse_common_corner_data(struct cpr3_regulator *vreg)
{
	return -EPERM;
@@ -871,6 +936,12 @@ static inline int cpr3_parse_closed_loop_voltage_adjustments(
	return 0;
}

static inline int cpr4_parse_core_count_temp_voltage_adj(
			struct cpr3_regulator *vreg, bool use_corner_band)
{
	return 0;
}

static inline int cpr3_apm_init(struct cpr3_controller *ctrl)
{
	return 0;
Loading