Skip to content

Commit 123d3c1

Browse files
pavelmachekLinus Torvalds
authored andcommitted
[PATCH] fix swsusp on machines not supporting S4
Fix swsusp on machines not supporting S4. With recent changes, it is not possible to trigger it using /sys filesystem. Swsusp does not really need any support from low-level code, it is possible to reboot or halt at the end of suspend. Signed-off-by: Pavel Machek <[email protected]> Cc: "Brown, Len" <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent d91b14c commit 123d3c1

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

kernel/power/main.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
DECLARE_MUTEX(pm_sem);
2626

27-
struct pm_ops * pm_ops = NULL;
27+
struct pm_ops *pm_ops;
2828
suspend_disk_method_t pm_disk_mode = PM_DISK_SHUTDOWN;
2929

3030
/**
@@ -151,6 +151,18 @@ static char *pm_states[PM_SUSPEND_MAX] = {
151151
#endif
152152
};
153153

154+
static inline int valid_state(suspend_state_t state)
155+
{
156+
/* Suspend-to-disk does not really need low-level support.
157+
* It can work with reboot if needed. */
158+
if (state == PM_SUSPEND_DISK)
159+
return 1;
160+
161+
if (pm_ops && pm_ops->valid && !pm_ops->valid(state))
162+
return 0;
163+
return 1;
164+
}
165+
154166

155167
/**
156168
* enter_state - Do common work of entering low-power state.
@@ -167,7 +179,7 @@ static int enter_state(suspend_state_t state)
167179
{
168180
int error;
169181

170-
if (pm_ops && pm_ops->valid && !pm_ops->valid(state))
182+
if (!valid_state(state))
171183
return -ENODEV;
172184
if (down_trylock(&pm_sem))
173185
return -EBUSY;
@@ -238,9 +250,8 @@ static ssize_t state_show(struct subsystem * subsys, char * buf)
238250
char * s = buf;
239251

240252
for (i = 0; i < PM_SUSPEND_MAX; i++) {
241-
if (pm_states[i] && pm_ops && (!pm_ops->valid
242-
||(pm_ops->valid && pm_ops->valid(i))))
243-
s += sprintf(s,"%s ",pm_states[i]);
253+
if (pm_states[i] && valid_state(i))
254+
s += sprintf(s,"%s ", pm_states[i]);
244255
}
245256
s += sprintf(s,"\n");
246257
return (s - buf);

0 commit comments

Comments
 (0)