]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arch/arm/mach-omap2/omap5/fdt.c: ft_fixup_clocks: use clock-output-names property...
authorRomain Naour <romain.naour@skf.com>
Mon, 22 Jan 2024 10:30:44 +0000 (11:30 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 5 Mar 2024 13:39:17 +0000 (08:39 -0500)
Clock names has been updated in kernel 5.19+ with the removal of
non-standard node names [1]. Due to this change, ft_opp_clock_fixups()
doesn't work anymore since ft_fixup_clocks() is looking to the clock
name and ft_opp_clock_fixups() error out with the following message:

  ft_fixup_clocks failed for DSP voltage domain: <valid offset/length>

We can't use the new clock name since several clock are using the same
generic name "clock". ft_opp_clock_fixups() is looking at the clocks
node in cm_core_aon@0:

/sys/firmware/devicetree/base/ocp/interconnect@4a000000/segment@0/target-module@5000/cm_core_aon@0/clocks
  ...
  clock@120
  clock@160
  clock@1a0
  clock@1e0
  clock@210
  clock@234
  clock@284
  clock@2a8
  clock@2d8

When fdt_subnode_offset() fail, we can look at clock-output-names
property as fallback since it contain the previous clock name.

libfdt doesn't provide any support to replace fdt_subnode_offset() by
a new function looking for clock-output-names property instead of the
node name. So we have to implement it in arch/arm/mach-omap2/omap5/fdt.c
for now.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=e4920169e7a2a839836d3a0d8cda1bae8caa3056

Cc: Suman Anna <s-anna@ti.com>
Cc: Tom Rini <trini@konsulko.com>
Cc: Andrew Davis <afd@ti.com>
Signed-off-by: Romain Naour <romain.naour@skf.com>
arch/arm/mach-omap2/omap5/fdt.c

index a8c301c6c28f0ad8c7f4e34412cf5e7a0357cc48..0ca02e664c4bc64ed7bd03af13ba14f31862320b 100644 (file)
@@ -206,9 +206,28 @@ u32 dra7_opp_gpu_clk_rates[NUM_OPPS][OPP_GPU_CLK_NUM] = {
        {1064000000, 532000000}, /* OPP_HIGH */
 };
 
+static int fdt_clock_output_name_eq_(const void *fdt, int offset,
+                                    const char *s, int len)
+{
+       int olen;
+       const char *p = fdt_getprop(fdt, offset, "clock-output-names", &olen);
+
+       if (!p)
+               /* short match */
+               return 0;
+
+       if (memcmp(p, s, len) != 0)
+               return 0;
+
+       if (p[len] == '\0')
+               return 1;
+       else
+               return 0;
+}
+
 static int ft_fixup_clocks(void *fdt, const char **names, u32 *rates, int num)
 {
-       int offs, node_offs, ret, i;
+       int offs, node_offs, subnode, ret, i;
        uint32_t phandle;
 
        offs = fdt_path_offset(fdt, "/ocp/interconnect@4a000000/segment@0/target-module@5000/cm_core_aon@0/clocks");
@@ -223,9 +242,19 @@ static int ft_fixup_clocks(void *fdt, const char **names, u32 *rates, int num)
        for (i = 0; i < num; i++) {
                node_offs = fdt_subnode_offset(fdt, offs, names[i]);
                if (node_offs < 0) {
-                       debug("Could not find clock sub-node %s: %s\n",
-                             names[i], fdt_strerror(node_offs));
-                       return offs;
+                       for (subnode = fdt_first_subnode(fdt, offs);
+                            subnode >= 0;
+                            subnode = fdt_next_subnode(fdt, subnode)) {
+                               ret = fdt_clock_output_name_eq_(fdt, subnode, names[i],
+                                                               strlen(names[i]));
+                               if (ret)
+                                       node_offs = subnode;
+                       }
+                       if (node_offs < 0) {
+                               debug("Could not find clock sub-node %s: %s\n",
+                                     names[i], fdt_strerror(node_offs));
+                               return offs;
+                       }
                }
 
                phandle = fdt_get_phandle(fdt, node_offs);