Linux Power Management development
 help / color / mirror / Atom feed
* [PATCH] PM / Domains: Propagate start and restore errors during runtime resume
@ 2016-03-01 23:20 Laurent Pinchart
  2016-03-03 20:24 ` Kevin Hilman
  2016-03-04 10:22 ` Ulf Hansson
  0 siblings, 2 replies; 9+ messages in thread
From: Laurent Pinchart @ 2016-03-01 23:20 UTC (permalink / raw)
  To: linux-pm; +Cc: linux-kernel, Rafael J. Wysocki, Kevin Hilman, Ulf Hansson

During runtime resume the return values of the start and restore steps
are ignored. As a result drivers are not notified of runtime resume
failures and can't propagate them up. Fix it by returning an error if
either the start or restore step fails, and clean up properly in the
error path.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
 drivers/base/power/domain.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

This fixes an issue I've noticed with my driver's .runtime_resume() handler
returning an error that was never propagated out of pm_runtime_get_sync().

A second issue then appeared. The device .runtime_error field is set to the
error code returned by my .runtime_resume() handler, but it never reset. Any
subsequent try to resume the device fails with -EINVAL. I'm not sure what the
right way to solve that is, advices are welcome.

diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 301b785f9f56..8cfcb8d6179b 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -485,8 +485,13 @@ static int pm_genpd_runtime_resume(struct device *dev)
 	if (timed && runtime_pm)
 		time_start = ktime_get();
 
-	genpd_start_dev(genpd, dev);
-	genpd_restore_dev(genpd, dev);
+	ret = genpd_start_dev(genpd, dev);
+	if (ret)
+		goto err_poweroff;
+
+	ret = genpd_restore_dev(genpd, dev);
+	if (ret)
+		goto err_stop;
 
 	/* Update resume latency value if the measured time exceeds it. */
 	if (timed && runtime_pm) {
@@ -501,6 +506,17 @@ static int pm_genpd_runtime_resume(struct device *dev)
 	}
 
 	return 0;
+
+err_stop:
+	genpd_stop_dev(genpd, dev);
+err_poweroff:
+	if (!dev->power.irq_safe) {
+		mutex_lock(&genpd->lock);
+		genpd_poweroff(genpd, 0);
+		mutex_unlock(&genpd->lock);
+	}
+
+	return ret;
 }
 
 static bool pd_ignore_unused;
-- 
Regards,

Laurent Pinchart


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-03-04 21:22 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-01 23:20 [PATCH] PM / Domains: Propagate start and restore errors during runtime resume Laurent Pinchart
2016-03-03 20:24 ` Kevin Hilman
2016-03-03 20:32   ` Rafael J. Wysocki
2016-03-03 20:34     ` Rafael J. Wysocki
2016-03-03 20:40       ` Laurent Pinchart
2016-03-03 20:32   ` Laurent Pinchart
2016-03-04 10:22 ` Ulf Hansson
2016-03-04 20:38   ` Laurent Pinchart
2016-03-04 21:22     ` Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox