Skip to content

Commit 10da654

Browse files
cyndisrafaeljw
authored andcommitted
PM / Domains: Call driver's noirq callbacks
Currently genpd installs its own noirq callbacks, but never calls down to the driver's corresponding callbacks. Add these calls. Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Acked-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent d8600c8 commit 10da654

File tree

1 file changed

+59
-9
lines changed

1 file changed

+59
-9
lines changed

drivers/base/power/domain.c

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -902,26 +902,33 @@ static int pm_genpd_prepare(struct device *dev)
902902
}
903903

904904
/**
905-
* pm_genpd_suspend_noirq - Completion of suspend of device in an I/O PM domain.
905+
* genpd_finish_suspend - Completion of suspend or hibernation of device in an
906+
* I/O pm domain.
906907
* @dev: Device to suspend.
908+
* @poweroff: Specifies if this is a poweroff_noirq or suspend_noirq callback.
907909
*
908910
* Stop the device and remove power from the domain if all devices in it have
909911
* been stopped.
910912
*/
911-
static int pm_genpd_suspend_noirq(struct device *dev)
913+
static int genpd_finish_suspend(struct device *dev, bool poweroff)
912914
{
913915
struct generic_pm_domain *genpd;
914916
int ret;
915917

916-
dev_dbg(dev, "%s()\n", __func__);
917-
918918
genpd = dev_to_genpd(dev);
919919
if (IS_ERR(genpd))
920920
return -EINVAL;
921921

922922
if (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev))
923923
return 0;
924924

925+
if (poweroff)
926+
ret = pm_generic_poweroff_noirq(dev);
927+
else
928+
ret = pm_generic_suspend_noirq(dev);
929+
if (ret)
930+
return ret;
931+
925932
if (genpd->dev_ops.stop && genpd->dev_ops.start) {
926933
ret = pm_runtime_force_suspend(dev);
927934
if (ret)
@@ -936,6 +943,20 @@ static int pm_genpd_suspend_noirq(struct device *dev)
936943
return 0;
937944
}
938945

946+
/**
947+
* pm_genpd_suspend_noirq - Completion of suspend of device in an I/O PM domain.
948+
* @dev: Device to suspend.
949+
*
950+
* Stop the device and remove power from the domain if all devices in it have
951+
* been stopped.
952+
*/
953+
static int pm_genpd_suspend_noirq(struct device *dev)
954+
{
955+
dev_dbg(dev, "%s()\n", __func__);
956+
957+
return genpd_finish_suspend(dev, false);
958+
}
959+
939960
/**
940961
* pm_genpd_resume_noirq - Start of resume of device in an I/O PM domain.
941962
* @dev: Device to resume.
@@ -964,6 +985,10 @@ static int pm_genpd_resume_noirq(struct device *dev)
964985
if (genpd->dev_ops.stop && genpd->dev_ops.start)
965986
ret = pm_runtime_force_resume(dev);
966987

988+
ret = pm_generic_resume_noirq(dev);
989+
if (ret)
990+
return ret;
991+
967992
return ret;
968993
}
969994

@@ -987,6 +1012,10 @@ static int pm_genpd_freeze_noirq(struct device *dev)
9871012
if (IS_ERR(genpd))
9881013
return -EINVAL;
9891014

1015+
ret = pm_generic_freeze_noirq(dev);
1016+
if (ret)
1017+
return ret;
1018+
9901019
if (genpd->dev_ops.stop && genpd->dev_ops.start)
9911020
ret = pm_runtime_force_suspend(dev);
9921021

@@ -1011,10 +1040,28 @@ static int pm_genpd_thaw_noirq(struct device *dev)
10111040
if (IS_ERR(genpd))
10121041
return -EINVAL;
10131042

1014-
if (genpd->dev_ops.stop && genpd->dev_ops.start)
1043+
if (genpd->dev_ops.stop && genpd->dev_ops.start) {
10151044
ret = pm_runtime_force_resume(dev);
1045+
if (ret)
1046+
return ret;
1047+
}
10161048

1017-
return ret;
1049+
return pm_generic_thaw_noirq(dev);
1050+
}
1051+
1052+
/**
1053+
* pm_genpd_poweroff_noirq - Completion of hibernation of device in an
1054+
* I/O PM domain.
1055+
* @dev: Device to poweroff.
1056+
*
1057+
* Stop the device and remove power from the domain if all devices in it have
1058+
* been stopped.
1059+
*/
1060+
static int pm_genpd_poweroff_noirq(struct device *dev)
1061+
{
1062+
dev_dbg(dev, "%s()\n", __func__);
1063+
1064+
return genpd_finish_suspend(dev, true);
10181065
}
10191066

10201067
/**
@@ -1051,10 +1098,13 @@ static int pm_genpd_restore_noirq(struct device *dev)
10511098
genpd_sync_power_on(genpd, true, 0);
10521099
genpd_unlock(genpd);
10531100

1054-
if (genpd->dev_ops.stop && genpd->dev_ops.start)
1101+
if (genpd->dev_ops.stop && genpd->dev_ops.start) {
10551102
ret = pm_runtime_force_resume(dev);
1103+
if (ret)
1104+
return ret;
1105+
}
10561106

1057-
return ret;
1107+
return pm_generic_restore_noirq(dev);
10581108
}
10591109

10601110
/**
@@ -1496,7 +1546,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
14961546
genpd->domain.ops.resume_noirq = pm_genpd_resume_noirq;
14971547
genpd->domain.ops.freeze_noirq = pm_genpd_freeze_noirq;
14981548
genpd->domain.ops.thaw_noirq = pm_genpd_thaw_noirq;
1499-
genpd->domain.ops.poweroff_noirq = pm_genpd_suspend_noirq;
1549+
genpd->domain.ops.poweroff_noirq = pm_genpd_poweroff_noirq;
15001550
genpd->domain.ops.restore_noirq = pm_genpd_restore_noirq;
15011551
genpd->domain.ops.complete = pm_genpd_complete;
15021552

0 commit comments

Comments
 (0)