diff --git a/drivers/clk/mediatek/clk-mt8183-mfgcfg.c b/drivers/clk/mediatek/clk-mt8183-mfgcfg.c index 3a33014eee7f7b90e173e74d3482102148c258f3..377dae2e51f8c6a92d50aa064ff878a7ca0b3625 100644 --- a/drivers/clk/mediatek/clk-mt8183-mfgcfg.c +++ b/drivers/clk/mediatek/clk-mt8183-mfgcfg.c @@ -30,14 +30,28 @@ static int clk_mt8183_mfg_probe(struct platform_device *pdev) { struct clk_onecell_data *clk_data; struct device_node *node = pdev->dev.of_node; + int ret; pm_runtime_enable(&pdev->dev); + /* + * Do a pm_runtime_get_sync() to workaround a possible + * deadlock between clk_register() and the genpd framework. + */ + ret = pm_runtime_get_sync(&pdev->dev); + if (ret < 0) { + pm_runtime_put_noidle(&pdev->dev); + return ret; + } + + clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK); mtk_clk_register_gates_with_dev(node, mfg_clks, ARRAY_SIZE(mfg_clks), clk_data, &pdev->dev); + pm_runtime_put(&pdev->dev); + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); }