mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
                                                                clk_data);
 
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
-                               base, &mt2701_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt2701_clk_lock, clk_data);
 
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
                                base, &mt2701_clk_lock, clk_data);
        mtk_clk_register_gates(&pdev->dev, node, peri_clks,
                               ARRAY_SIZE(peri_clks), clk_data);
 
-       mtk_clk_register_composites(peri_muxs, ARRAY_SIZE(peri_muxs), base,
-                       &mt2701_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, peri_muxs,
+                                   ARRAY_SIZE(peri_muxs), base,
+                                   &mt2701_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
 
        mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs),
                        top_clk_data);
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-                       &mt2712_clk_lock, top_clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt2712_clk_lock, top_clk_data);
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
                        &mt2712_clk_lock, top_clk_data);
        mtk_clk_register_gates(&pdev->dev, node, top_clks,
 
        clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
 
-       mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
-                       &mt2712_clk_lock, clk_data);
+       r = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
+                                       ARRAY_SIZE(mcu_muxes), base,
+                                       &mt2712_clk_lock, clk_data);
+       if (r)
+               dev_err(&pdev->dev, "Could not register composites: %d\n", r);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
 
        mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
                               node, &mt6779_clk_lock, clk_data);
 
-       mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes),
-                                   base, &mt6779_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
+                                   ARRAY_SIZE(top_aud_muxes), base,
+                                   &mt6779_clk_lock, clk_data);
 
-       mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
-                                   base, &mt6779_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_aud_divs,
+                                   ARRAY_SIZE(top_aud_divs), base,
+                                   &mt6779_clk_lock, clk_data);
 
        return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
        if (ret)
                goto free_clk_data;
 
-       ret = mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
+       ret = mtk_clk_register_composites(&pdev->dev, peri_clks,
+                                         ARRAY_SIZE(peri_clks), base,
                                          &mt6795_peri_clk_lock, clk_data);
        if (ret)
                goto unregister_gates;
 
        if (ret)
                goto unregister_factors;
 
-       ret = mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), base,
+       ret = mtk_clk_register_composites(&pdev->dev, top_aud_divs,
+                                         ARRAY_SIZE(top_aud_divs), base,
                                          &mt6795_top_clk_lock, clk_data);
        if (ret)
                goto unregister_muxes;
 
        mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
                                 clk_data);
 
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+       mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
                                    &mt6797_clk_lock, clk_data);
 
        return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
                                 clk_data);
 
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
-                                   base, &mt7622_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt7622_clk_lock, clk_data);
 
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
                                  base, &mt7622_clk_lock, clk_data);
        mtk_clk_register_gates(&pdev->dev, node, peri_clks,
                               ARRAY_SIZE(peri_clks), clk_data);
 
-       mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
+       mtk_clk_register_composites(&pdev->dev, peri_muxes,
+                                   ARRAY_SIZE(peri_muxes), base,
                                    &mt7622_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
                                 clk_data);
 
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
-                                   base, &mt7629_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt7629_clk_lock, clk_data);
 
        clk_prepare_enable(clk_data->hws[CLK_TOP_AXI_SEL]->clk);
        clk_prepare_enable(clk_data->hws[CLK_TOP_MEM_SEL]->clk);
        mtk_clk_register_gates(&pdev->dev, node, peri_clks,
                               ARRAY_SIZE(peri_clks), clk_data);
 
-       mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
+       mtk_clk_register_composites(&pdev->dev, peri_muxes,
+                                   ARRAY_SIZE(peri_muxes), base,
                                    &mt7629_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 
 
        mtk_clk_register_factors(root_clk_alias, ARRAY_SIZE(root_clk_alias), clk_data);
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-                       &mt8135_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt8135_clk_lock, clk_data);
 
        clk_prepare_enable(clk_data->hws[CLK_TOP_CCI_SEL]->clk);
 
 
        mtk_clk_register_gates(NULL, node, peri_gates,
                               ARRAY_SIZE(peri_gates), clk_data);
-       mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
-                       &mt8135_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, peri_clks,
+                                   ARRAY_SIZE(peri_clks), base,
+                                   &mt8135_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
 
        mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
 
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-               &mt8167_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt8167_clk_lock, clk_data);
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
                                base, &mt8167_clk_lock, clk_data);
 
 
        clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
 
-       mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
-               &mt8167_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, ifr_muxes,
+                                   ARRAY_SIZE(ifr_muxes), base,
+                                   &mt8167_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
 
 
        mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-                       &mt8173_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt8173_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
 
        mtk_clk_register_gates(NULL, node, peri_gates,
                               ARRAY_SIZE(peri_gates), clk_data);
-       mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
-                       &mt8173_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, peri_clks,
+                                   ARRAY_SIZE(peri_clks), base,
+                                   &mt8173_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
 
        mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
                node, &mt8183_clk_lock, top_clk_data);
 
-       mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes),
-               base, &mt8183_clk_lock, top_clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
+                                   ARRAY_SIZE(top_aud_muxes), base,
+                                   &mt8183_clk_lock, top_clk_data);
 
-       mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
-               base, &mt8183_clk_lock, top_clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_aud_divs,
+                                   ARRAY_SIZE(top_aud_divs), base,
+                                   &mt8183_clk_lock, top_clk_data);
 
        mtk_clk_register_gates(&pdev->dev, node, top_clks,
                               ARRAY_SIZE(top_clks), top_clk_data);
 
        clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
 
-       mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
-                       &mt8183_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, mcu_muxes,
+                                   ARRAY_SIZE(mcu_muxes), base,
+                                   &mt8183_clk_lock, clk_data);
 
        return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
 }
 
                goto free_mcu_data;
        }
 
-       r = mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
+       r = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
+                                       ARRAY_SIZE(mcu_muxes), base,
                                        NULL, clk_data);
        if (r)
                goto free_mcu_data;
 
        if (r)
                goto unregister_factors;
 
-       r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+       r = mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                       ARRAY_SIZE(top_muxes), base,
                                        &mt8186_clk_lock, clk_data);
        if (r)
                goto unregister_muxes;
 
-       r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+       r = mtk_clk_register_composites(&pdev->dev, top_adj_divs,
+                                       ARRAY_SIZE(top_adj_divs), base,
                                        &mt8186_clk_lock, clk_data);
        if (r)
                goto unregister_composite_muxes;
 
        if (r)
                goto unregister_factors;
 
-       r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+       r = mtk_clk_register_composites(&pdev->dev, top_muxes,
+                                       ARRAY_SIZE(top_muxes), base,
                                        &mt8192_clk_lock, top_clk_data);
        if (r)
                goto unregister_muxes;
 
-       r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+       r = mtk_clk_register_composites(&pdev->dev, top_adj_divs,
+                                       ARRAY_SIZE(top_adj_divs), base,
                                        &mt8192_clk_lock, top_clk_data);
        if (r)
                goto unregister_top_composites;
 
        if (r)
                goto unregister_muxes;
 
-       r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+       r = mtk_clk_register_composites(&pdev->dev, top_adj_divs,
+                                       ARRAY_SIZE(top_adj_divs), base,
                                        &mt8195_clk_lock, top_clk_data);
        if (r)
                goto unregister_muxes;
 
        if (ret)
                goto unregister_factors;
 
-       ret = mtk_clk_register_composites(top_misc_mux_gates,
+       ret = mtk_clk_register_composites(&pdev->dev, top_misc_mux_gates,
                                          ARRAY_SIZE(top_misc_mux_gates), base,
                                          &mt8365_clk_lock, clk_data);
        if (ret)
        if (!clk_data)
                return -ENOMEM;
 
-       ret = mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes),
-                                         base, &mt8365_clk_lock, clk_data);
+       ret = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
+                                         ARRAY_SIZE(mcu_muxes), base,
+                                         &mt8365_clk_lock, clk_data);
        if (ret)
                goto free_clk_data;
 
 
        mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
 
        mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-               &mt8516_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, top_muxes,
+                                   ARRAY_SIZE(top_muxes), base,
+                                   &mt8516_clk_lock, clk_data);
        mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
                                base, &mt8516_clk_lock, clk_data);
 
 
        clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
 
-       mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
-               &mt8516_clk_lock, clk_data);
+       mtk_clk_register_composites(NULL, ifr_muxes,
+                                   ARRAY_SIZE(ifr_muxes), base,
+                                   &mt8516_clk_lock, clk_data);
 
        r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
        if (r)
 
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_factors);
 
-static struct clk_hw *mtk_clk_register_composite(const struct mtk_composite *mc,
-               void __iomem *base, spinlock_t *lock)
+static struct clk_hw *mtk_clk_register_composite(struct device *dev,
+               const struct mtk_composite *mc, void __iomem *base, spinlock_t *lock)
 {
        struct clk_hw *hw;
        struct clk_mux *mux = NULL;
                div_ops = &clk_divider_ops;
        }
 
-       hw = clk_hw_register_composite(NULL, mc->name, parent_names, num_parents,
+       hw = clk_hw_register_composite(dev, mc->name, parent_names, num_parents,
                mux_hw, mux_ops,
                div_hw, div_ops,
                gate_hw, gate_ops,
        kfree(mux);
 }
 
-int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
+int mtk_clk_register_composites(struct device *dev,
+                               const struct mtk_composite *mcs, int num,
                                void __iomem *base, spinlock_t *lock,
                                struct clk_hw_onecell_data *clk_data)
 {
                        continue;
                }
 
-               hw = mtk_clk_register_composite(mc, base, lock);
+               hw = mtk_clk_register_composite(dev, mc, base, lock);
 
                if (IS_ERR(hw)) {
                        pr_err("Failed to register clk %s: %pe\n", mc->name,
 
                .flags = 0,                                             \
        }
 
-int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
+int mtk_clk_register_composites(struct device *dev,
+                               const struct mtk_composite *mcs, int num,
                                void __iomem *base, spinlock_t *lock,
                                struct clk_hw_onecell_data *clk_data);
 void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,