[PATCH] drm/omap: force runtime PM suspend on system suspend

Tomi Valkeinen tomi.valkeinen at ti.com
Tue Jun 9 10:32:20 UTC 2020


Use suspend_late and resume_early callbacks in DSS submodules to force
runtime PM suspend and resume.

We use suspend_late callback so that omapdrm's system suspend callback
is called first, as that will disable all the display outputs after
which it's safe to force DSS into suspend.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
---

Not fully tested, as I haven't been able to get AM4's system suspend to
work. Works with pm_test.

 drivers/gpu/drm/omapdrm/dss/dispc.c | 16 ++++++++++++++++
 drivers/gpu/drm/omapdrm/dss/dsi.c   | 16 ++++++++++++++++
 drivers/gpu/drm/omapdrm/dss/dss.c   | 16 ++++++++++++++++
 drivers/gpu/drm/omapdrm/dss/venc.c  | 16 ++++++++++++++++
 4 files changed, 64 insertions(+)

diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
index dbb90f2d2ccd..1c9057d7db7b 100644
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
@@ -4933,9 +4933,25 @@ static int dispc_runtime_resume(struct device *dev)
 	return 0;
 }
 
+static int dispc_suspend_late(struct device *dev)
+{
+	pm_runtime_force_suspend(dev);
+
+	return 0;
+}
+
+static int dispc_resume_early(struct device *dev)
+{
+	pm_runtime_force_resume(dev);
+
+	return 0;
+}
+
 static const struct dev_pm_ops dispc_pm_ops = {
 	.runtime_suspend = dispc_runtime_suspend,
 	.runtime_resume = dispc_runtime_resume,
+	.suspend_late = dispc_suspend_late,
+	.resume_early = dispc_resume_early,
 };
 
 struct platform_driver omap_dispchw_driver = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 79ddfbfd1b58..bae954dc8a5b 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5464,9 +5464,25 @@ static int dsi_runtime_resume(struct device *dev)
 	return 0;
 }
 
+static int dsi_suspend_late(struct device *dev)
+{
+	pm_runtime_force_suspend(dev);
+
+	return 0;
+}
+
+static int dsi_resume_early(struct device *dev)
+{
+	pm_runtime_force_resume(dev);
+
+	return 0;
+}
+
 static const struct dev_pm_ops dsi_pm_ops = {
 	.runtime_suspend = dsi_runtime_suspend,
 	.runtime_resume = dsi_runtime_resume,
+	.suspend_late = dsi_suspend_late,
+	.resume_early = dsi_resume_early,
 };
 
 struct platform_driver omap_dsihw_driver = {
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 4d5739fa4a5d..65be4918db0c 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1611,9 +1611,25 @@ static int dss_runtime_resume(struct device *dev)
 	return 0;
 }
 
+static int dss_suspend_late(struct device *dev)
+{
+	pm_runtime_force_suspend(dev);
+
+	return 0;
+}
+
+static int dss_resume_early(struct device *dev)
+{
+	pm_runtime_force_resume(dev);
+
+	return 0;
+}
+
 static const struct dev_pm_ops dss_pm_ops = {
 	.runtime_suspend = dss_runtime_suspend,
 	.runtime_resume = dss_runtime_resume,
+	.suspend_late = dss_suspend_late,
+	.resume_early = dss_resume_early,
 };
 
 struct platform_driver omap_dsshw_driver = {
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index 766553bb2f87..3abc7e329121 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -942,9 +942,25 @@ static int venc_runtime_resume(struct device *dev)
 	return 0;
 }
 
+static int venc_suspend_late(struct device *dev)
+{
+	pm_runtime_force_suspend(dev);
+
+	return 0;
+}
+
+static int venc_resume_early(struct device *dev)
+{
+	pm_runtime_force_resume(dev);
+
+	return 0;
+}
+
 static const struct dev_pm_ops venc_pm_ops = {
 	.runtime_suspend = venc_runtime_suspend,
 	.runtime_resume = venc_runtime_resume,
+	.suspend_late = venc_suspend_late,
+	.resume_early = venc_resume_early,
 };
 
 static const struct of_device_id venc_of_match[] = {
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki



More information about the dri-devel mailing list