diff options
-rw-r--r-- | arch/x86/Kconfig | 2 | ||||
-rw-r--r-- | arch/x86/mach-efi/Makefile | 1 | ||||
-rw-r--r-- | arch/x86/mach-efi/clocksource.c | 11 | ||||
-rw-r--r-- | drivers/clocksource/Kconfig | 6 | ||||
-rw-r--r-- | drivers/clocksource/Makefile | 2 | ||||
-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 9803f3f95f..52ccf4894f 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 c8a97bae07..f633e7c7ed 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 0000000000..2023fa19ac --- /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 54b05bbf3b..9b7f0a9d7f 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 e83fdeeec2..1fd18296ea 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 6d2fee8eba..4d2657ea1d 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); |