]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
imx: imx9: fixup thermal trips from fuses
authorPrimoz Fiser <primoz.fiser@norik.com>
Thu, 11 Jan 2024 12:56:25 +0000 (13:56 +0100)
committerFabio Estevam <festevam@gmail.com>
Fri, 12 Jan 2024 18:01:55 +0000 (15:01 -0300)
Read i.MX9 CPU temp grade from fuses and fixup thermal trips in Linux
device-tree accordingly.

Based on commit 0543a1ed2787 ("imx8m: fixup thermal trips")

Signed-off-by: Primoz Fiser <primoz.fiser@norik.com>
arch/arm/mach-imx/imx9/soc.c

index 86b45be3d804f7de697f5825729860de095f0085..f06339f13880d116f2ae1578f52050bc22dd479f 100644 (file)
@@ -507,8 +507,53 @@ int print_cpuinfo(void)
        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 - 5);
+               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)
 {
+       if (fixup_thermal_trips(blob, "cpu-thermal"))
+               printf("Failed to update cpu-thermal trip(s)");
+
        return 0;
 }