/* Copyright (c) 2015-2019, 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.
 */

&soc {
	/delete-node/ qcom,clock-a7@0b011050;
	clock_cpu: qcom,clock-a7@0b011050 {
		compatible = "qcom,clock-a53-8916";
		reg = <0x0b011050 0x8>,
		      <0x0005c00c 0x8>;
		reg-names = "rcg-base", "efuse";
		qcom,safe-freq = < 400000000 >;
		cpu-vdd-supply = <&apc_vreg_corner>;
		clocks = <&clock_gcc clk_gpll0_ao_clk_src>,
			 <&clock_gcc clk_a7sspll>;
		clock-names = "clk-4", "clk-5";
		qcom,enable-opp;
		qcom,speed0-bin-v0 =
			<          0 0>,
			<  800000000 4>,
			< 1267200000 9>;

		qcom,speed2-bin-v0 =
			<          0 0>,
			<  800000000 4>,
			< 1094400000 6>;
		#clock-cells = <1>;
	};

	/delete-node/ qcom,msm-cpufreq;
	qcom,msm-cpufreq {
		reg = <0 4>;
		compatible = "qcom,msm-cpufreq";
		clocks = <&clock_cpu  clk_a7ssmux>,
			 <&clock_cpu  clk_a7ssmux>,
			 <&clock_cpu  clk_a7ssmux>,
			 <&clock_cpu  clk_a7ssmux>;
		clock-names = "cpu0_clk", "cpu1_clk",
				"cpu2_clk", "cpu3_clk";
		qcom,cpufreq-table =
			 <  800000 >,
			 < 1094400 >,
			 < 1267200 >;
	};

	/delete-node/ qcom,cpubw;
	cpubw: qcom,cpubw {
		compatible = "qcom,devbw";
		governor = "cpufreq";
		qcom,src-dst-ports = <1 512>;
		qcom,active-only;
		qcom,bw-tbl =
			<  732 /*  96 MHz */>,
			< 1464 /* 192 MHz */>,
			< 2929 /* 384 MHz */>;
	};

	/delete-node/ devfreq-cpufreq;
	devfreq-cpufreq {
		cpubw-cpufreq {
			target-dev = <&cpubw>;
			cpu-to-dev-map =
				 <  800000  1464>,
				 < 1094400  2929>,
				 < 1267200  2929>;
		};
	};
};

&usb_otg {
	qcom,enumeration-check-for-sdp;
};

&qcom_crypto {
	qcom,msm-bus,vectors-KBps =
		<55 512 0 0>,
		<55 512 393600 393600>; /* 49.2MHz & 49.2MHz */
};

&qcom_cedev {
	qcom,msm-bus,vectors-KBps =
		<55 512 0 0>,
		<55 512 393600 393600>; /* 49.2MHz & 49.2MHz */
};

&qcom_seecom {
	qcom,msm-bus,vectors-KBps =
		<55 512 0 0>,
		<55 512 0 0>,
		<55 512 196800 196800>,
		<55 512 393600 393600>;
};

&mdss_dsi0 {
	qcom,dsi-pref-prim-pan = <&dsi_auo_cx_qvga_cmd>;
	pinctrl-names = "mdss_default", "mdss_sleep";
	pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
	pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;

	qcom,platform-te-gpio = <&msm_gpio 24 0>;
	qcom,platform-reset-gpio = <&msm_gpio 25 0>;
	qcom,platform-bklight-en-gpio = <&msm_gpio 37 0>;
};

&thermal_zones {
	gpu-step {
		trips {
			gpu-step-trip {
				temperature = <70000>;
			};
		};
	};
	cpu0-2-step {
		trips {
			cpu0-2-step-trip {
				temperature = <60000>;
			};
		};
	};
	cpu1-3-step {
		trips {
			cpu1-3-step-trip {
				temperature = <60000>;
			};
		};
	};

	case-therm-step {
		polling-delay-passive = <5000>;
		polling-delay = <0>;
		thermal-sensors = <&pm660_adc_tm 0x51>;
		thermal-governor = "step_wise";
		trips {
			cpu_freq_trip: cpu-freq-trip {
				temperature = <40000>;
				hysteresis = <0>;
				type = "passive";
			};
			modem_mon_trip0: modem-mon-trip0 {
				temperature = <47000>;
				hysteresis = <2000>;
				type = "passive";
			};
			modem_mon_trip1: modem-mon-trip1 {
				temperature = <55000>;
				hysteresis = <2000>;
				type = "passive";
			};
			cpu1_hotplug_trip: cpu1-hotplug-trip {
				temperature = <49000>;
				hysteresis = <3000>;
				type = "passive";
			};
		};
		cooling-maps {
			cpu0_cdev {
				trip = <&cpu_freq_trip>;
				cooling-device =
					<&CPU0 THERMAL_NO_LIMIT 2>;
			};
			cpu1_cdev {
				trip = <&cpu_freq_trip>;
				cooling-device =
					<&CPU1 THERMAL_NO_LIMIT 2>;
			};
			cpu2_cdev {
				trip = <&cpu_freq_trip>;
				cooling-device =
					<&CPU2 THERMAL_NO_LIMIT 2>;
			};
			cpu3_cdev {
				trip = <&cpu_freq_trip>;
				cooling-device =
					<&CPU3 THERMAL_NO_LIMIT 2>;
			};
			modem_lvl1 {
				trip = <&modem_mon_trip0>;
				cooling-device = <&modem_pa 2 2>;
			};
			modem_lvl2 {
				trip = <&modem_mon_trip1>;
				cooling-device = <&modem_pa 3 3>;
			};
			hotplug_cpu1_cdev {
				trip = <&cpu1_hotplug_trip>;
				cooling-device =
					<&CPU1 THERMAL_MAX_LIMIT
						THERMAL_MAX_LIMIT>;
			};
		};
	};
	mdm-lowf {
		cooling-maps {
			cx_vdd_cdev {
				cooling-device = <&pm660_cx_cdev 0 0>;
			};
		};
	};
	camera-lowf {
		cooling-maps {
			cx_vdd_cdev {
				cooling-device = <&pm660_cx_cdev 0 0>;
			};
		};
	};
	gpu-lowf {
		cooling-maps {
			cx_vdd_cdev {
				cooling-device = <&pm660_cx_cdev 0 0>;
			};
		};
	};
	cpu0-2-lowf {
		cooling-maps {
			cx_vdd_cdev {
				cooling-device = <&pm660_cx_cdev 0 0>;
			};
		};
	};
	cpu1-3-lowf {
		cooling-maps {
			cx_vdd_cdev {
				cooling-device = <&pm660_cx_cdev 0 0>;
			};
		};
	};
};
