Remove the static mtk_clk_providers array. Static variables cannot be
used before relocation in U-Boot, so it broke systems that used clocks
before relocation, e.g. for UART early console.

The mtk_clk_providers array was likely premature optimization anyway
since it only saves a few cycles of searching a small number of clock
devices on each parent lookup.

Reported-by: Sam Shih <[email protected]>
Fixes: 8ef0ad4c7a6d ("clk: mediatek: use registered provider for parent lookup")
Signed-off-by: David Lechner <[email protected]>
---
Changes in v2:
- Change patch subject.
- Remove mtk_clk_providers array instead of clearing it.
- Link to v1: 
https://patch.msgid.link/20260813-mtk-clk-fix-reprobe-regression-v1-1-ed259968c...@baylibre.com
---
 drivers/clk/mediatek/clk-mtk.c | 70 +++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 45 deletions(-)

diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index 13c248c93a6..70cc7624a14 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -35,8 +35,6 @@
 #define SCP_AXICK_DCM_DIS_EN           BIT(0)
 #define SCP_AXICK_26M_SEL_EN           BIT(4)
 
-static struct udevice *mtk_clk_providers[MTK_CLK_TREE_NUM_TYPES];
-
 static bool mtk_clk_tree_type_is_provider(enum mtk_clk_tree_type type)
 {
        return type != MTK_CLK_TREE_NONE && type < MTK_CLK_TREE_NUM_TYPES;
@@ -58,44 +56,40 @@ static enum mtk_clk_tree_type 
mtk_clk_tree_type_from_parent_flags(u16 flags)
 
 static struct udevice *mtk_clk_tree_get_provider(enum mtk_clk_tree_type type)
 {
+       struct udevice *dev;
+       struct uclass *uc;
+       int ret;
+
        if (!mtk_clk_tree_type_is_provider(type))
                return NULL;
 
-       if (!mtk_clk_providers[type]) {
-               struct udevice *dev;
-               struct uclass *uc;
-               int ret;
-
-               /* Lazily probe and register the requested provider. */
-               ret = uclass_get(UCLASS_CLK, &uc);
-               if (ret)
-                       return ERR_PTR(ret);
+       ret = uclass_get(UCLASS_CLK, &uc);
+       if (ret)
+               return ERR_PTR(ret);
 
-               uclass_foreach_dev(dev, uc) {
-                       const struct mtk_clk_tree *tree;
-                       const void *ops;
+       uclass_foreach_dev(dev, uc) {
+               const struct mtk_clk_tree *tree;
+               const void *ops;
 
-                       ops = dev_get_driver_ops(dev);
-                       if (ops != &mtk_clk_apmixedsys_ops &&
-                           ops != &mtk_clk_fixed_pll_ops &&
-                           ops != &mtk_clk_topckgen_ops &&
-                           ops != &mtk_clk_infrasys_ops)
-                               continue;
+               ops = dev_get_driver_ops(dev);
+               if (ops != &mtk_clk_apmixedsys_ops &&
+                   ops != &mtk_clk_fixed_pll_ops &&
+                   ops != &mtk_clk_topckgen_ops &&
+                   ops != &mtk_clk_infrasys_ops)
+                       continue;
 
-                       tree = (const void *)dev_get_driver_data(dev);
-                       if (tree->type != type)
-                               continue;
+               tree = (const void *)dev_get_driver_data(dev);
+               if (tree->type != type)
+                       continue;
 
-                       /* Probe will add it to mtk_clk_providers[type]. */
-                       ret = device_probe(dev);
-                       if (ret)
-                               return ERR_PTR(ret);
+               ret = device_probe(dev);
+               if (ret)
+                       return ERR_PTR(ret);
 
-                       break;
-               }
+               return dev;
        }
 
-       return mtk_clk_providers[type] ?: ERR_PTR(-ENOENT);
+       return ERR_PTR(-ENOENT);
 }
 
 static struct udevice *mtk_clk_parent_get_provider(u16 flags)
@@ -103,20 +97,6 @@ static struct udevice *mtk_clk_parent_get_provider(u16 
flags)
        return 
mtk_clk_tree_get_provider(mtk_clk_tree_type_from_parent_flags(flags));
 }
 
-static int mtk_clk_tree_register_provider(struct udevice *dev,
-                                         const struct mtk_clk_tree *tree)
-{
-       if (!mtk_clk_tree_type_is_provider(tree->type))
-               return 0;
-
-       if (mtk_clk_providers[tree->type])
-               return -EEXIST;
-
-       mtk_clk_providers[tree->type] = dev;
-
-       return 0;
-}
-
 /* shared functions */
 
 static const int mtk_common_clk_of_xlate(struct clk *clk,
@@ -1128,5 +1108,5 @@ int mtk_clk_probe(struct udevice *dev)
 
        priv->tree = tree;
 
-       return mtk_clk_tree_register_provider(dev, tree);
+       return 0;
 }

---
base-commit: 0b581a9612e46310ee52bf8359165950d38b2a2b
change-id: 20260813-mtk-clk-fix-reprobe-regression-6ac0c072600b

Best regards,
--  
David Lechner <[email protected]>

Reply via email to