]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
timer-uclass: relocate ops pointers for CONFIG_NEEDS_MANUAL_RELOC
authorOvidiu Panait <ovpanait@gmail.com>
Wed, 12 Oct 2022 05:36:55 +0000 (08:36 +0300)
committerMichal Simek <michal.simek@amd.com>
Tue, 22 Nov 2022 14:02:07 +0000 (15:02 +0100)
Relocate timer_ops pointers when CONFIG_NEEDS_MANUAL_RELOC is enabled.

The (gd->flags & GD_FLG_RELOC) check was added to make sure the reloc_done
logic works for drivers that use DM_FLAG_PRE_RELOC.

Signed-off-by: Ovidiu Panait <ovpanait@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Link: https://lore.kernel.org/r/20221012053656.1492457-2-ovpanait@gmail.com
Signed-off-by: Michal Simek <michal.simek@amd.com>
drivers/timer/timer-uclass.c

index bdc77b38223fed0bc93eb1198d0b2405a2b624ae..bb719792135358e0b4a663bfee9ba2760d43e048 100644 (file)
@@ -18,6 +18,7 @@
 #include <init.h>
 #include <timer.h>
 #include <linux/err.h>
+#include <relocate.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -50,6 +51,19 @@ unsigned long notrace timer_get_rate(struct udevice *dev)
 
 static int timer_pre_probe(struct udevice *dev)
 {
+       if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC) &&
+           (gd->flags & GD_FLG_RELOC)) {
+               struct timer_ops *ops = timer_get_ops(dev);
+               static int reloc_done;
+
+               if (!reloc_done) {
+                       if (ops->get_count)
+                               MANUAL_RELOC(ops->get_count);
+
+                       reloc_done++;
+               }
+       }
+
        if (CONFIG_IS_ENABLED(OF_REAL)) {
                struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
                struct clk timer_clk;