A fix for handling advertised, but non-existent 146818 RTCs correctly. With
the recent UIP handling changes the time readout of non-existent RTCs hangs forever as the read returns always 0xFF which means the UIP bit is set. Sanity check the RTC before registering by checking the RTC_VALID register for correctness. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmAWiNYTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoXnqD/9NDgAilf97MsbTowlN+veoJHW/LHG5 2CDTqYHSPYnfR8Nzr+ZdnQMzsw0IfbfXT8Z2GceCf1moXaKAx1DxHiRr+GPnFYov SANZ1W8xKwk4PbiLhq6wvtHc2RVmSZuJoh6a3FlspUR7NbjnqsJqrqoAQvjTn6b2 /G/sXMtVRM9VQ/v80L6OukQfLzXDjLDZ50nYBAcobtNnSNCoFCyScZL7pOr4M7hY u9V9j+ZFVPb4Gut3j4dRUMdEExTMGzOMfQnABHW0QDn8kjOOvMey3XJLEAiJPT2T WkB/UBscq+le8h2aE2dX106iMXzGNmE1pphHhjwxk60dexdZpw1bgBKIPmqpnzXK W3nUSw3PHjUQpwPgl4GdnyZjoJO1XlsP322RrzPAdYOy2sqDrcKNTbueZFIC/zLT 7PYLmnT2qZsTrBPGzFEkN9biz1sZvnOmJ/G8pMyIbV+JtaGpig7uy7wFczXqsKGH gBU0Zqv+UffoTuBQbYR/sdgotFCaPuUQKm26UzKE8FLA8Y9MUJ2St5QZcqDasQEO wrvdEWdXRtMexVJVJ1kzzhSBwnkkCOVARRPRr80+DDLfeqmgzwjV2jyaYkrBPtgo XezxOROjuhIn5GpsCX68CUgg9+l5mxLFLMFB1vYoxQyZ49jZKXunob9flo4xfVTv Z2oPwmDi/Ew7kw== =Q1FX -----END PGP SIGNATURE----- Merge tag 'timers-urgent-2021-01-31' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull timer fix from Thomas Gleixner: "A fix for handling advertised, but non-existent 146818 RTCs correctly. With the recent UIP handling changes the time readout of non-existent RTCs hangs forever as the read returns always 0xFF which means the UIP bit is set. Sanity check the RTC before registering by checking the RTC_VALID register for correctness" * tag 'timers-urgent-2021-01-31' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: rtc: mc146818: Detect and handle broken RTCs
This commit is contained in:
commit
17b756d037
@ -805,6 +805,14 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
|
||||
/* Ensure that the RTC is accessible. Bit 0-6 must be 0! */
|
||||
if ((CMOS_READ(RTC_VALID) & 0x7f) != 0) {
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
dev_warn(dev, "not accessible\n");
|
||||
retval = -ENXIO;
|
||||
goto cleanup1;
|
||||
}
|
||||
|
||||
if (!(flags & CMOS_RTC_FLAGS_NOFREQ)) {
|
||||
/* force periodic irq to CMOS reset default of 1024Hz;
|
||||
*
|
||||
|
@ -21,6 +21,13 @@ unsigned int mc146818_get_time(struct rtc_time *time)
|
||||
|
||||
again:
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
/* Ensure that the RTC is accessible. Bit 0-6 must be 0! */
|
||||
if (WARN_ON_ONCE((CMOS_READ(RTC_VALID) & 0x7f) != 0)) {
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
memset(time, 0xff, sizeof(*time));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether there is an update in progress during which the
|
||||
* readout is unspecified. The maximum update time is ~2ms. Poll
|
||||
|
Loading…
Reference in New Issue
Block a user