/*
 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <dt-bindings/interrupt-controller/arm-gic.h>

&rpm_bus {
	rpm-regulator-ldoc1 {
		status = "okay";
		pm8004_l1: regulator-l1 {
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1200000>;
			qcom,init-voltage = <1200000>;
			status = "okay";
		};
	};
};

&spmi_bus {
	qcom,pm8953@1 {
		/delete-node/ spm-regulator@2000;
	};

	pmic@5 {
		#size-cells = <1>;

		/* PM8004 S2 + S4 + S5 = VDD_APC supply */
		pm8004_s2: spm-regulator@1d00 {
			compatible = "qcom,spm-regulator";
			reg = <0x1d00 0x100>;
			regulator-name = "pm8004_s2";
			regulator-min-microvolt = <400000>;
			regulator-max-microvolt = <1140000>;

			pm8004_s2_limit: avs-limit-regulator {
				regulator-name = "pm8004_s2_avs_limit";
				regulator-min-microvolt = <400000>;
				regulator-max-microvolt = <1140000>;
			};
		};
	};
};

&soc {
	/delete-node/ regulator@19461d4;
	/delete-node/ cpr4-ctrl@b018000;
	/delete-node/ regulator@194415c;
	/delete-node/ ldo@185f000;

	apc_mem_acc_vreg: apc-mem-acc-regulator {
		compatible = "qcom,mem-acc-regulator";
		regulator-name = "apc_mem_acc_corner";
		regulator-min-microvolt = <1>;
		regulator-max-microvolt = <3>;
		qcom,acc-reg-addr-list = <0x0b1d1360 0x0b1d1364
					  0x0b1d1368 0x0b1d136c 0x0b1d1370>;
		qcom,num-acc-corners = <3>;
		qcom,boot-acc-corner = <1>;
		qcom,corner1-reg-config =
			/* 1 -> 1 */
			<(-1) (-1)>, <(-1) (-1)>,
			<(-1) (-1)>, <(-1) (-1)>,     <(-1) (-1)>,
			/* 1 -> 2 */
			<  1   0x0>, <  2   0x0>,
			<  3   0x0>, <  4   0x0>,     <  5   0x0>,
			/* 1 -> 3 */
			<  1   0x0>, <  2   0x1>,
			<  3   0x0>, <  4   0x10000>, <  5   0x0>;
		qcom,corner2-reg-config =
			/* 2 -> 1 */
			<  1   0x0>, <  2  0x80000000>,
			<  3   0x0>, <  4   0x0>, < 5 0x80000000>,
			/* 2 -> 2 */
			<(-1) (-1)>, <(-1) (-1)>,
			<(-1) (-1)>, <(-1) (-1)>,     <(-1) (-1)>,
			/* 2 -> 3 */
			<  1   0x0>, <  2  0x1>,
			<  3   0x0>, <  4   0x10000>, <  5   0x0>;
		qcom,corner3-reg-config =
			/* 3 -> 1 */
			<  1   0x0>, <  2  0x80000000>,
			<  3   0x0>, <  4   0x0>, < 5 0x80000000>,
			/* 3 -> 2 */
			<  1   0x0>, <  2  0x0>,
			<  3   0x0>, <  4   0x0>, < 5   0x0>,
			/* 3 -> 3 */
			<(-1) (-1)>, <(-1) (-1)>,
			<(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>;
	};

	apc_cpr: cpr4-ctrl@b018000 {
		compatible = "qcom,cpr4-sdm632-apss-regulator";
		reg = <0xb018000 0x4000>, <0xa4000 0x1000>;
		reg-names = "cpr_ctrl", "fuse_base";
		interrupts = <GIC_SPI 15 IRQ_TYPE_EDGE_RISING>;
		interrupt-names = "cpr";

		qcom,cpr-ctrl-name = "apc";

		qcom,cpr-sensor-time = <1000>;
		qcom,cpr-loop-time = <5000000>;
		qcom,cpr-idle-cycles = <15>;
		qcom,cpr-step-quot-init-min = <12>;
		qcom,cpr-step-quot-init-max = <14>;
		qcom,cpr-count-mode = <0>;		/* All-at-once */
		qcom,cpr-count-repeat = <14>;
		qcom,cpr-down-error-step-limit = <1>;
		qcom,cpr-up-error-step-limit = <1>;

		qcom,apm-ctrl = <&apc_apm>;
		qcom,apm-threshold-voltage = <875000>;
		qcom,apm-hysteresis-voltage = <20000>;

		vdd-supply = <&pm8004_s2>;
		qcom,voltage-step = <5000>;
		vdd-limit-supply = <&pm8004_s2_limit>;
		mem-acc-supply = <&apc_mem_acc_vreg>;

		qcom,cpr-panic-reg-addr-list =
			<0xb1d2c18 0xb1d2900 0x0b1112b0 0xb018798>;
		qcom,cpr-panic-reg-name-list =
			"CCI_SAW4_PMIC_STS", "CCI_SAW4_VCTL",
			"APCS_ALIAS0_APM_CTLER_STATUS",
			"APCS0_CPR_CORE_ADJ_MODE_REG";

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

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

				qcom,cpr-fuse-corners = <5>;
				qcom,cpr-fuse-combos = <8>;
				qcom,cpr-corners = <7>;
				qcom,cpr-corner-fmax-map = <1 2 3 4 7>;

				qcom,cpr-voltage-ceiling =
					<720000  720000 790000 865000 920000
					 990000 1065000>;

				qcom,cpr-voltage-floor =
					<500000  500000 500000 500000 500000
					 500000  500000>;

				qcom,mem-acc-voltage = <1 1 2 2 2 2 3>;

				qcom,corner-frequencies =
					<614400000  883200000 1036800000
					1363200000 1536000000 1670400000
					1785600000>;

				qcom,cpr-ro-scaling-factor =
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>,
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>,
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>,
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>,
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>;

				qcom,allow-voltage-interpolation;
				qcom,allow-quotient-interpolation;
				qcom,cpr-scaled-open-loop-voltage-as-ceiling;
			};
		};

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

			apc1_perfcl_vreg: regulator {
				regulator-name = "apc1_perfcl_corner";
				regulator-min-microvolt = <1>;
				regulator-max-microvolt = <5>;

				qcom,cpr-fuse-corners = <3>;
				qcom,cpr-fuse-combos = <8>;
				qcom,cpr-corners = <5>;
				qcom,cpr-corner-fmax-map = <1 2 5>;

				qcom,cpr-voltage-ceiling =
					<790000 865000 920000 990000 1065000>;

				qcom,cpr-voltage-floor =
					<500000  500000 500000 500000 500000>;

				qcom,mem-acc-voltage = <2 2 2 2 3>;

				qcom,corner-frequencies =
					<1094400000 1401600000 1555200000
					 1785600000 1996200000>;

				qcom,cpr-ro-scaling-factor =
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>,
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>,
				      <3600 3600 3830 2430 2520 2700 1790 1760
				       1970 1880 2110 2010 2510 4900 4370 4780>;

				qcom,allow-voltage-interpolation;
				qcom,allow-quotient-interpolation;
				qcom,cpr-scaled-open-loop-voltage-as-ceiling;
			};
		};
	};

	gfx_mem_acc: regulator@194415c {
		compatible = "qcom,mem-acc-regulator";
		reg = <0x0194415c 0x4>;
		reg-names = "acc-sel-l1";
		regulator-name = "gfx_mem_acc_corner";
		regulator-min-microvolt = <1>;
		regulator-max-microvolt = <2>;

		qcom,acc-sel-l1-bit-pos = <0>;
		qcom,acc-sel-l1-bit-size = <1>;
		qcom,corner-acc-map = <0x1 0x0>;
	};

	gfx_vreg_corner: ldo@185f000 {
		compatible = "qcom,msm8953-gfx-ldo";
		reg = <0x0185f000 0x30>, <0xa4000 0x1000>;
		reg-names = "ldo_addr", "efuse_addr";

		regulator-name = "msm_gfx_ldo";
		regulator-min-microvolt = <1>;
		regulator-max-microvolt = <7>;

		qcom,ldo-voltage-ceiling = <620000 680000 750000>;
		qcom,ldo-voltage-floor =   <510000 510000 600000>;

		qcom,num-corners = <7>;
		qcom,num-ldo-corners = <3>;
		qcom,ldo-enable-corner-map = <0 0 0 0 0 0 0>;
		qcom,init-corner = <4>;

		vdd-cx-supply = <&pm8953_s2_level>;
		qcom,vdd-cx-corner-map = <RPM_SMD_REGULATOR_LEVEL_LOW_SVS>,
					<RPM_SMD_REGULATOR_LEVEL_LOW_SVS>,
					<RPM_SMD_REGULATOR_LEVEL_SVS>,
					<RPM_SMD_REGULATOR_LEVEL_SVS_PLUS>,
					<RPM_SMD_REGULATOR_LEVEL_NOM>,
					<RPM_SMD_REGULATOR_LEVEL_NOM_PLUS>,
					<RPM_SMD_REGULATOR_LEVEL_TURBO>;

		mem-acc-supply = <&gfx_mem_acc>;
		qcom,mem-acc-corner-map = <1 1 1 2 2 2 2>;
	};
};
