Re: [PATCH 02/13] PM: Add early suspend api.

mark gross
2009-02-05T23:26:24Z

On Wed, Feb 04, 2009 at 06:50:15PM -0800, Arve Hjønnevåg wrote:
> Signed-off-by: Arve Hjønnevåg <arve@android.com>
> ---
> Documentation/power/early-suspend.txt | 26 +++++++++++++++
> include/linux/earlysuspend.h | 55 +++++++++++++++++++++++++++++++++
> 2 files changed, 81 insertions(+), 0 deletions(-)
> create mode 100644 Documentation/power/early-suspend.txt
> create mode 100755 include/linux/earlysuspend.h
>
> diff --git a/Documentation/power/early-suspend.txt b/Documentation/power/early-suspend.txt
> new file mode 100644
> index 0000000..8286d3a
> --- /dev/null
> +++ b/Documentation/power/early-suspend.txt
> @@ -0,0 +1,26 @@
> +Early-suspend
> +=============
> +
> +The early-suspend api allows drivers to get notified when user-space writes to
> +/sys/power/request_state to indicate that the user visible sleep state should
> +change. A level controls what order the handlers are called in. Suspend
> +handlers are called in low to high level order, resume handlers are called in
> +the opposite order.
> +
> +Four levels are defined:
> +EARLY_SUSPEND_LEVEL_BLANK_SCREEN:
> + On suspend the screen should be turned off but the framebuffer must still be
> + accessible. On resume the screen can be turned back on.
> +
> +EARLY_SUSPEND_LEVEL_STOP_DRAWING:
> + On suspend this level notifies user-space that it should stop accessing the
> + framebuffer and it waits for it to complete. On resume it notifies user-space
> + that it should resume screen access.
> + Two methods are provided, console switch or a sysfs interface.
> +
> +EARLY_SUSPEND_LEVEL_DISABLE_FB:
> + Turn off the framebuffer on suspend and back on on resume.
> +
> +EARLY_SUSPEND_LEVEL_STOP_INPUT:
> + On suspend turn off input devices that are not capable of wakeup or where
> + wakeup is disabled. On resume turn the same devices back on.

these levels names are domain and device profile centric. How can we
make these be applicable to more than the HTC dream?

Why 4 levels? 4 seems like too many, but why stop at 4 why not 8?

> diff --git a/include/linux/earlysuspend.h b/include/linux/earlysuspend.h
> new file mode 100755
> index 0000000..1587a3f
> --- /dev/null
> +++ b/include/linux/earlysuspend.h
> @@ -0,0 +1,55 @@
> +/* include/linux/earlysuspend.h
> + *
> + * Copyright (C) 2007-2008 Google, Inc.
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +
> +#ifndef _LINUX_EARLYSUSPEND_H
> +#define _LINUX_EARLYSUSPEND_H
> +
> +#include <linux/list.h>
> +
> +/* The early_suspend structure defines suspend and resume hooks to be called
> + * when the user visible sleep state of the system changes, and a level to
> + * control the order. They can be used to turn off the screen and input
> + * devices that are not used for wakeup.
> + * Suspend handlers are called in low to high level order, resume handlers are
> + * called in the opposite order. If, when calling register_early_suspend,
> + * the suspend handlers have already been called without a matching call to the
> + * resume handlers, the suspend handler will be called directly from
> + * register_early_suspend. This direct call can violate the normal level order.
> + */
> +enum {
> + EARLY_SUSPEND_LEVEL_BLANK_SCREEN = 50,
> + EARLY_SUSPEND_LEVEL_STOP_INPUT = 75,
> + EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,
> + EARLY_SUSPEND_LEVEL_DISABLE_FB = 150,
> +};

Application domain independent levels may be more useful to the larger
community.

> +struct early_suspend {
> +#ifdef CONFIG_HAS_EARLYSUSPEND
> + struct list_head link;
> + int level;
> + void (*suspend)(struct early_suspend *h);
> + void (*resume)(struct early_suspend *h);
> +#endif
> +};
> +
> +#ifdef CONFIG_HAS_EARLYSUSPEND
> +void register_early_suspend(struct early_suspend *handler);
> +void unregister_early_suspend(struct early_suspend *handler);
> +#else
> +#define register_early_suspend(handler) do { } while (0)
> +#define unregister_early_suspend(handler) do { } while (0)
> +#endif
> +

do we really need to no-op this code this way?

--mgross

> +#endif
> +
> --
> 1.6.1
>
> _______________________________________________
> linux-pm mailing list
> linux-pm@lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/linux-pm