// SPDX-License-Identifier: GPL-2.0
/*
 * Device tree sources for Exynos5433 thermal zone
 *
 * Copyright (c) 2016 Chanwoo Choi <cw00.choi@samsung.com>
 */

#include <dt-bindings/thermal/thermal.h>

/ {
thermal-zones {
	atlas0_thermal: atlas0-thermal {
		thermal-sensors = <&tmu_atlas0>;
		polling-delay-passive = <0>;
		polling-delay = <0>;
		trips {
			atlas0_alert_0: atlas0-alert-0 {
				temperature = <65000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas0_alert_1: atlas0-alert-1 {
				temperature = <70000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas0_alert_2: atlas0-alert-2 {
				temperature = <75000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas0_alert_3: atlas0-alert-3 {
				temperature = <80000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas0_alert_4: atlas0-alert-4 {
				temperature = <85000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas0_alert_5: atlas0-alert-5 {
				temperature = <90000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas0_alert_6: atlas0-alert-6 {
				temperature = <95000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
		};

		cooling-maps {
			map0 {
				/* Set maximum frequency as 1800MHz  */
				trip = <&atlas0_alert_0>;
				cooling-device = <&cpu4 1 2>;
			};
			map1 {
				/* Set maximum frequency as 1700MHz  */
				trip = <&atlas0_alert_1>;
				cooling-device = <&cpu4 2 3>;
			};
			map2 {
				/* Set maximum frequency as 1600MHz  */
				trip = <&atlas0_alert_2>;
				cooling-device = <&cpu4 3 4>;
			};
			map3 {
				/* Set maximum frequency as 1500MHz  */
				trip = <&atlas0_alert_3>;
				cooling-device = <&cpu4 4 5>;
			};
			map4 {
				/* Set maximum frequency as 1400MHz  */
				trip = <&atlas0_alert_4>;
				cooling-device = <&cpu4 5 7>;
			};
			map5 {
				/* Set maximum frequencyas 1200MHz  */
				trip = <&atlas0_alert_5>;
				cooling-device = <&cpu4 7 9>;
			};
			map6 {
				/* Set maximum frequency as 1000MHz  */
				trip = <&atlas0_alert_6>;
				cooling-device = <&cpu4 9 14>;
			};
		};
	};

	atlas1_thermal: atlas1-thermal {
		thermal-sensors = <&tmu_atlas1>;
		polling-delay-passive = <0>;
		polling-delay = <0>;
		trips {
			atlas1_alert_0: atlas1-alert-0 {
				temperature = <65000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas1_alert_1: atlas1-alert-1 {
				temperature = <70000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas1_alert_2: atlas1-alert-2 {
				temperature = <75000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas1_alert_3: atlas1-alert-3 {
				temperature = <80000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas1_alert_4: atlas1-alert-4 {
				temperature = <85000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas1_alert_5: atlas1-alert-5 {
				temperature = <90000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			atlas1_alert_6: atlas1-alert-6 {
				temperature = <95000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
		};
	};

	g3d_thermal: g3d-thermal {
		thermal-sensors = <&tmu_g3d>;
		polling-delay-passive = <0>;
		polling-delay = <0>;
		trips {
			g3d_alert_0: g3d-alert-0 {
				temperature = <70000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			g3d_alert_1: g3d-alert-1 {
				temperature = <75000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			g3d_alert_2: g3d-alert-2 {
				temperature = <80000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			g3d_alert_3: g3d-alert-3 {
				temperature = <85000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			g3d_alert_4: g3d-alert-4 {
				temperature = <90000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			g3d_alert_5: g3d-alert-5 {
				temperature = <95000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			g3d_alert_6: g3d-alert-6 {
				temperature = <100000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
		};
	};

	apollo_thermal: apollo-thermal {
		thermal-sensors = <&tmu_apollo>;
		polling-delay-passive = <0>;
		polling-delay = <0>;
		trips {
			apollo_alert_0: apollo-alert-0 {
				temperature = <65000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			apollo_alert_1: apollo-alert-1 {
				temperature = <70000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			apollo_alert_2: apollo-alert-2 {
				temperature = <75000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			apollo_alert_3: apollo-alert-3 {
				temperature = <80000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			apollo_alert_4: apollo-alert-4 {
				temperature = <85000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			apollo_alert_5: apollo-alert-5 {
				temperature = <90000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			apollo_alert_6: apollo-alert-6 {
				temperature = <95000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
		};

		cooling-maps {
			map0 {
				/* Set maximum frequency as 1200MHz  */
				trip = <&apollo_alert_2>;
				cooling-device = <&cpu0 1 2>;
			};
			map1 {
				/* Set maximum frequency as 1100MHz  */
				trip = <&apollo_alert_3>;
				cooling-device = <&cpu0 2 3>;
			};
			map2 {
				/* Set maximum frequency as 1000MHz  */
				trip = <&apollo_alert_4>;
				cooling-device = <&cpu0 3 4>;
			};
			map3 {
				/* Set maximum frequency as 900MHz  */
				trip = <&apollo_alert_5>;
				cooling-device = <&cpu0 4 5>;
			};
			map4 {
				/* Set maximum frequency as 800MHz  */
				trip = <&apollo_alert_6>;
				cooling-device = <&cpu0 5 9>;
			};
		};
	};

	isp_thermal: isp-thermal {
		thermal-sensors = <&tmu_isp>;
		polling-delay-passive = <0>;
		polling-delay = <0>;
		trips {
			isp_alert_0: isp-alert-0 {
				temperature = <80000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			isp_alert_1: isp-alert-1 {
				temperature = <85000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			isp_alert_2: isp-alert-2 {
				temperature = <90000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			isp_alert_3: isp-alert-3 {
				temperature = <95000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			isp_alert_4: isp-alert-4 {
				temperature = <100000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			isp_alert_5: isp-alert-5 {
				temperature = <105000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
			isp_alert_6: isp-alert-6 {
				temperature = <110000>;	/* millicelsius */
				hysteresis = <1000>;	/* millicelsius */
				type = "active";
			};
		};
	};
};
};
