/*
 * Copyright (c) 2017, 2020 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/ {
	thermal-zones {
		tsens_tz_sensor4 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 4>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor5 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 5>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor6 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 6>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor7 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 7>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor8 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 8>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor9 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 9>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor10 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 10>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor11 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 11>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor12 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 12>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor13 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 13>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor14 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 14>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};

		tsens_tz_sensor15 {
			polling-delay-passive = <0>;
			polling-delay = <0>;
			thermal-sensors = <&tsens 15>;

			trips {
				cpu-critical-hi {
					temperature = <125>;
					hysteresis = <2>;
					type = "critical_high";
				};

				cpu-config-hi {
					temperature = <105>;
					hysteresis = <2>;
					type = "configurable_hi";
				};

				cpu-config-lo {
					temperature = <95>;
					hysteresis = <2>;
					type = "configurable_lo";
				};

				cpu-critical-low {
					temperature = <0>;
					hysteresis = <2>;
					type = "critical_low";
				};
			};
		};
	};
};

&soc {
	tsens: thermal-sensor@4a9000 {
		compatible = "qcom,ipq8074-tsens";
		reg = <0x4a9000 0x1000>, /* TM */
		      <0x4a8000 0x1000>; /* SROT */
		interrupts = <GIC_SPI 184 IRQ_TYPE_EDGE_RISING>;
		#qcom,sensors = <16>;
		#thermal-sensor-cells = <1>;
		tsens-up-low-int-clr-deassert-quirk;
		status = "ok";
	};
};
