Skip to content

Commit 14be8b7

Browse files
Laurentiu Palcuabelvesa
authored andcommitted
clk: imx95-blk-ctl: Save/restore registers when RPM routines are called
When runtime PM is used for clock providers that are part of a power domain, the power domain supply is cut off during runtime suspend. This causes all BLK CTL registers belonging to that power domain to reset. To prevent this, save the state of the registers before entering suspend and restore them on resume. Additionally, disable the APB clock during suspend to minimize power consumption. Signed-off-by: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com> Reviewed-by: Frank Li <Frank.Li@nxp.com> Link: https://lore.kernel.org/r/20250804131450.3918846-3-laurentiu.palcu@oss.nxp.com Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
1 parent aa1735d commit 14be8b7

1 file changed

Lines changed: 21 additions & 12 deletions

File tree

drivers/clk/imx/clk-imx95-blk-ctl.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -453,45 +453,54 @@ static int imx95_bc_runtime_suspend(struct device *dev)
453453
{
454454
struct imx95_blk_ctl *bc = dev_get_drvdata(dev);
455455

456+
bc->clk_reg_restore = readl(bc->base + bc->pdata->clk_reg_offset);
456457
clk_disable_unprepare(bc->clk_apb);
458+
457459
return 0;
458460
}
459461

460462
static int imx95_bc_runtime_resume(struct device *dev)
461463
{
462464
struct imx95_blk_ctl *bc = dev_get_drvdata(dev);
465+
int ret;
463466

464-
return clk_prepare_enable(bc->clk_apb);
467+
ret = clk_prepare_enable(bc->clk_apb);
468+
if (ret)
469+
return ret;
470+
471+
writel(bc->clk_reg_restore, bc->base + bc->pdata->clk_reg_offset);
472+
473+
return 0;
465474
}
466475
#endif
467476

468477
#ifdef CONFIG_PM_SLEEP
469478
static int imx95_bc_suspend(struct device *dev)
470479
{
471480
struct imx95_blk_ctl *bc = dev_get_drvdata(dev);
472-
int ret;
473481

474-
if (bc->pdata->rpm_enabled) {
475-
ret = pm_runtime_get_sync(bc->dev);
476-
if (ret < 0) {
477-
pm_runtime_put_noidle(bc->dev);
478-
return ret;
479-
}
480-
}
482+
if (pm_runtime_suspended(dev))
483+
return 0;
481484

482485
bc->clk_reg_restore = readl(bc->base + bc->pdata->clk_reg_offset);
486+
clk_disable_unprepare(bc->clk_apb);
483487

484488
return 0;
485489
}
486490

487491
static int imx95_bc_resume(struct device *dev)
488492
{
489493
struct imx95_blk_ctl *bc = dev_get_drvdata(dev);
494+
int ret;
490495

491-
writel(bc->clk_reg_restore, bc->base + bc->pdata->clk_reg_offset);
496+
if (pm_runtime_suspended(dev))
497+
return 0;
492498

493-
if (bc->pdata->rpm_enabled)
494-
pm_runtime_put(bc->dev);
499+
ret = clk_prepare_enable(bc->clk_apb);
500+
if (ret)
501+
return ret;
502+
503+
writel(bc->clk_reg_restore, bc->base + bc->pdata->clk_reg_offset);
495504

496505
return 0;
497506
}

0 commit comments

Comments
 (0)