Clear the MediaTek clock provider registry after relocation. This is necessary for a couple of reasons. If any clock probed before the relocation, the registry will contain a pointer to pre-relocation memory. Also, all drivers reprobe after relocation, so even if we had a valid pointer, it would be to a clock provider that had not been reprobed yet. Clearing the registry ensures that all clock providers are re-registered when they are reprobed after relocation.
Reported-by: Sam Shih <[email protected]> Fixes: 8ef0ad4c7a6d ("clk: mediatek: use registered provider for parent lookup") Signed-off-by: David Lechner <[email protected]> --- drivers/clk/mediatek/clk-mtk.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c index 13c248c93a6..849e8a196e5 100644 --- a/drivers/clk/mediatek/clk-mtk.c +++ b/drivers/clk/mediatek/clk-mtk.c @@ -1130,3 +1130,21 @@ int mtk_clk_probe(struct udevice *dev) return mtk_clk_tree_register_provider(dev, tree); } + +static int mtk_clock_reset_registry(void) +{ + /* + * When U-Boot is relocated, the static clock provider registry is no + * longer valid since it contains pointers to the old U-Boot memory. + * Furthermore, all devices are re-probed after relocation. Therefore, + * we need to reset the registry before any devices can probe after + * relocation. + */ + + for (int i = 0; i < ARRAY_SIZE(mtk_clk_providers); i++) + mtk_clk_providers[i] = NULL; + + return 0; +} + +EVENT_SPY_SIMPLE(EVT_DM_POST_INIT_R, mtk_clock_reset_registry); --- base-commit: 0b581a9612e46310ee52bf8359165950d38b2a2b change-id: 20260813-mtk-clk-fix-reprobe-regression-6ac0c072600b Best regards, -- David Lechner <[email protected]>
