All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Weiner <hannes@saeurebad.de>
To: Pavel Machek <pavel@ucw.cz>
Cc: Ingo Molnar <mingo@elte.hu>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>, Zan Lynx <zlynx@acm.org>,
	Thomas Gleixner <tglx@linutronix.de>, Len Brown <lenb@kernel.org>,
	linux-kernel@vger.kernel.org
Subject: Re: echo mem > /sys/power/state
Date: Mon, 21 Jan 2008 03:13:56 +0100	[thread overview]
Message-ID: <878x2k53iz.fsf@saeurebad.de> (raw)
In-Reply-To: <20080121003106.GA1618@elf.ucw.cz> (Pavel Machek's message of "Mon, 21 Jan 2008 01:31:06 +0100")

Hi,

Pavel Machek <pavel@ucw.cz> writes:

> diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
> index 29cf145..d830ed2 100644
> --- a/drivers/rtc/rtc-cmos.c
> +++ b/drivers/rtc/rtc-cmos.c
> @@ -78,7 +78,7 @@ static inline int is_intr(u8 rtc_intr)
>  
>  /*----------------------------------------------------------------*/
>  
> -static int cmos_read_time(struct device *dev, struct rtc_time *t)
> +int cmos_read_time(struct device *dev, struct rtc_time *t)
>  {
>  	/* REVISIT:  if the clock has a "century" register, use
>  	 * that instead of the heuristic in get_rtc_time().
> @@ -170,7 +170,7 @@ static int cmos_read_alarm(struct device
>  	return 0;
>  }
>  
> -static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
> +int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>  {
>  	struct cmos_rtc	*cmos = dev_get_drvdata(dev);
>  	unsigned char	mon, mday, hrs, min, sec;
> @@ -394,6 +394,7 @@ static const struct rtc_class_ops cmos_r
>  /*----------------------------------------------------------------*/
>  
>  static struct cmos_rtc	cmos_rtc;
> +struct device *pc_rtc_device;
>  
>  static irqreturn_t cmos_interrupt(int irq, void *p)
>  {
> @@ -431,6 +432,8 @@ cmos_do_probe(struct device *dev, struct
>  	if (cmos_rtc.dev)
>  		return -EBUSY;
>  
> +	pc_rtc_device = dev;
> +
>  	if (!ports)
>  		return -ENODEV;
>  
> @@ -546,7 +549,7 @@ cleanup0:
>  
>  static void cmos_do_shutdown(void)
>  {
> -	unsigned char	rtc_control;
> +	unsigned char rtc_control;
>  
>  	spin_lock_irq(&rtc_lock);
>  	rtc_control = CMOS_READ(RTC_CONTROL);
> diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
> index 8e186c6..b719fd3 100644
> --- a/kernel/power/Kconfig
> +++ b/kernel/power/Kconfig
> @@ -53,14 +53,20 @@ config PM_TRACE
>  	RTC across reboots, so that you can debug a machine that just hangs
>  	during suspend (or more commonly, during resume).
>  
> -	To use this debugging feature you should attempt to suspend the machine,
> -	then reboot it, then run
> +	To use this debugging feature you should attempt to suspend the
> +	machine, then reboot it, then run
>  
>  		dmesg -s 1000000 | grep 'hash matches'
>  
>  	CAUTION: this option will cause your machine's real-time clock to be
>  	set to an invalid time after a resume.
>  
> +config PM_SLEEPY_TEST
> +	bool "Test suspend/resume during bootup"
> +	depends on PM_DEBUG && PM_SLEEP && RTC_DRV_CMOS
> +	---help---
> +	This option will suspend/resume your machine during bootup.
> +
>  config PM_SLEEP_SMP
>  	bool
>  	depends on SUSPEND_SMP_POSSIBLE || HIBERNATION_SMP_POSSIBLE
> diff --git a/kernel/power/Makefile b/kernel/power/Makefile
> index f7dfff2..e5693d6 100644
> --- a/kernel/power/Makefile
> +++ b/kernel/power/Makefile
> @@ -5,7 +5,7 @@ endif
>  
>  obj-y				:= main.o
>  obj-$(CONFIG_PM_LEGACY)		+= pm.o
> -obj-$(CONFIG_PM_SLEEP)		+= process.o console.o
> +obj-$(CONFIG_PM_SLEEP)		+= process.o console.o sleepy.o

Why compiling it uncoditionally?  What would be wrong with

obj-$(CONFIG_PM_SLEEPY_TEST		+= sleepy.o

(besides the missing parenthesis, of course)?

>  obj-$(CONFIG_HIBERNATION)	+= swsusp.o disk.o snapshot.o swap.o user.o
>  
>  obj-$(CONFIG_MAGIC_SYSRQ)	+= poweroff.o
> diff --git a/kernel/power/sleepy.c b/kernel/power/sleepy.c
> new file mode 100644
> index 0000000..a437054
> --- /dev/null
> +++ b/kernel/power/sleepy.c
> @@ -0,0 +1,70 @@
> +/*
> + * Copyright (c) 2007 Pavel Machek <pavel@suse.cz>
> + * 
> + * This file is released under the GPLv2
> + *
> + */
> +
> +#include <linux/module.h>
> +#include <linux/suspend.h>
> +#include <linux/kobject.h>
> +#include <linux/string.h>
> +#include <linux/delay.h>
> +#include <linux/errno.h>
> +#include <linux/init.h>
> +#include <linux/console.h>
> +#include <linux/cpu.h>
> +#include <linux/resume-trace.h>
> +#include <linux/freezer.h>
> +#include <linux/vmstat.h>
> +#include <linux/syscalls.h>
> +#include <linux/rtc.h>
> +
> +#include <asm/percpu.h>
> +
> +#include "power.h"
> +
> +extern int set_alarm(int length);

Huh?

> +
> +extern struct device *pc_rtc_device;
> +extern int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t);
> +extern int cmos_read_time(struct device *dev, struct rtc_time *t);
> +
> +int set_alarm(int length)
> +{
> +	ssize_t retval;
> +	unsigned long now, alarm;
> +	struct rtc_wkalrm alm;
> +	struct rtc_device *rtc = to_rtc_device(pc_rtc_device);
> +
> +	retval = cmos_read_time(pc_rtc_device, &alm.time);
> +	if (retval < 0) {
> +		printk("Auto sleep: can't get time?\n");
> +		return retval;
> +	}
> +	rtc_tm_to_time(&alm.time, &now);
> +	printk("Auto sleep: Now %ld\n", now);
> +
> +	alarm = now+length;
> +	rtc_time_to_tm(alarm, &alm.time);
> +
> +	retval = cmos_set_alarm(rtc, &alm);

cmos_set_alarm() takes a struct device * too.

> +	if (retval < 0) {
> +		printk("Auto sleep: can't set alarm.\n");
> +		return retval;
> +	}
> +	printk("Auto sleep: Alarm set\n");
> +	return 0;
> +}
> +
> +#ifdef CONFIG_PM_SLEEPY_TEST
> +static int
> +test_sleep(void)
> +{
> +	set_alarm(5);
> +	pm_suspend(PM_SUSPEND_MEM);
> +	return 0;
> +}
> +
> +late_initcall(test_sleep);
> +#endif

	Hannes

  reply	other threads:[~2008-01-21  2:13 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-17  6:24 echo mem > /sys/power/state Andrew Morton
2008-01-17 17:36 ` Zan Lynx
2008-01-17 19:13   ` Andrew Morton
2008-01-17 21:38     ` Rafael J. Wysocki
2008-01-17 21:45       ` Nigel Cunningham
2008-01-17 22:27         ` Rafael J. Wysocki
2008-01-18  8:36       ` Ingo Molnar
2008-01-18  8:47         ` Andrew Morton
2008-01-18  9:04           ` Harvey Harrison
2008-01-18 12:18           ` Ingo Molnar
2008-01-18 14:26             ` Rafael J. Wysocki
2008-01-20 23:39             ` Pavel Machek
2008-01-20 23:42               ` Ingo Molnar
2008-01-21  0:31                 ` Pavel Machek
2008-01-21  2:13                   ` Johannes Weiner [this message]
2008-01-21 22:37                     ` Pavel Machek
2008-01-22 14:42                       ` Ingo Molnar
2008-01-23 21:27                         ` Pavel Machek
2008-01-17 21:48     ` Jiri Slaby
2008-01-18  8:51       ` Ingo Molnar
2008-01-17 18:22 ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878x2k53iz.fsf@saeurebad.de \
    --to=hannes@saeurebad.de \
    --cc=akpm@linux-foundation.org \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=pavel@ucw.cz \
    --cc=rjw@sisk.pl \
    --cc=tglx@linutronix.de \
    --cc=zlynx@acm.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.