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