/*
 * Device tree sources for Exynos5433 thermal zone
 *
 * Copyright (c) 2016 Chanwoo Choi <cw00.choi@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#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";
			};
		};
	};
};
};
