]> git.baikalelectronics.ru Git - uboot.git/commitdiff
imx8m: fixup thermal trips
authorAndrejs Cainikovs <andrejs.cainikovs@toradex.com>
Fri, 27 May 2022 13:20:42 +0000 (15:20 +0200)
committerStefano Babic <sbabic@denx.de>
Tue, 28 Jun 2022 11:35:09 +0000 (13:35 +0200)
Fixup thermal trips in Linux device tree according to SoC thermal
grade.

Signed-off-by: Andrejs Cainikovs <andrejs.cainikovs@toradex.com>
Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Tested-by: Adam Ford <aford173@gmail.com>
arch/arm/mach-imx/imx8m/soc.c

index 59335356b579ccec485638e542591417798c554d..e4e56079cf3ac99943547aa619fba71d8987a640 100644 (file)
@@ -1203,6 +1203,48 @@ static int cleanup_nodes_for_efi(void *blob)
        return 0;
 }
 
+static int fixup_thermal_trips(void *blob, const char *name)
+{
+       int minc, maxc;
+       int node, trip;
+
+       node = fdt_path_offset(blob, "/thermal-zones");
+       if (node < 0)
+               return node;
+
+       node = fdt_subnode_offset(blob, node, name);
+       if (node < 0)
+               return node;
+
+       node = fdt_subnode_offset(blob, node, "trips");
+       if (node < 0)
+               return node;
+
+       get_cpu_temp_grade(&minc, &maxc);
+
+       fdt_for_each_subnode(trip, blob, node) {
+               const char *type;
+               int temp, ret;
+
+               type = fdt_getprop(blob, trip, "type", NULL);
+               if (!type)
+                       continue;
+
+               temp = 0;
+               if (!strcmp(type, "critical"))
+                       temp = 1000 * maxc;
+               else if (!strcmp(type, "passive"))
+                       temp = 1000 * (maxc - 10);
+               if (temp) {
+                       ret = fdt_setprop_u32(blob, trip, "temperature", temp);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
 int ft_system_setup(void *blob, struct bd_info *bd)
 {
 #ifdef CONFIG_IMX8MQ
@@ -1345,6 +1387,13 @@ usb_modify_speed:
 #endif
 
        cleanup_nodes_for_efi(blob);
+
+       if (fixup_thermal_trips(blob, "cpu-thermal"))
+               printf("Failed to update cpu-thermal trip(s)");
+       if (IS_ENABLED(CONFIG_IMX8MP) &&
+           fixup_thermal_trips(blob, "soc-thermal"))
+               printf("Failed to update soc-thermal trip(s)");
+
        return 0;
 }
 #endif