PM / Sleep: Implement opportunistic sleep, v2

Introduce a mechanism by which the kernel can trigger global
transitions
to a sleep state chosen by user space if there are no
active wakeup
sources.

It consists of a new sysfs attribute, /sys/power/autosleep,
that
can be written one of the strings returned by reads
from
/sys/power/state, an ordered workqueue and a work item carrying
out
the "suspend" operations.  If a string representing the
system's
sleep state is written to /sys/power/autosleep, the work
item
triggering transitions to that state is queued up and it
requeues
itself after every execution until user space writes "off"
to
/sys/power/autosleep.

That work item enables the detection of wakeup
events using the
functions already defined in
drivers/base/power/wakeup.c (with one
small modification) and calls
either pm_suspend(), or hibernate() to
put the system into a sleep
state.  If a wakeup event is reported
while the transition is in
progress, it will abort the transition and
the "system suspend" work
item will be queued up again.

Change-Id:
Ic3214de009c64feab606e93811bd442ccfc49d86
Signed-off-by: Rafael J.
Wysocki <rjw@sisk.pl>
Acked-by: Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
Reviewed-by: NeilBrown
<neilb@suse.de>
Git-commit: 7483b4a
Git-repo:
git://codeaurora.org/kernel/msm.git
[anursing@codeaurora.org: replace
existing implementation, resolve
merge conflicts]
Signed-off-by: Anurag
Singh <anursing@codeaurora.org>

Conflicts:

drivers/base/power/wakeup.c

idea is taken here -
https://github.com/rmbq/android_kernel_htc_msm8960/commit/d7597b84b72054a18a4d98489c60ef8cad0cb6f7