summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/Kconfig2
-rw-r--r--arch/x86/mach-efi/Makefile1
-rw-r--r--arch/x86/mach-efi/clocksource.c11
-rw-r--r--drivers/clocksource/Kconfig6
-rw-r--r--drivers/clocksource/Makefile2
-rw-r--r--drivers/clocksource/efi_x86.c (renamed from drivers/clocksource/efi.c)34
6 files changed, 43 insertions, 13 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 9803f3f95..52ccf4894 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -77,7 +77,7 @@ choice
select EFI_GUID
select EFI_DEVICEPATH
select PRINTF_UUID
- select CLOCKSOURCE_EFI
+ select CLOCKSOURCE_EFI_X86
config X86_BIOS_BRINGUP
bool "16 bit BIOS"
diff --git a/arch/x86/mach-efi/Makefile b/arch/x86/mach-efi/Makefile
index c8a97bae0..f633e7c7e 100644
--- a/arch/x86/mach-efi/Makefile
+++ b/arch/x86/mach-efi/Makefile
@@ -1,4 +1,5 @@
obj-$(CONFIG_X86_64) += reloc_x86_64.o crt0-efi-x86_64.o
obj-$(CONFIG_X86_32) += reloc_ia32.o crt0-efi-ia32.o
+obj-y += clocksource.o
extra-$(CONFIG_X86_32) += elf_ia32_efi.lds
extra-$(CONFIG_X86_64) += elf_x86_64_efi.lds
diff --git a/arch/x86/mach-efi/clocksource.c b/arch/x86/mach-efi/clocksource.c
new file mode 100644
index 000000000..2023fa19a
--- /dev/null
+++ b/arch/x86/mach-efi/clocksource.c
@@ -0,0 +1,11 @@
+#include <common.h>
+#include <init.h>
+#include <driver.h>
+
+static int efi_x86_pure_init(void)
+{
+ struct device_d *dev = device_alloc("efi-cs-x86", DEVICE_ID_SINGLE);
+
+ return platform_device_register(dev);
+}
+core_initcall(efi_x86_pure_init);
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 54b05bbf3..9b7f0a9d7 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -34,9 +34,9 @@ config CLOCKSOURCE_DUMMY_RATE
The option CONFIG_CLOCKSOURCE_DUMMY_RATE is used to adjust this clocksource.
The bigger rate valuest makes clocksource "faster".
-config CLOCKSOURCE_EFI
- bool
- depends on EFI_BOOTUP
+config CLOCKSOURCE_EFI_X86
+ bool "EFI X86 HW driver"
+ depends on EFI_BOOTUP && X86
config CLOCKSOURCE_MVEBU
bool
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index e83fdeeec..1fd18296e 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -3,7 +3,7 @@ obj-$(CONFIG_ARM_SMP_TWD) += arm_smp_twd.o
obj-$(CONFIG_CLOCKSOURCE_BCM283X) += bcm2835.o
obj-$(CONFIG_CLOCKSOURCE_CLPS711X) += clps711x.o
obj-$(CONFIG_CLOCKSOURCE_DIGIC) += digic.o
-obj-$(CONFIG_CLOCKSOURCE_EFI) += efi.o
+obj-$(CONFIG_CLOCKSOURCE_EFI_X86) += efi_x86.o
obj-$(CONFIG_CLOCKSOURCE_MVEBU) += mvebu.o
obj-$(CONFIG_CLOCKSOURCE_NOMADIK) += nomadik.o
obj-$(CONFIG_CLOCKSOURCE_ORION) += orion.o
diff --git a/drivers/clocksource/efi.c b/drivers/clocksource/efi_x86.c
index 6d2fee8eb..4d2657ea1 100644
--- a/drivers/clocksource/efi.c
+++ b/drivers/clocksource/efi_x86.c
@@ -1,5 +1,6 @@
#include <common.h>
#include <init.h>
+#include <driver.h>
#include <efi.h>
#include <efi/efi.h>
#include <clock.h>
@@ -38,24 +39,41 @@ static uint64_t ticks_freq(void)
return (ticks_end - ticks_start) * 1000;
}
-static uint64_t efi_clocksource_read(void)
+static uint64_t efi_x86_cs_read(void)
{
return 1000 * 1000 * ticks_read() / freq;
}
-static struct clocksource cs = {
- .read = efi_clocksource_read,
+static int efi_x86_cs_init(struct clocksource *cs)
+{
+ cs->mult = clocksource_hz2mult(1000 * 1000, cs->shift);
+
+ freq = ticks_freq();
+
+ return 0;
+}
+
+static struct clocksource efi_x86_cs = {
+ .read = efi_x86_cs_read,
.mask = CLOCKSOURCE_MASK(64),
.shift = 0,
+ .priority = 100,
+ .init = efi_x86_cs_init,
};
-static int efi_clocksource_init(void)
+static int efi_x86_cs_probe(struct device_d *dev)
{
- cs.mult = clocksource_hz2mult(1000 * 1000, cs.shift);
+ return init_clock(&efi_x86_cs);
+}
- freq = ticks_freq();
+static struct driver_d efi_x86_cs_driver = {
+ .name = "efi-cs-x86",
+ .probe = efi_x86_cs_probe,
+};
- return init_clock(&cs);
+static int efi_x86_cs_initcall(void)
+{
+ return platform_driver_register(&efi_x86_cs_driver);
}
/* for efi the time must be init at core initcall level */
-core_initcall(efi_clocksource_init);
+core_initcall(efi_x86_cs_initcall);