1. 11 8月, 2010 1 次提交
  2. 25 5月, 2010 1 次提交
  3. 22 5月, 2010 2 次提交
  4. 12 1月, 2010 1 次提交
  5. 17 12月, 2009 1 次提交
  6. 16 12月, 2009 2 次提交
  7. 30 7月, 2009 1 次提交
  8. 22 4月, 2009 1 次提交
  9. 07 1月, 2009 3 次提交
  10. 07 11月, 2008 1 次提交
  11. 20 10月, 2008 4 次提交
    • P
      x86: sysfs: kill owner field from attribute · 01e8ef11
      Parag Warudkar 提交于
      Tejun's commit 7b595756 made sysfs
      attribute->owner unnecessary.  But the field was left in the structure to
      ease the merge.  It's been over a year since that change and it is now
      time to start killing attribute->owner along with its users - one arch at
      a time!
      
      This patch is attempt #1 to get rid of attribute->owner only for
      CONFIG_X86_64 or CONFIG_X86_32 .  We will deal with other arches later on
      as and when possible - avr32 will be the next since that is something I
      can test.  Compile (make allyesconfig / make allmodconfig / custom config)
      and boot tested.
      
      akpm: the idea is that we put the declaration of sttribute.owner inside
      `#ifndef CONFIG_X86'.  But that proved to be too ambitious for now because
      new usages kept on turning up in subsystem trees.
      
      [akpm: remove the ifdef for now]
      Signed-off-by: NParag Warudkar <parag.lkml@gmail.com>
      Cc: Greg KH <greg@kroah.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Tejun Heo <htejun@gmail.com>
      Cc: Len Brown <lenb@kernel.org>
      Cc: Jens Axboe <jens.axboe@oracle.com>
      Cc: Jean Delvare <khali@linux-fr.org>
      Cc: Roland Dreier <rolandd@cisco.com>
      Cc: David Brownell <david-b@pacbell.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      01e8ef11
    • A
      drivers/rtc/: use bcd2bin/bin2bcd · fe20ba70
      Adrian Bunk 提交于
      Change drivers/rtc/ to use the new bcd2bin/bin2bcd functions instead of
      the obsolete BCD_TO_BIN/BIN_TO_BCD/BCD2BIN/BIN2BCD macros.
      Signed-off-by: NAdrian Bunk <bunk@kernel.org>
      Acked-by: NAlessandro Zummo <a.zummo@towertech.it>
      Cc: David Brownell <david-b@pacbell.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      fe20ba70
    • D
      rtc-cmos: export second NVRAM bank · c8fc40cd
      David Brownell 提交于
      Teach rtc-cmos about the second bank of registers found on most modern x86
      systems, giving access to 128 bytes more NVRAM.
      
      This version only sees that extra NVRAM when both register banks are
      provided as part of *one* PNP resource.  Since BIOS on some systems
      presents them using two IO resources, and nothing merges them, this can't
      always show all the NVRAM.  (We're supposed to be able to use PNP id
      PNP0b01 too, but BIOS tables doesn't often seem to use that particular
      option.)
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c8fc40cd
    • D
      rtc-cmos: export second NVRAM bank · bb93d802
      David Brownell 提交于
      Teach rtc-cmos about the second bank of registers found on most modern x86
      systems, giving access to 128 bytes more NVRAM.
      
      This version only sees that extra NVRAM when both register banks are
      provided as part of *one* PNP resource.  Since BIOS on some systems
      presents them using two IO resources, and nothing merges them, this can't
      always show all the NVRAM.  (We're supposed to be able to use PNP id
      PNP0b01 too, but BIOS tables doesn't often seem to use that particular
      option.)
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: torvalds@linux-foundation.org
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      bb93d802
  12. 15 10月, 2008 2 次提交
  13. 03 9月, 2008 1 次提交
  14. 30 8月, 2008 1 次提交
  15. 25 7月, 2008 3 次提交
    • D
      rtc-cmos: avoid spurious irqs · 7e2a31da
      David Brownell 提交于
      This fixes kernel http://bugzilla.kernel.org/show_bug.cgi?id=11112 (bogus
      RTC update IRQs reported) for rtc-cmos, in two ways:
      
        - When HPET is stealing the IRQs, use the first IRQ to grab
          the seconds counter which will be monitored (instead of
          using whatever was previously in that memory);
      
        - In sane IRQ handling modes, scrub out old IRQ status before
          enabling IRQs.
      
      That latter is done by tightening up IRQ handling for rtc-cmos everywhere,
      also ensuring that when HPET is used it's the only thing triggering IRQ
      reports to userspace; net object shrink.
      
      Also fix a bogus HPET message related to its RTC emulation.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Report-by: NW Unruh <unruh@physics.ubc.ca>
      Cc: Andrew Victor <avictor.za@gmail.com>
      Cc: <stable@kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7e2a31da
    • D
      rtc-cmos: improve HPET IRQ glue · 35d3fdd5
      David Brownell 提交于
      Resolve http://bugzilla.kernel.org/show_bug.cgi?id=11051 and other bugs
      related to the way the HPET glue code in rtc-cmos was incomplete and
      inconsistent:
      
       * Switch the approach so that the basic driver code flow isn't
         changed by having HPET ... instead, just have HPET shadow the
         RTC_CONTROL irq enables and RTC_FREQ_SELECT data.  It's only
         coping with IRQ thievery, after all.
      
       * Do that consistently (!!) to avoid problems when the HPET code
         is out of sync with the real RTC intent.  Examples include:
      
         - cmos_procfs(), which now reports correct data
      
         - cmos_irq_set_state() ... also removing the previous PIE_{ON,OFF}
           ioctl support so only one code path manages "periodic" IRQs
      
         - cmos_do_shutdown() ... currently a "just in case" change.
      
         - cmos_suspend() and cmos_resume() ... also handling a bug that
           was specific to HPET's IRQ thievery, where the alarm wasn't
           disabled after waking the system
      
       * Always call that HPET code under the RTC spinlock (it doesn't do
         its own locking)
      
      Also clean up the HPET glue:
      
       * Add some comments explaining what's going on.
      
       * Switch to having just one #ifdef for the HPET glue, and inline
         functions (not #defines) to avoid some compiler warnings.
      
       * Have the probe message also report when HPET IRQs are involved
      
      This still leaves various holes in the HPET glue, like the emulated update
      IRQs being out of sync with the RTC, alarms never using day or month
      matches, and many extra IRQs (at 64 Hz).
      
      [akpm@linux-foundation.org: fix build]
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Tomas Janousek <tomi@nomi.cz>
      Cc: Bernhard Walle <bwalle@suse.de>
      Cc: Carlos R. Mafra <crmafra@ift.unesp.br>
      Acked-by: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      35d3fdd5
    • C
      rtc: remove and clarify unneeded externs · c68d07b2
      Carlos R. Mafra 提交于
      When CONFIG_HPET_EMULATE_RTC is defined the external declaration of
      hpet_rtc_interrupt is redundant due to the inclusion of hpet.h.
      
      When !CONFIG_HPET_EMULATE_RTC we make it clear that hpet_rtc_interrupt is
      not used by defining it to return zero.
      Signed-off-by: NCarlos R. Mafra <crmafra@ift.unesp.br>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c68d07b2
  16. 13 6月, 2008 1 次提交
    • S
      provide rtc_cmos platform device · 1da2e3d6
      Stas Sergeev 提交于
      Recently (around 2.6.25) I've noticed that RTC no longer works for me.  It
      turned out this is because I use pnpacpi=off kernel option to work around
      the parport_pc bugs.  I always did so, but RTC used to work fine in the
      past, and now it have regressed.
      
      The patch fixes the problem by creating the platform device for the RTC
      when PNP is disabled.  This may also help running the PNP-enabled kernel
      on an older PCs.
      Signed-off-by: NStas Sergeev <stsp@aknet.ru>
      Cc: David Brownell <david-b@pacbell.net>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
      Cc: Adam Belay <ambx1@neo.rr.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1da2e3d6
  17. 29 4月, 2008 1 次提交
  18. 16 4月, 2008 1 次提交
  19. 11 4月, 2008 1 次提交
  20. 24 2月, 2008 1 次提交
  21. 07 2月, 2008 3 次提交
    • B
      rtc: add HPET RTC emulation to RTC_DRV_CMOS · 9d8af78b
      Bernhard Walle 提交于
      That patch adds the RTC emulation of the HPET timer to the new RTC_DRV_CMOS.
      The old drivers/char/rtc.ko driver had that functionality and it's important
      on new systems.
      
      [akpm@linux-foundation.org: unbreak alpha build]
      Signed-off-by: NBernhard Walle <bwalle@suse.de>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: David Brownell <david-b@pacbell.net>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Andi Kleen <ak@suse.de>
      Cc: john stultz <johnstul@us.ibm.com>
      Cc: Robert Picco <Robert.Picco@hp.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      9d8af78b
    • D
      rtc-cmos alarm acts as oneshot · 8a0bdfd7
      David Brownell 提交于
      Start making the rtc-cmos alarm act more like a oneshot alarm by disabling
      that alarm after its IRQ fires.  (ACPI hooks are also needed.)
      
      The Linux RTC framework has previously been a bit vague in this area, but
      any other behavior is problematic and not very portable.  RTCs with full
      YYYY-MM-DD HH:MM[:SS] alarms won't have a problem here.  Only ones with
      partial match criteria, with the most visible example being the PC RTC, get
      confused.  (Because the criteria will match repeatedly.)
      
      Update comments relating to that oneshot behavior and timezone handling.
      (Timezones are another issue that's mostly visible with rtc-cmos.  That's
      because PCs often dual-boot MS-Windows, which likes its RTC to match local
      wall-clock time instead of UTC.)
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      8a0bdfd7
    • D
      rtc-cmos: export nvram in sysfs · e07e232c
      David Brownell 提交于
      This makes rtc-cmos export its NVRAM, like several other RTC drivers.
      
      It still works within the limits of the current CMOS_READ/CMOS_WRITE calls,
      which don't understand how to access multiple register banks.  The primary
      impact of that limitation is that Linux can't access the uppermost 128
      bytes of NVRAM on many systems.
      
      Note that this isn't aiming to be a drop-in replacement for the legacy
      /dev/nvram support.  (Presumably that has real users, and isn't just
      getting carried forward automatically?) Userspace handles more work:
      
       - When userspace code updates NVRAM, that will need to include
         updating any platform-specific checksums that may apply.
      
       - No /proc/driver/nvram file will parse and display NVRAM data
         according to whichever boot firmware your board expects.
      
      Also minor pnp-related updates: update a comment, remove dead code.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: NAlessandro Zummo <a.zummo@towertech.it>
      Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      e07e232c
  22. 05 11月, 2007 1 次提交
    • M
      rtc: ignore msb when reading back mday from alarm · 615bb29c
      Mark Lord 提交于
      I have a system here that actively relies upon RTC wake alarms, and it
      has been failing (again) for a few days when attempting to use the
      /sys/class/rtc/rtc?/wakealarm interface.
      
      The old (fixed by Linus) /proc/ interface still works, but I'd like to
      get it using the new one.
      
      This patch fixes rtc-cmos to ignore the two upper bits when reading the
      BCD mday (day of month) register from CMOS.  Some systems (eg.  mine)
      seem to have the top bit set to "1" for some reason.
      
      The older /proc/ interface ignores the upper bits, and so we should too.
      Signed-off-by: NMark Lord <mlord@pobox.com>
      Acked-by: NDavid Brownell <david-b@pacbell.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      615bb29c
  23. 17 10月, 2007 2 次提交
  24. 20 7月, 2007 1 次提交
  25. 01 6月, 2007 1 次提交
  26. 09 5月, 2007 2 次提交
    • M
      rtc-cmos: make it load on PNPBIOS systems · 41ac8df9
      Marko Vrh 提交于
      Replace CONFIG_PNPACPI with CONFIG_PNP, so it loads on ACPI-less PNPBIOS
      systems.
      Signed-off-by: NMarko Vrh <mvrh@freeshells.ch>
      Acked-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      41ac8df9
    • D
      rtc-cmos wakeup interface · 87ac84f4
      David Brownell 提交于
      I finally got around to testing the updated wakeup event hooks for rtc-cmos,
      and they follow in two patches:
      
       - Interface update ... when a simple enable_irq_wake() doesn't suffice,
         the platform data can hold suspend/resume callback hooks.
      
       - ACPI implementation ... provides callback hooks to do ACPI magic, and
         eliminate the legacy /proc/acpi/alarm file.
      
      The interface update could go into 2.6.21, but that's not essential; they
      will be NOPs on most PCs, without the ACPI stuff.
      
      I suspect the ACPI folk may have opinions about how to merge that second
      patch, and how to obsolete that legacy procfs file.  I'd like to see that
      merge into 2.6.22 if possible...
      
      As for how to kick it in ... two ways:
      
       - The appended "rtcwake" program; updated since the last time it was
         posted, it deals much better with timezones and DST.
      
       - Write the /sys/class/rtc/.../wakealarm file, then go to sleep.
      
      For some reason RTC wake from "swsusp" stopped working on a system where
      it previously worked; the alarm setting appears to get clobbered.  But
      on the bright side, RTC wake from "standby" worked on a system that had
      never been able to resume from that state before ... IDEACPI is my guess
      as to why it finally started to work.  It's the old "two steps forward,
      one step back" dance, I guess.
      
      - Dave
      
      /* gcc -Wall -Os -o rtcwake rtcwake.c */
      
      #include <stdio.h>
      #include <getopt.h>
      #include <fcntl.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <errno.h>
      #include <time.h>
      
      #include <sys/ioctl.h>
      #include <sys/time.h>
      #include <sys/types.h>
      
      #include <linux/rtc.h>
      
      /* constants from legacy PC/AT hardware */
      #define	RTC_PF	0x40
      #define	RTC_AF	0x20
      #define	RTC_UF	0x10
      
      /*
       * rtcwake -- enter a system sleep state until specified wakeup time.
       *
       * This uses cross-platform Linux interfaces to enter a system sleep state,
       * and leave it no later than a specified time.  It uses any RTC framework
       * driver that supports standard driver model wakeup flags.
       *
       * This is normally used like the old "apmsleep" utility, to wake from a
       * suspend state like ACPI S1 (standby) or S3 (suspend-to-RAM).  Most
       * platforms can implement those without analogues of BIOS, APM, or ACPI.
       *
       * On some systems, this can also be used like "nvram-wakeup", waking
       * from states like ACPI S4 (suspend to disk).  Not all systems have
       * persistent media that are appropriate for such suspend modes.
       *
       * The best way to set the system's RTC is so that it holds the current
       * time in UTC.  Use the "-l" flag to tell this program that the system
       * RTC uses a local timezone instead (maybe you dual-boot MS-Windows).
       */
      
      static char		*progname;
      
      #ifdef	DEBUG
      #define	VERSION	"1.0 dev (" __DATE__ " " __TIME__ ")"
      #else
      #define	VERSION	"0.9"
      #endif
      
      static unsigned		verbose;
      static int		rtc_is_utc = -1;
      
      static int may_wakeup(const char *devname)
      {
      	char	buf[128], *s;
      	FILE	*f;
      
      	snprintf(buf, sizeof buf, "/sys/class/rtc/%s/device/power/wakeup",
      			devname);
      	f = fopen(buf, "r");
      	if (!f) {
      		perror(buf);
      		return 0;
      	}
      	fgets(buf, sizeof buf, f);
      	fclose(f);
      
      	s = strchr(buf, '\n');
      	if (!s)
      		return 0;
      	*s = 0;
      
      	/* wakeup events could be disabled or not supported */
      	return strcmp(buf, "enabled") == 0;
      }
      
      /* all times should be in UTC */
      static time_t	sys_time;
      static time_t	rtc_time;
      
      static int get_basetimes(int fd)
      {
      	struct tm	tm;
      	struct rtc_time	rtc;
      
      	/* this process works in RTC time, except when working
      	 * with the system clock (which always uses UTC).
      	 */
      	if (rtc_is_utc)
      		setenv("TZ", "UTC", 1);
      	tzset();
      
      	/* read rtc and system clocks "at the same time", or as
      	 * precisely (+/- a second) as we can read them.
      	 */
      	if (ioctl(fd, RTC_RD_TIME, &rtc) < 0) {
      		perror("read rtc time");
      		return 0;
      	}
      	sys_time = time(0);
      	if (sys_time == (time_t)-1) {
      		perror("read system time");
      		return 0;
      	}
      
      	/* convert rtc_time to normal arithmetic-friendly form,
      	 * updating tm.tm_wday as used by asctime().
      	 */
      	memset(&tm, 0, sizeof tm);
      	tm.tm_sec = rtc.tm_sec;
      	tm.tm_min = rtc.tm_min;
      	tm.tm_hour = rtc.tm_hour;
      	tm.tm_mday = rtc.tm_mday;
      	tm.tm_mon = rtc.tm_mon;
      	tm.tm_year = rtc.tm_year;
      	tm.tm_isdst = rtc.tm_isdst;	/* stays unspecified? */
      	rtc_time = mktime(&tm);
      
      	if (rtc_time == (time_t)-1) {
      		perror("convert rtc time");
      		return 0;
      	}
      
      	if (verbose) {
      		if (!rtc_is_utc) {
      			printf("\ttzone   = %ld\n", timezone);
      			printf("\ttzname  = %s\n", tzname[daylight]);
      			gmtime_r(&rtc_time, &tm);
      		}
      		printf("\tsystime = %ld, (UTC) %s",
      				(long) sys_time, asctime(gmtime(&sys_time)));
      		printf("\trtctime = %ld, (UTC) %s",
      				(long) rtc_time, asctime(&tm));
      	}
      
      	return 1;
      }
      
      static int setup_alarm(int fd, time_t *wakeup)
      {
      	struct tm		*tm;
      	struct rtc_wkalrm	wake;
      
      	tm = gmtime(wakeup);
      
      	wake.time.tm_sec = tm->tm_sec;
      	wake.time.tm_min = tm->tm_min;
      	wake.time.tm_hour = tm->tm_hour;
      	wake.time.tm_mday = tm->tm_mday;
      	wake.time.tm_mon = tm->tm_mon;
      	wake.time.tm_year = tm->tm_year;
      	wake.time.tm_wday = tm->tm_wday;
      	wake.time.tm_yday = tm->tm_yday;
      	wake.time.tm_isdst = tm->tm_isdst;
      
      	/* many rtc alarms only support up to 24 hours from 'now' ... */
      	if ((rtc_time + (24 * 60 * 60)) > *wakeup) {
      		if (ioctl(fd, RTC_ALM_SET, &wake.time) < 0) {
      			perror("set rtc alarm");
      			return 0;
      		}
      		if (ioctl(fd, RTC_AIE_ON, 0) < 0) {
      			perror("enable rtc alarm");
      			return 0;
      		}
      
      	/* ... so use the "more than 24 hours" request only if we must */
      	} else {
      		/* avoid an extra AIE_ON call */
      		wake.enabled = 1;
      
      		if (ioctl(fd, RTC_WKALM_SET, &wake) < 0) {
      			perror("set rtc wake alarm");
      			return 0;
      		}
      	}
      
      	return 1;
      }
      
      static void suspend_system(const char *suspend)
      {
      	FILE	*f = fopen("/sys/power/state", "w");
      
      	if (!f) {
      		perror("/sys/power/state");
      		return;
      	}
      
      	fprintf(f, "%s\n", suspend);
      	fflush(f);
      
      	/* this executes after wake from suspend */
      	fclose(f);
      }
      
      int main(int argc, char **argv)
      {
      	static char		*devname = "rtc0";
      	static unsigned		seconds = 0;
      	static char		*suspend = "standby";
      
      	int		t;
      	int		fd;
      	time_t		alarm = 0;
      
      	progname = strrchr(argv[0], '/');
      	if (progname)
      		progname++;
      	else
      		progname = argv[0];
      	if (chdir("/dev/") < 0) {
      		perror("chdir /dev");
      		return 1;
      	}
      
      	while ((t = getopt(argc, argv, "d:lm:s:t:uVv")) != EOF) {
      		switch (t) {
      
      		case 'd':
      			devname = optarg;
      			break;
      
      		case 'l':
      			rtc_is_utc = 0;
      			break;
      
      		/* what system power mode to use?  for now handle only
      		 * standardized mode names; eventually when systems define
      		 * their own state names, parse /sys/power/state.
      		 *
      		 * "on" is used just to test the RTC alarm mechanism,
      		 * bypassing all the wakeup-from-sleep infrastructure.
      		 */
      		case 'm':
      			if (strcmp(optarg, "standby") == 0
      					|| strcmp(optarg, "mem") == 0
      					|| strcmp(optarg, "disk") == 0
      					|| strcmp(optarg, "on") == 0
      					) {
      				suspend = optarg;
      				break;
      			}
      			printf("%s: unrecognized suspend state '%s'\n",
      					progname, optarg);
      			goto usage;
      
      		/* alarm time, seconds-to-sleep (relative) */
      		case 's':
      			t = atoi(optarg);
      			if (t < 0) {
      				printf("%s: illegal interval %s seconds\n",
      						progname, optarg);
      				goto usage;
      			}
      			seconds = t;
      			break;
      
      		/* alarm time, time_t (absolute, seconds since 1/1 1970 UTC) */
      		case 't':
      			t = atoi(optarg);
      			if (t < 0) {
      				printf("%s: illegal time_t value %s\n",
      						progname, optarg);
      				goto usage;
      			}
      			alarm = t;
      			break;
      
      		case 'u':
      			rtc_is_utc = 1;
      			break;
      
      		case 'v':
      			verbose++;
      			break;
      
      		case 'V':
      			printf("%s: version %s\n", progname, VERSION);
      			break;
      
      		default:
      usage:
      			printf("usage: %s [options]"
      				"\n\t"
      				"-d rtc0|rtc1|...\t(select rtc)"
      				"\n\t"
      				"-l\t\t\t(RTC uses local timezone)"
      				"\n\t"
      				"-m standby|mem|...\t(sleep mode)"
      				"\n\t"
      				"-s seconds\t\t(seconds to sleep)"
      				"\n\t"
      				"-t time_t\t\t(time to wake)"
      				"\n\t"
      				"-u\t\t\t(RTC uses UTC)"
      				"\n\t"
      				"-v\t\t\t(verbose messages)"
      				"\n\t"
      				"-V\t\t\t(show version)"
      				"\n",
      				progname);
      			return 1;
      		}
      	}
      
      	if (!alarm && !seconds) {
      		printf("%s: must provide wake time\n", progname);
      		goto usage;
      	}
      
      	/* REVISIT:  if /etc/adjtime exists, read it to see what
      	 * the util-linux version of hwclock assumes.
      	 */
      	if (rtc_is_utc == -1) {
      		printf("%s: assuming RTC uses UTC ...\n", progname);
      		rtc_is_utc = 1;
      	}
      
      	/* this RTC must exist and (if we'll sleep) be wakeup-enabled */
      	fd = open(devname, O_RDONLY);
      	if (fd < 0) {
      		perror(devname);
      		return 1;
      	}
      	if (strcmp(suspend, "on") != 0 && !may_wakeup(devname)) {
      		printf("%s: %s not enabled for wakeup events\n",
      				progname, devname);
      		return 1;
      	}
      
      	/* relative or absolute alarm time, normalized to time_t */
      	if (!get_basetimes(fd))
      		return 1;
      	if (verbose)
      		printf("alarm %ld, sys_time %ld, rtc_time %ld, seconds %u\n",
      				alarm, sys_time, rtc_time, seconds);
      	if (alarm) {
      		if (alarm < sys_time) {
      			printf("%s: time doesn't go backward to %s",
      					progname, ctime(&alarm));
      			return 1;
      		}
      		alarm += sys_time - rtc_time;
      	} else
      		alarm = rtc_time + seconds + 1;
      	if (setup_alarm(fd, &alarm) < 0)
      		return 1;
      
      	sync();
      	printf("%s: wakeup from \"%s\" using %s at %s",
      			progname, suspend, devname,
      			ctime(&alarm));
      	fflush(stdout);
      	usleep(10 * 1000);
      
      	if (strcmp(suspend, "on") != 0)
      		suspend_system(suspend);
      	else {
      		unsigned long data;
      
      		do {
      			t = read(fd, &data, sizeof data);
      			if (t < 0) {
      				perror("rtc read");
      				break;
      			}
      			if (verbose)
      				printf("... %s: %03lx\n", devname, data);
      		} while (!(data & RTC_AF));
      	}
      
      	if (ioctl(fd, RTC_AIE_OFF, 0) < 0)
      		perror("disable rtc alarm interrupt");
      
      	close(fd);
      	return 0;
      }
      
      This patch:
      
      Make rtc-cmos do the relevant magic so this RTC can wake the system from a
      sleep state.  That magic comes in two basic flavors:
      
       - Straightforward:  enable_irq_wake(), the way it'd work on most SOC chips;
         or generally with system sleep states which don't disable core IRQ logic.
      
       - Roundabout, using non-IRQ platform hooks.  This is needed with ACPI and
         one almost-clone chip which uses a special wakeup-only alarm.  (That's
         the RTC used on Footbridge boards, FWIW, which don't do PM in Linux.)
      
      A separate patch implements those hooks for ACPI platforms, so that rtc_cmos
      can issue system wakeup events (and its sysfs "wakealarm" attribute works on
      at least some systems).
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: Len Brown <lenb@kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      87ac84f4