diff mbox

[1/2,v2] Documentation, split up rtc.txt into documentation and test file

Message ID 1426707993-18714-2-git-send-email-prarit@redhat.com
State Superseded
Headers show

Commit Message

Prarit Bhargava March 18, 2015, 7:46 p.m. UTC
This patch splits rtc.txt into two separate files, one for the
documentation itself, and the other for the rtctest.c file.  The rtctest
file is moved into the kernel tools/testing/selftests/timers directory.
This will make automated testing easier.  Note that the only difference in
the rtc.txt file is that the location of the rtctest.c file has changed.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: corbet@lwn.net
Cc: rtc-linux@googlegroups.com
Cc: linux-doc@vger.kernel.org
Cc: a.zummo@towertech.it
Cc: prarit@redhat.com
Cc: john.stultz@linaro.org
Cc: shuahkh@osg.samsung.com

---
 Documentation/rtc.txt                    | 264 +------------------------------
 tools/testing/selftests/timers/Makefile  |   3 +-
 tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
 3 files changed, 261 insertions(+), 264 deletions(-)
 create mode 100644 tools/testing/selftests/timers/rtctest.c

Comments

John Stultz March 18, 2015, 8:05 p.m. UTC | #1
On Wed, Mar 18, 2015 at 12:46 PM, Prarit Bhargava <prarit@redhat.com> wrote:
> This patch splits rtc.txt into two separate files, one for the
> documentation itself, and the other for the rtctest.c file.  The rtctest
> file is moved into the kernel tools/testing/selftests/timers directory.
> This will make automated testing easier.  Note that the only difference in
> the rtc.txt file is that the location of the rtctest.c file has changed.
>
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> Cc: corbet@lwn.net
> Cc: rtc-linux@googlegroups.com
> Cc: linux-doc@vger.kernel.org
> Cc: a.zummo@towertech.it
> Cc: prarit@redhat.com
> Cc: john.stultz@linaro.org
> Cc: shuahkh@osg.samsung.com
>
> ---
>  Documentation/rtc.txt                    | 264 +------------------------------
>  tools/testing/selftests/timers/Makefile  |   3 +-
>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>  3 files changed, 261 insertions(+), 264 deletions(-)
>  create mode 100644 tools/testing/selftests/timers/rtctest.c

Acked-by: John Stultz <john.stultz@linaro.org>
Shuah Khan March 19, 2015, 6:24 p.m. UTC | #2
On 03/18/2015 01:46 PM, Prarit Bhargava wrote:
> This patch splits rtc.txt into two separate files, one for the
> documentation itself, and the other for the rtctest.c file.  The rtctest
> file is moved into the kernel tools/testing/selftests/timers directory.
> This will make automated testing easier.  Note that the only difference in
> the rtc.txt file is that the location of the rtctest.c file has changed.
> 
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> Cc: corbet@lwn.net
> Cc: rtc-linux@googlegroups.com
> Cc: linux-doc@vger.kernel.org
> Cc: a.zummo@towertech.it
> Cc: prarit@redhat.com
> Cc: john.stultz@linaro.org
> Cc: shuahkh@osg.samsung.com
> 
> ---
>  Documentation/rtc.txt                    | 264 +------------------------------
>  tools/testing/selftests/timers/Makefile  |   3 +-
>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>  3 files changed, 261 insertions(+), 264 deletions(-)
>  create mode 100644 tools/testing/selftests/timers/rtctest.c

Hi Jon,

Would you like to review the change and Ack it, so I can
take the change in my tree.

thanks,
-- Shuah
John Stultz March 19, 2015, 7 p.m. UTC | #3
On Thu, Mar 19, 2015 at 11:24 AM, Shuah Khan <shuahkh@osg.samsung.com> wrote:
> On 03/18/2015 01:46 PM, Prarit Bhargava wrote:
>> This patch splits rtc.txt into two separate files, one for the
>> documentation itself, and the other for the rtctest.c file.  The rtctest
>> file is moved into the kernel tools/testing/selftests/timers directory.
>> This will make automated testing easier.  Note that the only difference in
>> the rtc.txt file is that the location of the rtctest.c file has changed.
>>
>> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
>> Cc: corbet@lwn.net
>> Cc: rtc-linux@googlegroups.com
>> Cc: linux-doc@vger.kernel.org
>> Cc: a.zummo@towertech.it
>> Cc: prarit@redhat.com
>> Cc: john.stultz@linaro.org
>> Cc: shuahkh@osg.samsung.com
>>
>> ---
>>  Documentation/rtc.txt                    | 264 +------------------------------
>>  tools/testing/selftests/timers/Makefile  |   3 +-
>>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>>  3 files changed, 261 insertions(+), 264 deletions(-)
>>  create mode 100644 tools/testing/selftests/timers/rtctest.c
>
> Hi Jon,
>
> Would you like to review the change and Ack it, so I can
> take the change in my tree.

So you should already have acks on both of these in your mail box, but
to save you time digging through:
  Acked-by: John Stultz <john.stultz@linaro.org>
Shuah Khan March 19, 2015, 7:25 p.m. UTC | #4
On 03/19/2015 01:00 PM, John Stultz wrote:
> On Thu, Mar 19, 2015 at 11:24 AM, Shuah Khan <shuahkh@osg.samsung.com> wrote:
>> On 03/18/2015 01:46 PM, Prarit Bhargava wrote:
>>> This patch splits rtc.txt into two separate files, one for the
>>> documentation itself, and the other for the rtctest.c file.  The rtctest
>>> file is moved into the kernel tools/testing/selftests/timers directory.
>>> This will make automated testing easier.  Note that the only difference in
>>> the rtc.txt file is that the location of the rtctest.c file has changed.
>>>
>>> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
>>> Cc: corbet@lwn.net
>>> Cc: rtc-linux@googlegroups.com
>>> Cc: linux-doc@vger.kernel.org
>>> Cc: a.zummo@towertech.it
>>> Cc: prarit@redhat.com
>>> Cc: john.stultz@linaro.org
>>> Cc: shuahkh@osg.samsung.com
>>>
>>> ---
>>>  Documentation/rtc.txt                    | 264 +------------------------------
>>>  tools/testing/selftests/timers/Makefile  |   3 +-
>>>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>>>  3 files changed, 261 insertions(+), 264 deletions(-)
>>>  create mode 100644 tools/testing/selftests/timers/rtctest.c
>>
>> Hi Jon,
>>
>> Would you like to review the change and Ack it, so I can
>> take the change in my tree.
> 
> So you should already have acks on both of these in your mail box, but
> to save you time digging through:
>   Acked-by: John Stultz <john.stultz@linaro.org>
> 

John,

Thanks I have yours. I looking to get an Ack from Jon Corbet for the
documentation change.

-- Shuah
Shuah Khan March 19, 2015, 8:27 p.m. UTC | #5
On 03/19/2015 02:25 PM, Jonathan Corbet wrote:
> On Thu, 19 Mar 2015 12:24:41 -0600
> Shuah Khan <shuahkh@osg.samsung.com> wrote:
> 
>> Hi Jon,
>>
>> Would you like to review the change and Ack it, so I can
>> take the change in my tree.
> 
> I'd sure like to move more stuff out of the top-level Documentation/
> directory, but that's no reason to hold this up. 
> 
> Acked-by: Jonathan Corbet <corbet@lwn.net>
> 
> I'll assume you're taking it from here.
> 
> Thanks,
> 


Thanks. Yes I will take these through kselftest tree.

-- Shuah
Shuah Khan March 19, 2015, 9:36 p.m. UTC | #6
On 03/19/2015 02:27 PM, Shuah Khan wrote:
> On 03/19/2015 02:25 PM, Jonathan Corbet wrote:
>> On Thu, 19 Mar 2015 12:24:41 -0600
>> Shuah Khan <shuahkh@osg.samsung.com> wrote:
>>
>>> Hi Jon,
>>>
>>> Would you like to review the change and Ack it, so I can
>>> take the change in my tree.
>>
>> I'd sure like to move more stuff out of the top-level Documentation/
>> directory, but that's no reason to hold this up. 
>>
>> Acked-by: Jonathan Corbet <corbet@lwn.net>
>>
>> I'll assume you're taking it from here.
>>
>> Thanks,
>>
> 

Hi Prarit,

Could you please rebase this patch on linux-kselftest next?
I applied a patch that adds timer tests to common logic for
run_tests and install. This patch changed timer Makefile and
your patch conflicts with it. It would be easier to rebase
than fix the conflict.

There is no need to rebase the second patch. Just this one.

thanks,
-- Shuah
Prarit Bhargava March 20, 2015, 10:51 a.m. UTC | #7
On 03/19/2015 05:36 PM, Shuah Khan wrote:
> On 03/19/2015 02:27 PM, Shuah Khan wrote:
>> On 03/19/2015 02:25 PM, Jonathan Corbet wrote:
>>> On Thu, 19 Mar 2015 12:24:41 -0600
>>> Shuah Khan <shuahkh@osg.samsung.com> wrote:
>>>
>>>> Hi Jon,
>>>>
>>>> Would you like to review the change and Ack it, so I can
>>>> take the change in my tree.
>>>
>>> I'd sure like to move more stuff out of the top-level Documentation/
>>> directory, but that's no reason to hold this up. 
>>>
>>> Acked-by: Jonathan Corbet <corbet@lwn.net>
>>>
>>> I'll assume you're taking it from here.
>>>
>>> Thanks,
>>>
>>
> 
> Hi Prarit,
> 
> Could you please rebase this patch on linux-kselftest next?
> I applied a patch that adds timer tests to common logic for
> run_tests and install. This patch changed timer Makefile and
> your patch conflicts with it. It would be easier to rebase
> than fix the conflict.
> 
> There is no need to rebase the second patch. Just this one.

Sure, no problem.

Jon Corbet -- since I need to respin, you mentioned earlier that you didn't want
the rtc.txt file in the Documentation/ directory.  Do you want me to also at the
same time move it to Documentation/timers/rtc.txt ?

P.
diff mbox

Patch

diff --git a/Documentation/rtc.txt b/Documentation/rtc.txt
index 596b60c..8446f1e 100644
--- a/Documentation/rtc.txt
+++ b/Documentation/rtc.txt
@@ -204,266 +204,4 @@  Some common examples:
 
     *	RTC_PIE_ON, RTC_PIE_OFF: These are also emulated by the generic code.
 
-If all else fails, check out the rtc-test.c driver!
-
-
--------------------- 8< ---------------- 8< -----------------------------
-
-/*
- *      Real Time Clock Driver Test/Example Program
- *
- *      Compile with:
- *		     gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest
- *
- *      Copyright (C) 1996, Paul Gortmaker.
- *
- *      Released under the GNU General Public License, version 2,
- *      included herein by reference.
- *
- */
-
-#include <stdio.h>
-#include <linux/rtc.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-
-
-/*
- * This expects the new RTC class driver framework, working with
- * clocks that will often not be clones of what the PC-AT had.
- * Use the command line to specify another RTC if you need one.
- */
-static const char default_rtc[] = "/dev/rtc0";
-
-
-int main(int argc, char **argv)
-{
-	int i, fd, retval, irqcount = 0;
-	unsigned long tmp, data;
-	struct rtc_time rtc_tm;
-	const char *rtc = default_rtc;
-
-	switch (argc) {
-	case 2:
-		rtc = argv[1];
-		/* FALLTHROUGH */
-	case 1:
-		break;
-	default:
-		fprintf(stderr, "usage:  rtctest [rtcdev]\n");
-		return 1;
-	}
-
-	fd = open(rtc, O_RDONLY);
-
-	if (fd ==  -1) {
-		perror(rtc);
-		exit(errno);
-	}
-
-	fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n");
-
-	/* Turn on update interrupts (one per second) */
-	retval = ioctl(fd, RTC_UIE_ON, 0);
-	if (retval == -1) {
-		if (errno == ENOTTY) {
-			fprintf(stderr,
-				"\n...Update IRQs not supported.\n");
-			goto test_READ;
-		}
-		perror("RTC_UIE_ON ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:",
-			rtc);
-	fflush(stderr);
-	for (i=1; i<6; i++) {
-		/* This read will block */
-		retval = read(fd, &data, sizeof(unsigned long));
-		if (retval == -1) {
-			perror("read");
-			exit(errno);
-		}
-		fprintf(stderr, " %d",i);
-		fflush(stderr);
-		irqcount++;
-	}
-
-	fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
-	fflush(stderr);
-	for (i=1; i<6; i++) {
-		struct timeval tv = {5, 0};     /* 5 second timeout on select */
-		fd_set readfds;
-
-		FD_ZERO(&readfds);
-		FD_SET(fd, &readfds);
-		/* The select will wait until an RTC interrupt happens. */
-		retval = select(fd+1, &readfds, NULL, NULL, &tv);
-		if (retval == -1) {
-		        perror("select");
-		        exit(errno);
-		}
-		/* This read won't block unlike the select-less case above. */
-		retval = read(fd, &data, sizeof(unsigned long));
-		if (retval == -1) {
-		        perror("read");
-		        exit(errno);
-		}
-		fprintf(stderr, " %d",i);
-		fflush(stderr);
-		irqcount++;
-	}
-
-	/* Turn off update interrupts */
-	retval = ioctl(fd, RTC_UIE_OFF, 0);
-	if (retval == -1) {
-		perror("RTC_UIE_OFF ioctl");
-		exit(errno);
-	}
-
-test_READ:
-	/* Read the RTC time/date */
-	retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
-	if (retval == -1) {
-		perror("RTC_RD_TIME ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
-		rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
-		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
-
-	/* Set the alarm to 5 sec in the future, and check for rollover */
-	rtc_tm.tm_sec += 5;
-	if (rtc_tm.tm_sec >= 60) {
-		rtc_tm.tm_sec %= 60;
-		rtc_tm.tm_min++;
-	}
-	if (rtc_tm.tm_min == 60) {
-		rtc_tm.tm_min = 0;
-		rtc_tm.tm_hour++;
-	}
-	if (rtc_tm.tm_hour == 24)
-		rtc_tm.tm_hour = 0;
-
-	retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
-	if (retval == -1) {
-		if (errno == ENOTTY) {
-			fprintf(stderr,
-				"\n...Alarm IRQs not supported.\n");
-			goto test_PIE;
-		}
-		perror("RTC_ALM_SET ioctl");
-		exit(errno);
-	}
-
-	/* Read the current alarm settings */
-	retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
-	if (retval == -1) {
-		perror("RTC_ALM_READ ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n",
-		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
-
-	/* Enable alarm interrupts */
-	retval = ioctl(fd, RTC_AIE_ON, 0);
-	if (retval == -1) {
-		perror("RTC_AIE_ON ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Waiting 5 seconds for alarm...");
-	fflush(stderr);
-	/* This blocks until the alarm ring causes an interrupt */
-	retval = read(fd, &data, sizeof(unsigned long));
-	if (retval == -1) {
-		perror("read");
-		exit(errno);
-	}
-	irqcount++;
-	fprintf(stderr, " okay. Alarm rang.\n");
-
-	/* Disable alarm interrupts */
-	retval = ioctl(fd, RTC_AIE_OFF, 0);
-	if (retval == -1) {
-		perror("RTC_AIE_OFF ioctl");
-		exit(errno);
-	}
-
-test_PIE:
-	/* Read periodic IRQ rate */
-	retval = ioctl(fd, RTC_IRQP_READ, &tmp);
-	if (retval == -1) {
-		/* not all RTCs support periodic IRQs */
-		if (errno == ENOTTY) {
-			fprintf(stderr, "\nNo periodic IRQ support\n");
-			goto done;
-		}
-		perror("RTC_IRQP_READ ioctl");
-		exit(errno);
-	}
-	fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
-
-	fprintf(stderr, "Counting 20 interrupts at:");
-	fflush(stderr);
-
-	/* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */
-	for (tmp=2; tmp<=64; tmp*=2) {
-
-		retval = ioctl(fd, RTC_IRQP_SET, tmp);
-		if (retval == -1) {
-			/* not all RTCs can change their periodic IRQ rate */
-			if (errno == ENOTTY) {
-				fprintf(stderr,
-					"\n...Periodic IRQ rate is fixed\n");
-				goto done;
-			}
-			perror("RTC_IRQP_SET ioctl");
-			exit(errno);
-		}
-
-		fprintf(stderr, "\n%ldHz:\t", tmp);
-		fflush(stderr);
-
-		/* Enable periodic interrupts */
-		retval = ioctl(fd, RTC_PIE_ON, 0);
-		if (retval == -1) {
-			perror("RTC_PIE_ON ioctl");
-			exit(errno);
-		}
-
-		for (i=1; i<21; i++) {
-			/* This blocks */
-			retval = read(fd, &data, sizeof(unsigned long));
-			if (retval == -1) {
-				perror("read");
-				exit(errno);
-			}
-			fprintf(stderr, " %d",i);
-			fflush(stderr);
-			irqcount++;
-		}
-
-		/* Disable periodic interrupts */
-		retval = ioctl(fd, RTC_PIE_OFF, 0);
-		if (retval == -1) {
-			perror("RTC_PIE_OFF ioctl");
-			exit(errno);
-		}
-	}
-
-done:
-	fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n");
-
-	close(fd);
-
-	return 0;
-}
+If all else fails, check out the tools/testing/selftests/timers/rtctest.c test!
diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 9da3498..419089b 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -5,7 +5,7 @@  LDFLAGS += -lrt -lpthread
 bins = posix_timers nanosleep inconsistency-check nsleep-lat raw_skew \
 	set-timer-lat threadtest mqueue-lat valid-adjtimex \
 	alarmtimer-suspend change_skew skew_consistency clocksource-switch \
-	leap-a-day leapcrash set-tai set-2038
+	leap-a-day leapcrash set-tai set-2038 rtctest
 
 all: ${bins}
 
@@ -20,6 +20,7 @@  run_tests: all
 	./inconsistency-check
 	./raw_skew
 	./threadtest -t 30 -n 8
+	./rtctest
 
 # these tests require escalated privledges
 # and may modify the system time or trigger
diff --git a/tools/testing/selftests/timers/rtctest.c b/tools/testing/selftests/timers/rtctest.c
new file mode 100644
index 0000000..1e06f46
--- /dev/null
+++ b/tools/testing/selftests/timers/rtctest.c
@@ -0,0 +1,258 @@ 
+/*
+ *      Real Time Clock Driver Test/Example Program
+ *
+ *      Compile with:
+ *		     gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest
+ *
+ *      Copyright (C) 1996, Paul Gortmaker.
+ *
+ *      Released under the GNU General Public License, version 2,
+ *      included herein by reference.
+ *
+ */
+
+#include <stdio.h>
+#include <linux/rtc.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+
+/*
+ * This expects the new RTC class driver framework, working with
+ * clocks that will often not be clones of what the PC-AT had.
+ * Use the command line to specify another RTC if you need one.
+ */
+static const char default_rtc[] = "/dev/rtc0";
+
+
+int main(int argc, char **argv)
+{
+	int i, fd, retval, irqcount = 0;
+	unsigned long tmp, data;
+	struct rtc_time rtc_tm;
+	const char *rtc = default_rtc;
+
+	switch (argc) {
+	case 2:
+		rtc = argv[1];
+		/* FALLTHROUGH */
+	case 1:
+		break;
+	default:
+		fprintf(stderr, "usage:  rtctest [rtcdev]\n");
+		return 1;
+	}
+
+	fd = open(rtc, O_RDONLY);
+
+	if (fd ==  -1) {
+		perror(rtc);
+		exit(errno);
+	}
+
+	fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n");
+
+	/* Turn on update interrupts (one per second) */
+	retval = ioctl(fd, RTC_UIE_ON, 0);
+	if (retval == -1) {
+		if (errno == ENOTTY) {
+			fprintf(stderr,
+				"\n...Update IRQs not supported.\n");
+			goto test_READ;
+		}
+		perror("RTC_UIE_ON ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:",
+			rtc);
+	fflush(stderr);
+	for (i=1; i<6; i++) {
+		/* This read will block */
+		retval = read(fd, &data, sizeof(unsigned long));
+		if (retval == -1) {
+			perror("read");
+			exit(errno);
+		}
+		fprintf(stderr, " %d",i);
+		fflush(stderr);
+		irqcount++;
+	}
+
+	fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
+	fflush(stderr);
+	for (i=1; i<6; i++) {
+		struct timeval tv = {5, 0};     /* 5 second timeout on select */
+		fd_set readfds;
+
+		FD_ZERO(&readfds);
+		FD_SET(fd, &readfds);
+		/* The select will wait until an RTC interrupt happens. */
+		retval = select(fd+1, &readfds, NULL, NULL, &tv);
+		if (retval == -1) {
+		        perror("select");
+		        exit(errno);
+		}
+		/* This read won't block unlike the select-less case above. */
+		retval = read(fd, &data, sizeof(unsigned long));
+		if (retval == -1) {
+		        perror("read");
+		        exit(errno);
+		}
+		fprintf(stderr, " %d",i);
+		fflush(stderr);
+		irqcount++;
+	}
+
+	/* Turn off update interrupts */
+	retval = ioctl(fd, RTC_UIE_OFF, 0);
+	if (retval == -1) {
+		perror("RTC_UIE_OFF ioctl");
+		exit(errno);
+	}
+
+test_READ:
+	/* Read the RTC time/date */
+	retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
+	if (retval == -1) {
+		perror("RTC_RD_TIME ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
+		rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
+		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+
+	/* Set the alarm to 5 sec in the future, and check for rollover */
+	rtc_tm.tm_sec += 5;
+	if (rtc_tm.tm_sec >= 60) {
+		rtc_tm.tm_sec %= 60;
+		rtc_tm.tm_min++;
+	}
+	if (rtc_tm.tm_min == 60) {
+		rtc_tm.tm_min = 0;
+		rtc_tm.tm_hour++;
+	}
+	if (rtc_tm.tm_hour == 24)
+		rtc_tm.tm_hour = 0;
+
+	retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
+	if (retval == -1) {
+		if (errno == ENOTTY) {
+			fprintf(stderr,
+				"\n...Alarm IRQs not supported.\n");
+			goto test_PIE;
+		}
+		perror("RTC_ALM_SET ioctl");
+		exit(errno);
+	}
+
+	/* Read the current alarm settings */
+	retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
+	if (retval == -1) {
+		perror("RTC_ALM_READ ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n",
+		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+
+	/* Enable alarm interrupts */
+	retval = ioctl(fd, RTC_AIE_ON, 0);
+	if (retval == -1) {
+		perror("RTC_AIE_ON ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Waiting 5 seconds for alarm...");
+	fflush(stderr);
+	/* This blocks until the alarm ring causes an interrupt */
+	retval = read(fd, &data, sizeof(unsigned long));
+	if (retval == -1) {
+		perror("read");
+		exit(errno);
+	}
+	irqcount++;
+	fprintf(stderr, " okay. Alarm rang.\n");
+
+	/* Disable alarm interrupts */
+	retval = ioctl(fd, RTC_AIE_OFF, 0);
+	if (retval == -1) {
+		perror("RTC_AIE_OFF ioctl");
+		exit(errno);
+	}
+
+test_PIE:
+	/* Read periodic IRQ rate */
+	retval = ioctl(fd, RTC_IRQP_READ, &tmp);
+	if (retval == -1) {
+		/* not all RTCs support periodic IRQs */
+		if (errno == ENOTTY) {
+			fprintf(stderr, "\nNo periodic IRQ support\n");
+			goto done;
+		}
+		perror("RTC_IRQP_READ ioctl");
+		exit(errno);
+	}
+	fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
+
+	fprintf(stderr, "Counting 20 interrupts at:");
+	fflush(stderr);
+
+	/* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */
+	for (tmp=2; tmp<=64; tmp*=2) {
+
+		retval = ioctl(fd, RTC_IRQP_SET, tmp);
+		if (retval == -1) {
+			/* not all RTCs can change their periodic IRQ rate */
+			if (errno == ENOTTY) {
+				fprintf(stderr,
+					"\n...Periodic IRQ rate is fixed\n");
+				goto done;
+			}
+			perror("RTC_IRQP_SET ioctl");
+			exit(errno);
+		}
+
+		fprintf(stderr, "\n%ldHz:\t", tmp);
+		fflush(stderr);
+
+		/* Enable periodic interrupts */
+		retval = ioctl(fd, RTC_PIE_ON, 0);
+		if (retval == -1) {
+			perror("RTC_PIE_ON ioctl");
+			exit(errno);
+		}
+
+		for (i=1; i<21; i++) {
+			/* This blocks */
+			retval = read(fd, &data, sizeof(unsigned long));
+			if (retval == -1) {
+				perror("read");
+				exit(errno);
+			}
+			fprintf(stderr, " %d",i);
+			fflush(stderr);
+			irqcount++;
+		}
+
+		/* Disable periodic interrupts */
+		retval = ioctl(fd, RTC_PIE_OFF, 0);
+		if (retval == -1) {
+			perror("RTC_PIE_OFF ioctl");
+			exit(errno);
+		}
+	}
+
+done:
+	fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n");
+
+	close(fd);
+
+	return 0;
+}