@@ -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