]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/panfrost: reorder pd/clk/rst sequence
authorPhilippe Simons <simons.philippe@gmail.com>
Thu, 3 Apr 2025 05:52:10 +0000 (07:52 +0200)
committerSteven Price <steven.price@arm.com>
Mon, 28 Apr 2025 09:24:04 +0000 (10:24 +0100)
According to Mali manuals, the powerup sequence should be
enable pd, asserting the reset then enabling the clock and
the reverse for powerdown.

Reviewed-by: Steven Price <steven.price@arm.com>
Tested-by: John Williams <porschemad911@gmail.com>
Signed-off-by: Philippe Simons <simons.philippe@gmail.com>
Signed-off-by: Steven Price <steven.price@arm.com>
Link: https://lore.kernel.org/r/20250403055210.54486-4-simons.philippe@gmail.com
drivers/gpu/drm/panfrost/panfrost_device.c

index 93d48e97ce102dba8cf6eac0445d87a3c4085b98..5d35076b2e6d4074ce3de19e4818496f3948e239 100644 (file)
@@ -209,10 +209,20 @@ int panfrost_device_init(struct panfrost_device *pfdev)
 
        spin_lock_init(&pfdev->cycle_counter.lock);
 
+       err = panfrost_pm_domain_init(pfdev);
+       if (err)
+               return err;
+
+       err = panfrost_reset_init(pfdev);
+       if (err) {
+               dev_err(pfdev->dev, "reset init failed %d\n", err);
+               goto out_pm_domain;
+       }
+
        err = panfrost_clk_init(pfdev);
        if (err) {
                dev_err(pfdev->dev, "clk init failed %d\n", err);
-               return err;
+               goto out_reset;
        }
 
        err = panfrost_devfreq_init(pfdev);
@@ -229,25 +239,15 @@ int panfrost_device_init(struct panfrost_device *pfdev)
                        goto out_devfreq;
        }
 
-       err = panfrost_reset_init(pfdev);
-       if (err) {
-               dev_err(pfdev->dev, "reset init failed %d\n", err);
-               goto out_regulator;
-       }
-
-       err = panfrost_pm_domain_init(pfdev);
-       if (err)
-               goto out_reset;
-
        pfdev->iomem = devm_platform_ioremap_resource(pfdev->pdev, 0);
        if (IS_ERR(pfdev->iomem)) {
                err = PTR_ERR(pfdev->iomem);
-               goto out_pm_domain;
+               goto out_regulator;
        }
 
        err = panfrost_gpu_init(pfdev);
        if (err)
-               goto out_pm_domain;
+               goto out_regulator;
 
        err = panfrost_mmu_init(pfdev);
        if (err)
@@ -268,16 +268,16 @@ out_mmu:
        panfrost_mmu_fini(pfdev);
 out_gpu:
        panfrost_gpu_fini(pfdev);
-out_pm_domain:
-       panfrost_pm_domain_fini(pfdev);
-out_reset:
-       panfrost_reset_fini(pfdev);
 out_regulator:
        panfrost_regulator_fini(pfdev);
 out_devfreq:
        panfrost_devfreq_fini(pfdev);
 out_clk:
        panfrost_clk_fini(pfdev);
+out_reset:
+       panfrost_reset_fini(pfdev);
+out_pm_domain:
+       panfrost_pm_domain_fini(pfdev);
        return err;
 }
 
@@ -287,11 +287,11 @@ void panfrost_device_fini(struct panfrost_device *pfdev)
        panfrost_job_fini(pfdev);
        panfrost_mmu_fini(pfdev);
        panfrost_gpu_fini(pfdev);
-       panfrost_pm_domain_fini(pfdev);
-       panfrost_reset_fini(pfdev);
        panfrost_devfreq_fini(pfdev);
        panfrost_regulator_fini(pfdev);
        panfrost_clk_fini(pfdev);
+       panfrost_reset_fini(pfdev);
+       panfrost_pm_domain_fini(pfdev);
 }
 
 #define PANFROST_EXCEPTION(id) \