@@ -902,26 +902,33 @@ static int pm_genpd_prepare(struct device *dev)
902
902
}
903
903
904
904
/**
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.
906
907
* @dev: Device to suspend.
908
+ * @poweroff: Specifies if this is a poweroff_noirq or suspend_noirq callback.
907
909
*
908
910
* Stop the device and remove power from the domain if all devices in it have
909
911
* been stopped.
910
912
*/
911
- static int pm_genpd_suspend_noirq (struct device * dev )
913
+ static int genpd_finish_suspend (struct device * dev , bool poweroff )
912
914
{
913
915
struct generic_pm_domain * genpd ;
914
916
int ret ;
915
917
916
- dev_dbg (dev , "%s()\n" , __func__ );
917
-
918
918
genpd = dev_to_genpd (dev );
919
919
if (IS_ERR (genpd ))
920
920
return - EINVAL ;
921
921
922
922
if (dev -> power .wakeup_path && genpd_dev_active_wakeup (genpd , dev ))
923
923
return 0 ;
924
924
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
+
925
932
if (genpd -> dev_ops .stop && genpd -> dev_ops .start ) {
926
933
ret = pm_runtime_force_suspend (dev );
927
934
if (ret )
@@ -936,6 +943,20 @@ static int pm_genpd_suspend_noirq(struct device *dev)
936
943
return 0 ;
937
944
}
938
945
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
+
939
960
/**
940
961
* pm_genpd_resume_noirq - Start of resume of device in an I/O PM domain.
941
962
* @dev: Device to resume.
@@ -964,6 +985,10 @@ static int pm_genpd_resume_noirq(struct device *dev)
964
985
if (genpd -> dev_ops .stop && genpd -> dev_ops .start )
965
986
ret = pm_runtime_force_resume (dev );
966
987
988
+ ret = pm_generic_resume_noirq (dev );
989
+ if (ret )
990
+ return ret ;
991
+
967
992
return ret ;
968
993
}
969
994
@@ -987,6 +1012,10 @@ static int pm_genpd_freeze_noirq(struct device *dev)
987
1012
if (IS_ERR (genpd ))
988
1013
return - EINVAL ;
989
1014
1015
+ ret = pm_generic_freeze_noirq (dev );
1016
+ if (ret )
1017
+ return ret ;
1018
+
990
1019
if (genpd -> dev_ops .stop && genpd -> dev_ops .start )
991
1020
ret = pm_runtime_force_suspend (dev );
992
1021
@@ -1011,10 +1040,28 @@ static int pm_genpd_thaw_noirq(struct device *dev)
1011
1040
if (IS_ERR (genpd ))
1012
1041
return - EINVAL ;
1013
1042
1014
- if (genpd -> dev_ops .stop && genpd -> dev_ops .start )
1043
+ if (genpd -> dev_ops .stop && genpd -> dev_ops .start ) {
1015
1044
ret = pm_runtime_force_resume (dev );
1045
+ if (ret )
1046
+ return ret ;
1047
+ }
1016
1048
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);
1018
1065
}
1019
1066
1020
1067
/**
@@ -1051,10 +1098,13 @@ static int pm_genpd_restore_noirq(struct device *dev)
1051
1098
genpd_sync_power_on (genpd , true, 0 );
1052
1099
genpd_unlock (genpd );
1053
1100
1054
- if (genpd -> dev_ops .stop && genpd -> dev_ops .start )
1101
+ if (genpd -> dev_ops .stop && genpd -> dev_ops .start ) {
1055
1102
ret = pm_runtime_force_resume (dev );
1103
+ if (ret )
1104
+ return ret ;
1105
+ }
1056
1106
1057
- return ret ;
1107
+ return pm_generic_restore_noirq ( dev ) ;
1058
1108
}
1059
1109
1060
1110
/**
@@ -1496,7 +1546,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
1496
1546
genpd -> domain .ops .resume_noirq = pm_genpd_resume_noirq ;
1497
1547
genpd -> domain .ops .freeze_noirq = pm_genpd_freeze_noirq ;
1498
1548
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 ;
1500
1550
genpd -> domain .ops .restore_noirq = pm_genpd_restore_noirq ;
1501
1551
genpd -> domain .ops .complete = pm_genpd_complete ;
1502
1552
0 commit comments