I have regression tested this patch on the following devices:

Powkiddy RGB10X - Rockchip RK3326 (Mali G31)

Powkiddy RGB20 Pro - Rockchip RK3566 (Mali G52)

Odroid Go Ultra - Amlogic S922X (Mali G52)

Gameforce ACE - Rockchip RK3588S (Mali G610)

No regressions found during cold boot or with wake after sleep.

Tested-by: John Williams <porschemad...@gmail.com>

On 3/4/25 16:52, Philippe Simons wrote:
According to Mali manuals, the powerup sequence should be
enable pd, asserting the reset then enabling the clock and
the reverse for powerdown.

Signed-off-by: Philippe Simons <simons.phili...@gmail.com>
---
  drivers/gpu/drm/panfrost/panfrost_device.c | 38 +++++++++++-----------
  1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c 
b/drivers/gpu/drm/panfrost/panfrost_device.c
index 93d48e97ce10..5d35076b2e6d 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -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 @@ int panfrost_device_init(struct panfrost_device *pfdev)
        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) \

Reply via email to