Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80de3d7f authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

PM / Domains: Do not stop devices after restoring their states



While resuming a device belonging to a PM domain,
pm_genpd_runtime_resume() calls __pm_genpd_restore_device() to
restore its state, if necessary.  The latter starts the device,
using genpd_start_dev(), restores its state, using
genpd_restore_dev(), and then stops it, using genpd_stop_dev().
However, this last operation is not necessary, because the
device is supposed to be operational after pm_genpd_runtime_resume()
has returned and because of it pm_genpd_runtime_resume() has to
call genpd_start_dev() once again for the "restored" device, which
is inefficient.

To make things more efficient, remove the call to genpd_stop_dev()
from __pm_genpd_restore_device() and the direct call to
genpd_start_dev() from pm_genpd_runtime_resume().  [Of course,
genpd_start_dev() still has to be called by it for devices with the
power.irq_safe flag set, because __pm_genpd_restore_device() is not
executed for them.]

This change has been tested on the SH7372 Mackerel board.

Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 0b589741
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -339,19 +339,16 @@ static void __pm_genpd_restore_device(struct pm_domain_data *pdd,
{
	struct generic_pm_domain_data *gpd_data = to_gpd_data(pdd);
	struct device *dev = pdd->dev;
	bool need_restore = gpd_data->need_restore;

	if (!gpd_data->need_restore)
		return;

	gpd_data->need_restore = false;
	mutex_unlock(&genpd->lock);

	genpd_start_dev(genpd, dev);
	if (need_restore)
		genpd_restore_dev(genpd, dev);
	genpd_stop_dev(genpd, dev);

	mutex_lock(&genpd->lock);

	gpd_data->need_restore = false;
}

/**
@@ -595,7 +592,7 @@ static int pm_genpd_runtime_resume(struct device *dev)

	/* If power.irq_safe, the PM domain is never powered off. */
	if (dev->power.irq_safe)
		goto out;
		return genpd_start_dev(genpd, dev);

	mutex_lock(&genpd->lock);
	ret = __pm_genpd_poweron(genpd);
@@ -628,9 +625,6 @@ static int pm_genpd_runtime_resume(struct device *dev)
	wake_up_all(&genpd->status_wait_queue);
	mutex_unlock(&genpd->lock);

 out:
	genpd_start_dev(genpd, dev);

	return 0;
}