Skip to content

Commit acf800c

Browse files
committed
Merge tag 'clk-imx-6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux into clk-imx
Pull i.MX clk driver updates from Abel Vesa: - Rework the i.MX95 BLK CTL driver to add the platform data to the state container - Retain the state of the i.MS95 BLK CTL registers through both runtime and system suspend * tag 'clk-imx-6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux: clk: imx95-blk-ctl: Save/restore registers when RPM routines are called clk: imx95-blk-ctl: Save platform data in imx95_blk_ctl structure
2 parents 8f5ae30 + 14be8b7 commit acf800c

1 file changed

Lines changed: 28 additions & 29 deletions

File tree

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

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct imx95_blk_ctl {
3636
void __iomem *base;
3737
/* clock gate register */
3838
u32 clk_reg_restore;
39+
const struct imx95_blk_ctl_dev_data *pdata;
3940
};
4041

4142
struct imx95_blk_ctl_clk_dev_data {
@@ -349,7 +350,6 @@ static const struct imx95_blk_ctl_dev_data imx94_dispmix_csr_dev_data = {
349350
static int imx95_bc_probe(struct platform_device *pdev)
350351
{
351352
struct device *dev = &pdev->dev;
352-
const struct imx95_blk_ctl_dev_data *bc_data;
353353
struct imx95_blk_ctl *bc;
354354
struct clk_hw_onecell_data *clk_hw_data;
355355
struct clk_hw **hws;
@@ -379,25 +379,25 @@ static int imx95_bc_probe(struct platform_device *pdev)
379379
return ret;
380380
}
381381

382-
bc_data = of_device_get_match_data(dev);
383-
if (!bc_data)
382+
bc->pdata = of_device_get_match_data(dev);
383+
if (!bc->pdata)
384384
return devm_of_platform_populate(dev);
385385

386-
clk_hw_data = devm_kzalloc(dev, struct_size(clk_hw_data, hws, bc_data->num_clks),
386+
clk_hw_data = devm_kzalloc(dev, struct_size(clk_hw_data, hws, bc->pdata->num_clks),
387387
GFP_KERNEL);
388388
if (!clk_hw_data)
389389
return -ENOMEM;
390390

391-
if (bc_data->rpm_enabled) {
391+
if (bc->pdata->rpm_enabled) {
392392
devm_pm_runtime_enable(&pdev->dev);
393393
pm_runtime_resume_and_get(&pdev->dev);
394394
}
395395

396-
clk_hw_data->num = bc_data->num_clks;
396+
clk_hw_data->num = bc->pdata->num_clks;
397397
hws = clk_hw_data->hws;
398398

399-
for (i = 0; i < bc_data->num_clks; i++) {
400-
const struct imx95_blk_ctl_clk_dev_data *data = &bc_data->clk_dev_data[i];
399+
for (i = 0; i < bc->pdata->num_clks; i++) {
400+
const struct imx95_blk_ctl_clk_dev_data *data = &bc->pdata->clk_dev_data[i];
401401
void __iomem *reg = base + data->reg;
402402

403403
if (data->type == CLK_MUX) {
@@ -439,7 +439,7 @@ static int imx95_bc_probe(struct platform_device *pdev)
439439
return 0;
440440

441441
cleanup:
442-
for (i = 0; i < bc_data->num_clks; i++) {
442+
for (i = 0; i < bc->pdata->num_clks; i++) {
443443
if (IS_ERR_OR_NULL(hws[i]))
444444
continue;
445445
clk_hw_unregister(hws[i]);
@@ -453,55 +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-
const struct imx95_blk_ctl_dev_data *bc_data;
473-
int ret;
474481

475-
bc_data = of_device_get_match_data(dev);
476-
if (!bc_data)
482+
if (pm_runtime_suspended(dev))
477483
return 0;
478484

479-
if (bc_data->rpm_enabled) {
480-
ret = pm_runtime_get_sync(bc->dev);
481-
if (ret < 0) {
482-
pm_runtime_put_noidle(bc->dev);
483-
return ret;
484-
}
485-
}
486-
487-
bc->clk_reg_restore = readl(bc->base + bc_data->clk_reg_offset);
485+
bc->clk_reg_restore = readl(bc->base + bc->pdata->clk_reg_offset);
486+
clk_disable_unprepare(bc->clk_apb);
488487

489488
return 0;
490489
}
491490

492491
static int imx95_bc_resume(struct device *dev)
493492
{
494493
struct imx95_blk_ctl *bc = dev_get_drvdata(dev);
495-
const struct imx95_blk_ctl_dev_data *bc_data;
494+
int ret;
496495

497-
bc_data = of_device_get_match_data(dev);
498-
if (!bc_data)
496+
if (pm_runtime_suspended(dev))
499497
return 0;
500498

501-
writel(bc->clk_reg_restore, bc->base + bc_data->clk_reg_offset);
499+
ret = clk_prepare_enable(bc->clk_apb);
500+
if (ret)
501+
return ret;
502502

503-
if (bc_data->rpm_enabled)
504-
pm_runtime_put(bc->dev);
503+
writel(bc->clk_reg_restore, bc->base + bc->pdata->clk_reg_offset);
505504

506505
return 0;
507506
}

0 commit comments

Comments
 (0)