panfrost_job_enable_interrupts(pfdev);
 }
 
-static int panfrost_device_resume(struct device *dev)
+static int panfrost_device_runtime_resume(struct device *dev)
 {
        struct panfrost_device *pfdev = dev_get_drvdata(dev);
 
        return 0;
 }
 
-static int panfrost_device_suspend(struct device *dev)
+static int panfrost_device_runtime_suspend(struct device *dev)
 {
        struct panfrost_device *pfdev = dev_get_drvdata(dev);
 
        return 0;
 }
 
-EXPORT_GPL_RUNTIME_DEV_PM_OPS(panfrost_pm_ops, panfrost_device_suspend,
-                             panfrost_device_resume, NULL);
+static int panfrost_device_resume(struct device *dev)
+{
+       struct panfrost_device *pfdev = dev_get_drvdata(dev);
+       int ret;
+
+       if (pfdev->comp->pm_features & BIT(GPU_PM_CLK_DIS)) {
+               ret = clk_enable(pfdev->clock);
+               if (ret)
+                       return ret;
+
+               if (pfdev->bus_clock) {
+                       ret = clk_enable(pfdev->bus_clock);
+                       if (ret)
+                               goto err_bus_clk;
+               }
+       }
+
+       ret = pm_runtime_force_resume(dev);
+       if (ret)
+               goto err_resume;
+
+       return 0;
+
+err_resume:
+       if (pfdev->comp->pm_features & BIT(GPU_PM_CLK_DIS) && pfdev->bus_clock)
+               clk_disable(pfdev->bus_clock);
+err_bus_clk:
+       if (pfdev->comp->pm_features & BIT(GPU_PM_CLK_DIS))
+               clk_disable(pfdev->clock);
+       return ret;
+}
+
+static int panfrost_device_suspend(struct device *dev)
+{
+       struct panfrost_device *pfdev = dev_get_drvdata(dev);
+       int ret;
+
+       ret = pm_runtime_force_suspend(dev);
+       if (ret)
+               return ret;
+
+       if (pfdev->comp->pm_features & BIT(GPU_PM_CLK_DIS)) {
+               if (pfdev->bus_clock)
+                       clk_disable(pfdev->bus_clock);
+
+               clk_disable(pfdev->clock);
+       }
+
+       return 0;
+}
+
+EXPORT_GPL_DEV_PM_OPS(panfrost_pm_ops) = {
+       RUNTIME_PM_OPS(panfrost_device_runtime_suspend, panfrost_device_runtime_resume, NULL)
+       SYSTEM_SLEEP_PM_OPS(panfrost_device_suspend, panfrost_device_resume)
+};
 
 #define NUM_JOB_SLOTS 3
 #define MAX_PM_DOMAINS 5
 
+/**
+ * enum panfrost_gpu_pm - Supported kernel power management features
+ * @GPU_PM_CLK_DIS:  Allow disabling clocks during system suspend
+ */
+enum panfrost_gpu_pm {
+       GPU_PM_CLK_DIS,
+};
+
 struct panfrost_features {
        u16 id;
        u16 revision;
 
        /* Vendor implementation quirks callback */
        void (*vendor_quirk)(struct panfrost_device *pfdev);
+
+       /* Allowed PM features */
+       u8 pm_features;
 };
 
 struct panfrost_device {