linux/drivers/rtc
Esben Haabendal 562d9af5c2 rtc: interface: Fix long-standing race when setting alarm
commit 795cda8338 upstream.

As described in the old comment dating back to
commit 6610e0893b ("RTC: Rework RTC code to use timerqueue for events")
from 2010, we have been living with a race window when setting alarm
with an expiry in the near future (i.e. next second).
With 1 second resolution, it can happen that the second ticks after the
check for the timer having expired, but before the alarm is actually set.
When this happen, no alarm IRQ is generated, at least not with some RTC
chips (isl12022 is an example of this).

With UIE RTC timer being implemented on top of alarm irq, being re-armed
every second, UIE will occasionally fail to work, as an alarm irq lost
due to this race will stop the re-arming loop.

For now, I have limited the additional expiry check to only be done for
alarms set to next seconds. I expect it should be good enough, although I
don't know if we can now for sure that systems with loads could end up
causing the same problems for alarms set 2 seconds or even longer in the
future.

I haven't been able to reproduce the problem with this check in place.

Cc: stable@vger.kernel.org
Signed-off-by: Esben Haabendal <esben@geanix.com>
Link: https://lore.kernel.org/r/20250516-rtc-uie-irq-fixes-v2-1-3de8e530a39e@geanix.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-10-19 16:23:16 +02:00
..
class.c rtc: Fix offset calculation for .start_secs < 0 2025-06-27 11:07:05 +01:00
dev.c rtc: Remove unused rtc_dev_exit(). 2022-06-24 21:24:02 +02:00
interface.c rtc: interface: Fix long-standing race when setting alarm 2025-10-19 16:23:16 +02:00
Kconfig rtc: mt6397: select IRQ_DOMAIN instead of depending on it 2024-03-26 18:20:58 -04:00
lib.c rtc: Make rtc_time64_to_tm() support dates before 1970 2025-06-27 11:07:05 +01:00
lib_test.c rtc: test: Fix invalid format specifier. 2024-03-26 18:20:29 -04:00
Makefile rtc: Add NCT3018Y real time clock driver 2022-07-26 17:07:04 +02:00
nvmem.c rtc: nvmem: emit an error message when nvmem registration fails 2020-11-19 12:50:12 +01:00
proc.c rtc: fix snprintf() checking in is_rtc_hctosys() 2021-05-25 00:36:11 +02:00
rtc-88pm80x.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-88pm860x.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-ab-b5ze-s3.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-ab-eoz9.c rtc: ab-eoz9: don't fail temperature reads on undervoltage notification 2024-12-14 19:54:09 +01:00
rtc-ab8500.c rtc: ab8500: let the core handle the alarm resolution 2021-11-10 00:45:57 +01:00
rtc-abx80x.c rtc: abx80x: Fix WDT bit position of the status register 2024-12-14 19:54:07 +01:00
rtc-ac100.c rtc: ac100: use rtc_lock/rtc_unlock 2021-01-25 23:45:37 +01:00
rtc-armada38x.c rtc: armada38x: remove armada38x_rtc_ops_noirq 2021-01-16 23:19:26 +01:00
rtc-as3722.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
rtc-asm9260.c rtc: asm9260: use rtc_lock/rtc_unlock 2021-01-25 23:46:16 +01:00
rtc-aspeed.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-at91rm9200.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-at91sam9.c rtc: at91sam9: fix OF node leak in probe() error path 2024-10-17 15:22:01 +02:00
rtc-au1xxx.c rtc: au1xxx: convert to SPDX identifier 2021-07-10 01:53:39 +02:00
rtc-bd70528.c rtc: bd70528: Drop BD70528 support 2021-06-20 22:24:52 +02:00
rtc-bq32k.c i2c: Make remove callback return void 2022-08-16 12:46:26 +02:00
rtc-bq4802.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
rtc-brcmstb-waketimer.c rtc: brcmstb-waketimer: quiet maybe-unused variable warning 2021-02-06 00:58:24 +01:00
rtc-cadence.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-cmos.c rtc: cmos: use spin_lock_irqsave in cmos_interrupt 2025-07-10 15:59:43 +02:00
rtc-core.h rtc: Remove unused rtc_dev_exit(). 2022-06-24 21:24:02 +02:00
rtc-cpcap.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-cros-ec.c rtc: cros-ec: Only warn once in .remove() about notifier_chain problems 2022-07-26 16:43:46 +02:00
rtc-da9052.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-da9055.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
rtc-da9063.c rtc: da9063: add as wakeup source 2021-12-02 23:23:38 +01:00
rtc-davinci.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-digicolor.c rtc: digicolor: quiet maybe-unused variable warning 2021-02-06 00:58:24 +01:00
rtc-dm355evm.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-ds1216.c rtc: use devm_platform_ioremap_resource() to simplify code 2019-10-07 01:07:35 +02:00
rtc-ds1286.c rtc: use devm_platform_ioremap_resource() to simplify code 2019-10-07 01:07:35 +02:00
rtc-ds1302.c spi: make remove callback a void function 2022-02-09 13:00:45 +00:00
rtc-ds1305.c spi: make remove callback a void function 2022-02-09 13:00:45 +00:00
rtc-ds1307.c rtc: ds1307: remove clear of oscillator stop flag (OSF) in probe 2025-08-28 16:26:03 +02:00
rtc-ds1343.c spi: make remove callback a void function 2022-02-09 13:00:45 +00:00
rtc-ds1347.c rtc: ds1347: fix value written to century register 2023-01-07 11:11:50 +01:00
rtc-ds1374.c i2c: Make remove callback return void 2022-08-16 12:46:26 +02:00
rtc-ds1390.c rtc: ds1390: Add SPI ID table 2021-09-25 23:22:28 +02:00
rtc-ds1511.c rtc: ds1511: remove unused function 2021-04-17 11:21:04 +02:00
rtc-ds1553.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-ds1672.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-ds1685.c rtc: ds1685: use EXPORT_SYMBOL_GPL for ds1685_rtc_poweroff 2023-09-06 21:27:00 +01:00
rtc-ds1742.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-ds2404.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-ds3232.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-efi.c rtc: efi: Enable SET/GET WAKEUP services as optional 2023-02-09 11:28:17 +01:00
rtc-em3027.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-ep93xx.c rtc: ep93xx: Fix NULL pointer dereference in ep93xx_rtc_read_time 2020-12-03 23:49:31 +01:00
rtc-fm3130.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-fsl-ftm-alarm.c rtc: fsl-ftm-alarm: add MODULE_TABLE() 2021-04-17 11:21:04 +02:00
rtc-ftrtc010.c rtc: ftrtc010: Fix error handling in ftrtc010_rtc_probe 2022-05-19 12:08:17 +02:00
rtc-gamecube.c rtc: gamecube: Always reset HW_SRNPROT after read 2022-08-23 22:27:58 +02:00
rtc-generic.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
rtc-goldfish.c clocksource/drivers: Add a goldfish-timer clocksource 2022-04-11 11:48:01 +02:00
rtc-hid-sensor-time.c iio: hid-sensors: lighten exported symbols by moving to IIO_HID namespace 2021-06-16 14:53:13 +01:00
rtc-hym8563.c rtc: hym8563: fix incorrect maximum clock rate handling 2025-08-15 12:05:06 +02:00
rtc-imx-sc.c rtc: imx-sc: remove .read_alarm 2021-04-29 23:03:26 +02:00
rtc-imxdi.c rtc: imxdi: add wakeup support 2021-05-25 00:41:25 +02:00
rtc-isl1208.c rtc: isl1208: Fix return value of nvmem callbacks 2024-08-03 08:49:42 +02:00
rtc-isl12022.c rtc: isl12022: switch to using regmap API 2022-10-13 00:17:22 +02:00
rtc-isl12026.c i2c: Make remove callback return void 2022-08-16 12:46:26 +02:00
rtc-jz4740.c rtc: jz4740: Use devm_clk_get_enabled() helper 2022-10-13 00:31:37 +02:00
rtc-lp8788.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-lpc24xx.c rtc: remove unnecessary error message after platform_get_irq 2020-04-15 09:56:17 +02:00
rtc-lpc32xx.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-ls1x.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-m41t80.c i2c: Make remove callback return void 2022-08-16 12:46:26 +02:00
rtc-m41t93.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-m41t94.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-m48t35.c rtc: m48t35: remove SGI-IP27 kludge 2020-03-16 11:12:11 +01:00
rtc-m48t59.c rtc: m48t59: use platform_get_irq_optional 2021-03-11 09:48:09 +01:00
rtc-m48t86.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-max6900.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-max6902.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-max6916.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-max8907.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-max8925.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-max8997.c rtc: max8997: Fix the returned value in case of error in 'max8997_rtc_read_alarm()' 2018-11-22 18:11:35 +01:00
rtc-max8998.c rtc: maxim: Add SPDX license identifiers 2018-08-14 23:38:45 +02:00
rtc-max77686.c rtc: max77686: Add MAX77714 support 2022-03-07 13:55:04 +00:00
rtc-mc13xxx.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-mc146818-lib.c rtc: Extend timeout for waiting for UIP to clear to 1s 2024-01-31 16:17:01 -08:00
rtc-mcp795.c rtc: mcp795: Add SPI ID table 2021-10-01 23:28:28 +02:00
rtc-meson-vrtc.c rtc: meson-vrtc: Use ktime_get_real_ts64() to get the current time 2023-05-11 23:03:33 +09:00
rtc-meson.c rtc: meson: Fix email address in MODULE_AUTHOR 2022-05-18 00:20:39 +02:00
rtc-moxart.c rtc: moxart: Convert to SPDX identifier 2019-12-23 11:23:49 +01:00
rtc-mpc5121.c rtc: mpc5121: switch to RTC_FEATURE_UPDATE_INTERRUPT 2022-03-23 19:58:38 +01:00
rtc-mpfs.c rtc: mpfs: Use devm_clk_get_enabled() helper 2022-10-13 00:31:18 +02:00
rtc-msc313.c rtc: msc313: Fix function prototype mismatch in msc313_rtc_probe() 2023-01-04 11:28:58 +01:00
rtc-msm6242.c rtc: msm6242: Remove unneeded msm6242_set()/msm6242_clear() functions 2019-11-18 15:23:54 +01:00
rtc-mt2712.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-mt6397.c rtc: mt6397: check return value after calling platform_get_resource() 2022-05-19 12:05:48 +02:00
rtc-mt7622.c rtc: use devm_platform_ioremap_resource() to simplify code 2019-10-07 01:07:35 +02:00
rtc-mv.c rtc: mv: remove mv_rtc_alarm_ops 2021-01-16 23:19:26 +01:00
rtc-mxc.c rtc: mxc: Use devm_clk_get_enabled() helper 2022-08-23 22:33:38 +02:00
rtc-mxc_v2.c rtc: mxc_v2: Add missing clk_disable_unprepare() 2022-12-31 13:32:55 +01:00
rtc-nct3018y.c rtc: nct3018y: fix incorrect maximum clock rate handling 2025-08-15 12:05:06 +02:00
rtc-ntxec.c rtc: New driver for RTC in Netronix embedded controller 2021-03-10 11:06:33 +00:00
rtc-omap.c rtc: omap: include header for omap_rtc_power_off_program prototype 2023-05-11 23:03:33 +09:00
rtc-opal.c rtc: opal: switch to RTC_FEATURE_UPDATE_INTERRUPT 2022-03-23 19:58:39 +01:00
rtc-optee.c rtc: optee: fix memory leak on driver removal 2025-10-19 16:23:06 +02:00
rtc-palmas.c rtc: palmas: convert to SPDX identifier 2021-07-10 01:53:39 +02:00
rtc-pcap.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-pcf2123.c rtc: pcf2123: set RTC_FEATURE_ALARM_RES_MINUTE 2022-03-23 19:58:39 +01:00
rtc-pcf2127.c rtc: pcf2127: Convert to .probe_new() 2022-12-31 13:32:49 +01:00
rtc-pcf8523.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-pcf8563.c rtc: pcf8563: fix incorrect maximum clock rate handling 2025-08-15 12:05:06 +02:00
rtc-pcf8583.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-pcf50633.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
rtc-pcf85063.c rtc: pcf85063: fix incorrect maximum clock rate handling 2025-08-15 12:05:06 +02:00
rtc-pcf85363.c rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call 2023-11-20 11:52:13 +01:00
rtc-pic32.c rtc: pic32: Move devm_rtc_allocate_device earlier in pic32_rtc_probe() 2022-12-31 13:32:53 +01:00
rtc-pl030.c amba: Make the remove callback return void 2021-02-02 14:25:50 +01:00
rtc-pl031.c rtc: pl031: fix rtc features null pointer dereference 2022-03-23 19:58:37 +01:00
rtc-pm8xxx.c rtc: pm8xxx: fix set-alarm race 2023-03-10 09:34:02 +01:00
rtc-ps3.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-pxa.c ARM: pxa: split up mach/hardware.h 2022-04-19 16:27:05 +02:00
rtc-r7301.c rtc: r7301: Replace spin_lock_irqsave with spin_lock in hard IRQ 2021-02-06 00:50:47 +01:00
rtc-r9701.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-rc5t583.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 201 2019-05-30 11:29:52 -07:00
rtc-rc5t619.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-rk808.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-rp5c01.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-rs5c313.c rtc: rtc-rs5c313: Convert to module_platform_driver() 2020-08-21 00:13:44 +02:00
rtc-rs5c348.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-rs5c372.c i2c: Make remove callback return void 2022-08-16 12:46:26 +02:00
rtc-rtd119x.c rtc: rtd119x: Fix format of SPDX identifier 2021-07-10 01:53:39 +02:00
rtc-rv3028.c rtc: rv3028: fix incorrect maximum clock rate handling 2025-08-15 12:05:06 +02:00
rtc-rv3029c2.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-rv3032.c rtc: rv3032: fix EERD location 2025-06-04 14:40:06 +02:00
rtc-rv8803.c rtc: rv8803: fix missing unlock on error in rv8803_set_time() 2022-07-26 11:29:05 +02:00
rtc-rx4581.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-rx6110.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-rx8010.c rtc: rx8010: quiet maybe-unused variable warning 2021-02-06 00:58:25 +01:00
rtc-rx8025.c rtc: rx8025: fix 12/24 hour mode detection on RX-8035 2022-07-26 16:49:45 +02:00
rtc-rx8581.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-rzn1.c rtc: rzn1: fix BCD to rtc_time conversion errors 2024-12-14 19:54:08 +01:00
rtc-s3c.c rtc: s3c: Add time range 2021-10-23 23:57:23 +02:00
rtc-s3c.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
rtc-s5m.c rtc: s5m: drop unneeded MODULE_ALIAS 2021-09-25 23:26:37 +02:00
rtc-s35390a.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-sa1100.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-sa1100.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rtc-sc27xx.c rtc: sc27xx: Fix format of SPDX identifier 2021-07-10 01:53:39 +02:00
rtc-sd3078.c rtc: use simple i2c probe 2022-06-24 21:24:02 +02:00
rtc-sh.c rtc: sh: assign correct interrupts with DT 2025-06-27 11:07:15 +01:00
rtc-snvs.c rtc: snvs: Allow a time difference on clock register read 2022-12-31 13:32:49 +01:00
rtc-spear.c rtc: spear: set range max 2022-08-09 00:56:41 +02:00
rtc-st-lpc.c rtc: st-lpc: Use IRQF_NO_AUTOEN flag in request_irq() 2024-12-14 19:54:07 +01:00
rtc-starfire.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-stk17ta8.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-stm32.c rtc: stm32: Fix unbalanced clk_disable_unprepare() on probe error path 2021-06-20 22:28:02 +02:00
rtc-stmp3xxx.c rtc: stmp3xxx: Add failure handling for stmp3xxx_wdt_register() 2022-10-13 00:03:11 +02:00
rtc-sun4v.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-sun6i.c rtc: sun6i: Always export the internal oscillator 2023-03-11 13:55:29 +01:00
rtc-sunplus.c rtc: sunplus: fix format string for printing resource 2023-02-09 11:28:11 +01:00
rtc-sunxi.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-tegra.c rtc: tegra: Replace spin_lock_irqsave with spin_lock in hard IRQ 2021-02-06 00:50:47 +01:00
rtc-test.c rtc: test: remove debug message 2020-12-03 23:43:23 +01:00
rtc-ti-k3.c rtc: k3: handle errors while enabling wake irq 2023-05-11 23:03:33 +09:00
rtc-tps6586x.c rtc: tps6586x: convert to SPDX identifier 2021-07-10 01:53:40 +02:00
rtc-tps65910.c rtc: tps65910: Correct driver module alias 2021-08-17 23:36:22 +02:00
rtc-twl.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
rtc-v3020.c rtc: v3020: remove redundant initialization of variable retval 2021-06-20 22:29:50 +02:00
rtc-vt8500.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-wilco-ec.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-wm831x.c rtc: rework rtc_register_device() resource management 2020-11-19 12:50:12 +01:00
rtc-wm8350.c rtc: wm8350: Handle error for wm8350_register_irq 2022-03-23 19:58:38 +01:00
rtc-x1205.c rtc: x1205: Fix Xicor X1205 vendor prefix 2025-10-19 16:23:06 +02:00
rtc-xgene.c rtc: xgene: stop using uie_unsupported 2022-03-23 19:58:41 +01:00
rtc-zynqmp.c rtc: zynqmp: Fix optional clock name property 2025-02-21 13:49:53 +01:00
sysfs.c rtc: sysfs: Correct kerneldoc function name hctosys_show() 2021-06-20 22:18:05 +02:00