[PATCH] rtc: add x86 support for rtc-efi

From: Brian Maly
Date: Mon Apr 06 2009 - 13:51:24 EST


This patch adds support for rtc-efi (RTC Class Driver for EFI-based systems) to x86.

This patch is based on dann frazier patch [add rtc platform driver for EFI -> http://lkml.org/lkml/2009/1/8/434], and also depends on dann's patch. Dann's patch was in the mm tree, though I think its been merged already.

This patch has been tested and works perfectly on every x86 EFI system I could find, though all have been EL64 systems. I would appreciate any testing feedback from EL32 systems from anyone that has one and can test.

Signed-off-by: Brian Maly <bmaly@xxxxxxxxxx>




--- a/drivers/rtc/Kconfig 2009-03-28 04:25:33.000000000 -0400
+++ b/drivers/rtc/Kconfig 2009-03-26 12:53:59.000000000 -0400
@@ -442,7 +442,7 @@ config RTC_DRV_DS1742

config RTC_DRV_EFI
tristate "EFI RTC"
- depends on IA64
+ depends on IA64 || (X86 && EFI) || (X86_64 && EFI)
help
If you say yes here you will get support for the EFI
Real Time Clock.
--- a/arch/x86/kernel/time_32.c 2009-03-12 22:39:28.000000000 -0400
+++ b/arch/x86/kernel/time_32.c 2009-03-27 12:08:58.000000000 -0400
@@ -32,6 +32,7 @@
#include <linux/interrupt.h>
#include <linux/time.h>
#include <linux/mca.h>
+#include <linux/platform_device.h>

#include <asm/arch_hooks.h>
#include <asm/hpet.h>
@@ -135,3 +136,24 @@ void __init time_init(void)
tsc_init();
late_time_init = choose_time_init();
}
+
+#ifdef CONFIG_EFI
+extern int efi_enabled;
+
+static struct platform_device rtc_efi_dev = {
+ .name = "rtc-efi",
+ .id = -1,
+};
+
+static int __init rtc_init(void)
+{
+ if (efi_enabled) {
+ if (platform_device_register(&rtc_efi_dev) < 0)
+ printk(KERN_ERR "unable to register rtc device...\n");
+ }
+ /* not necessarily an error */
+ return 0;
+}
+module_init(rtc_init);
+#endif
+
--- a/arch/x86/kernel/time_64.c 2009-03-12 22:39:28.000000000 -0400
+++ b/arch/x86/kernel/time_64.c 2009-03-27 12:09:39.000000000 -0400
@@ -18,6 +18,7 @@
#include <linux/time.h>
#include <linux/mca.h>
#include <linux/nmi.h>
+#include <linux/platform_device.h>

#include <asm/i8253.h>
#include <asm/hpet.h>
@@ -135,3 +136,24 @@ void __init time_init(void)

late_time_init = choose_time_init();
}
+
+#ifdef CONFIG_EFI
+extern int efi_enabled;
+
+static struct platform_device rtc_efi_dev = {
+ .name = "rtc-efi",
+ .id = -1,
+};
+
+static int __init rtc_init(void)
+{
+ if (efi_enabled) {
+ if (platform_device_register(&rtc_efi_dev) < 0)
+ printk(KERN_ERR "unable to register rtc device...\n");
+ }
+ /* not necessarily an error */
+ return 0;
+}
+module_init(rtc_init);
+#endif
+