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.shevche...@intel.com> Signed-off-by: Rahul Tanwar <rahul.tan...@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 18a799c8fa28..4f572fd942eb 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" }, + {} +}; + +static 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