Messages in this thread Patch in this message | | | From | Rahul Tanwar <> | Subject | [PATCH v2 1/1] x86/init: Noop get/set wallclock when platform doesn't support RTC | Date | Tue, 27 Aug 2019 17:26:21 +0800 |
| |
Use wallclock_init() op to detect platforms which does not support RTC and noop get/set wallclock ops for such platforms.
Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com> Signed-off-by: Rahul Tanwar <rahul.tanwar@linux.intel.com> --- arch/x86/kernel/x86_init.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index 1bef687faf22..88c120710d5d 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -31,6 +31,30 @@ static int __init iommu_init_noop(void) { return 0; } static void iommu_shutdown_noop(void) { } bool __init bool_x86_init_noop(void) { return false; } void x86_op_int_noop(int cpu) { } +static int set_rtc_noop(const struct timespec64 *now) { return -EINVAL; } +static void get_rtc_noop(struct timespec64 *now) { } + +static const struct of_device_id of_cmos_match[] = { + { .compatible = "motorola,mc146818" }, + {} +}; + +void x86_wallclock_init(void) +{ + struct device_node *node; + + node = of_find_matching_node(NULL, of_cmos_match); + if (node && !of_device_is_available(node)) { + /* + * Some products do not support RTC as persistent clock source. This can be + * optionally indicated by having status property as disabled in the + * corresponding DT node. Override get/set wallclock routines to noops for + * such products. + */ + x86_platform.get_wallclock = get_rtc_noop; + x86_platform.set_wallclock = set_rtc_noop; + } +} /* * The platform setup functions are preset with the default functions @@ -73,7 +97,7 @@ struct x86_init_ops x86_init __initdata = { .timers = { .setup_percpu_clockev = setup_boot_APIC_clock, .timer_init = hpet_time_init, - .wallclock_init = x86_init_noop, + .wallclock_init = x86_wallclock_init, }, .iommu = { -- 2.11.0
| |