| From 0f304d9c58bc1ebc627d0d9de3627281445e278d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 7 Jul 2025 10:24:38 +0800 |
| Subject: clk: imx95-blk-ctl: Fix synchronous abort |
| |
| From: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com> |
| |
| [ Upstream commit b08217a257215ed9130fce93d35feba66b49bf0a ] |
| |
| When enabling runtime PM for clock suppliers that also belong to a power |
| domain, the following crash is thrown: |
| error: synchronous external abort: 0000000096000010 [#1] PREEMPT SMP |
| Workqueue: events_unbound deferred_probe_work_func |
| pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) |
| pc : clk_mux_get_parent+0x60/0x90 |
| lr : clk_core_reparent_orphans_nolock+0x58/0xd8 |
| Call trace: |
| clk_mux_get_parent+0x60/0x90 |
| clk_core_reparent_orphans_nolock+0x58/0xd8 |
| of_clk_add_hw_provider.part.0+0x90/0x100 |
| of_clk_add_hw_provider+0x1c/0x38 |
| imx95_bc_probe+0x2e0/0x3f0 |
| platform_probe+0x70/0xd8 |
| |
| Enabling runtime PM without explicitly resuming the device caused |
| the power domain cut off after clk_register() is called. As a result, |
| a crash happens when the clock hardware provider is added and attempts |
| to access the BLK_CTL register. |
| |
| Fix this by using devm_pm_runtime_enable() instead of pm_runtime_enable() |
| and getting rid of the pm_runtime_disable() in the cleanup path. |
| |
| Fixes: 5224b189462f ("clk: imx: add i.MX95 BLK CTL clk driver") |
| Reviewed-by: Frank Li <Frank.Li@nxp.com> |
| Reviewed-by: Abel Vesa <abel.vesa@linaro.org> |
| Signed-off-by: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com> |
| Signed-off-by: Peng Fan <peng.fan@nxp.com> |
| Link: https://lore.kernel.org/r/20250707-imx95-blk-ctl-7-1-v3-2-c1b676ec13be@nxp.com |
| Signed-off-by: Abel Vesa <abel.vesa@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/clk/imx/clk-imx95-blk-ctl.c | 13 +++++++------ |
| 1 file changed, 7 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/clk/imx/clk-imx95-blk-ctl.c b/drivers/clk/imx/clk-imx95-blk-ctl.c |
| index 564e9f3f7508..5030e6e60b66 100644 |
| --- a/drivers/clk/imx/clk-imx95-blk-ctl.c |
| +++ b/drivers/clk/imx/clk-imx95-blk-ctl.c |
| @@ -323,8 +323,10 @@ static int imx95_bc_probe(struct platform_device *pdev) |
| if (!clk_hw_data) |
| return -ENOMEM; |
| |
| - if (bc_data->rpm_enabled) |
| - pm_runtime_enable(&pdev->dev); |
| + if (bc_data->rpm_enabled) { |
| + devm_pm_runtime_enable(&pdev->dev); |
| + pm_runtime_resume_and_get(&pdev->dev); |
| + } |
| |
| clk_hw_data->num = bc_data->num_clks; |
| hws = clk_hw_data->hws; |
| @@ -364,8 +366,10 @@ static int imx95_bc_probe(struct platform_device *pdev) |
| goto cleanup; |
| } |
| |
| - if (pm_runtime_enabled(bc->dev)) |
| + if (pm_runtime_enabled(bc->dev)) { |
| + pm_runtime_put_sync(&pdev->dev); |
| clk_disable_unprepare(bc->clk_apb); |
| + } |
| |
| return 0; |
| |
| @@ -376,9 +380,6 @@ static int imx95_bc_probe(struct platform_device *pdev) |
| clk_hw_unregister(hws[i]); |
| } |
| |
| - if (bc_data->rpm_enabled) |
| - pm_runtime_disable(&pdev->dev); |
| - |
| return ret; |
| } |
| |
| -- |
| 2.39.5 |
| |