[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 <pavel@suse.cz>
Cc: "Brown, Len" <len.brown@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Pavel Machek and committed by Linus Torvalds 123d3c13 d91b14c4

+16 -5
+16 -5
kernel/power/main.c
··· 24 24 25 25 DECLARE_MUTEX(pm_sem); 26 26 27 - struct pm_ops * pm_ops = NULL; 27 + struct pm_ops *pm_ops; 28 28 suspend_disk_method_t pm_disk_mode = PM_DISK_SHUTDOWN; 29 29 30 30 /** ··· 151 151 #endif 152 152 }; 153 153 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 + 154 166 155 167 /** 156 168 * enter_state - Do common work of entering low-power state. ··· 179 167 { 180 168 int error; 181 169 182 - if (pm_ops && pm_ops->valid && !pm_ops->valid(state)) 170 + if (!valid_state(state)) 183 171 return -ENODEV; 184 172 if (down_trylock(&pm_sem)) 185 173 return -EBUSY; ··· 250 238 char * s = buf; 251 239 252 240 for (i = 0; i < PM_SUSPEND_MAX; i++) { 253 - if (pm_states[i] && pm_ops && (!pm_ops->valid 254 - ||(pm_ops->valid && pm_ops->valid(i)))) 255 - s += sprintf(s,"%s ",pm_states[i]); 241 + if (pm_states[i] && valid_state(i)) 242 + s += sprintf(s,"%s ", pm_states[i]); 256 243 } 257 244 s += sprintf(s,"\n"); 258 245 return (s - buf);