linux/drivers/rtc
Trent Piepho cd7f3a249d rtc: snvs: Add timeouts to avoid kernel lockups
In order to read correctly from asynchronously updated RTC registers,
it's necessary to read repeatedly until their values do not change from
read to read.  It's also necessary to wait for three RTC clock ticks for
certain operations.  There are no timeouts in this code and these
operations could possibly loop forever.

To avoid kernel hangs, put in timeouts.

The iMX7d can be configured to stop the SRTC on a tamper event, which
will lockup the kernel inside this driver as described above.

These hangs can happen when running under qemu, which doesn't emulate
the SNVS RTC, though currently the driver will refuse to load on qemu
due to a timeout in the driver probe method.

It could also happen if the SRTC block where somehow placed into reset
or the slow speed clock that drives the SRTC counter (but not the CPU)
were to stop.

The symptoms on a two core iMX7d are a work queue hang on
rtc_timer_do_work(), which eventually blocks a systemd fsnotify
operation that triggers a work queue flush, causing systemd to hang and
thus causing all services that should be started by systemd, like a
console getty, to fail to start or stop.

Also optimize the wait code to wait less.  It only needs to wait for the
clock to advance three ticks, not to see it change three times.

Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Bryan O'Donoghue <pure.logic@nexus-software.ie>
Signed-off-by: Trent Piepho <tpiepho@impinj.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
2018-07-11 20:41:09 +02:00
..
class.c rtc: Add one offset seconds to expand RTC range 2018-03-17 14:20:55 +01:00
hctosys.c rtc: hctosys: Ensure system time doesn't overflow time_t 2018-03-27 10:44:43 +02:00
interface.c rtc: ensure rtc_set_alarm fails when alarms are not supported 2018-06-07 20:09:49 +02:00
Kconfig rtc: ds1685: remove sysfs access to control registers 2018-06-20 12:38:14 +02:00
Makefile RTC for 4.17 2018-04-10 10:22:27 -07:00
nvmem.c rtc: nvmem: don't use IS_ERR_OR_NULL 2018-05-21 22:34:38 +02:00
rtc-88pm80x.c rtc: 88pm80x: convert to rtc_tm_to_time64/rtc_time64_to_tm 2018-05-17 22:23:21 +02:00
rtc-88pm860x.c rtc: 88pm860x: remove artificial limitation 2018-03-27 10:45:04 +02:00
rtc-ab-b5ze-s3.c rtc: ab-b5ze-s3: let the core handle the RTC range 2018-05-17 22:23:25 +02:00
rtc-ab3100.c rtc: stop validating rtc_time after rtc_time64_to_tm 2018-03-01 10:49:41 +01:00
rtc-ab8500.c rtc: ab8500: Drop AB8540 support 2018-03-27 10:45:05 +02:00
rtc-abx80x.c rtc: abx80x: remove useless message 2018-03-02 10:12:23 +01:00
rtc-ac100.c treewide: Use struct_size() for devm_kmalloc() and friends 2018-06-06 11:15:43 -07:00
rtc-armada38x.c rtc: armada38x: add support for trimming the RTC 2017-10-25 23:05:52 +02:00
rtc-as3722.c
rtc-asm9260.c
rtc-at91rm9200.c rtc: at91rm9200: add range 2018-05-17 22:23:14 +02:00
rtc-at91rm9200.h
rtc-at91sam9.c rtc: at91sam9: Set name of regmap_config 2018-03-17 14:20:57 +01:00
rtc-au1xxx.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-bq32k.c rtc: remove VLA usage 2018-03-17 14:20:56 +01:00
rtc-bq4802.c rtc: bq4802: add error handling for devm_ioremap 2018-07-11 20:41:01 +02:00
rtc-brcmstb-waketimer.c rtc: brcmstb-waketimer: add range 2018-05-21 22:33:52 +02:00
rtc-cmos.c rtc: cmos: introduce quirks to enable use_acpi_alarm mode 2018-04-19 18:01:50 +02:00
rtc-coh901331.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-core.h rtc: export rtc_nvmem_register() to drivers 2018-03-01 10:49:15 +01:00
rtc-cpcap.c rtc: cpcap: stop validating rtc_time in .read_time 2018-03-02 10:09:59 +01:00
rtc-cros-ec.c rtc: cros-ec: Switch to SPDX identifier. 2018-06-07 20:09:49 +02:00
rtc-da9052.c rtc: diasemi: stop validating rtc_time in .read_time 2018-03-02 10:11:02 +01:00
rtc-da9055.c rtc: diasemi: stop validating rtc_time in .read_time 2018-03-02 10:11:02 +01:00
rtc-da9063.c rtc: diasemi: stop validating rtc_time in .read_time 2018-03-02 10:11:02 +01:00
rtc-davinci.c
rtc-dev.c vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
rtc-digicolor.c
rtc-dm355evm.c mfd: dm355evm_msp: Move header file out of I2C realm 2017-08-15 08:06:14 +01:00
rtc-ds1216.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-ds1286.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds1302.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds1305.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds1307.c rtc: ds1340: Add support for trickle charger. 2018-05-03 22:46:25 +02:00
rtc-ds1343.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds1347.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds1374.c rtc: ds1374: wdt: Fix stop/start ioctl always returning -EINVAL 2017-05-04 14:46:25 +02:00
rtc-ds1390.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds1511.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-ds1553.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-ds1672.c rtc: constify i2c_device_id 2017-09-01 01:10:11 +02:00
rtc-ds1685.c rtc: ds1685: remove sysfs access to control registers 2018-06-20 12:38:14 +02:00
rtc-ds1742.c rtc: ds1742: don't explicitly specify word_size and stride of nvmem 2018-05-21 22:34:36 +02:00
rtc-ds2404.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ds3232.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-efi-platform.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rtc-efi.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-em3027.c rtc: constify i2c_device_id 2017-09-01 01:10:11 +02:00
rtc-ep93xx.c
rtc-fm3130.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-ftrtc010.c rtc: ftrtc010: let the core handle range 2018-06-07 20:10:17 +02:00
rtc-generic.c
rtc-goldfish.c rtc: goldfish: Add missing MODULE_LICENSE 2018-02-13 21:46:04 +01:00
rtc-hid-sensor-time.c rtc: hid-sensor-time: remove some dead code 2017-04-22 17:56:18 +02:00
rtc-hym8563.c
rtc-imxdi.c sched/wait: Disambiguate wq_entry->task_list and wq_head->task_list naming 2017-06-20 12:19:14 +02:00
rtc-isl1208.c rtc: isl1208: switch to rtc_register_device 2018-03-17 14:20:54 +01:00
rtc-isl12022.c rtc: isl12022: use true and false for boolean values 2018-04-03 16:40:46 +02:00
rtc-isl12026.c rtc: isl12026: fixup nvmem registration 2018-03-17 14:20:51 +01:00
rtc-jz4740.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-lib.c rtc: fix rtc_time64_to_tm for 3477 2018-03-17 14:20:50 +01:00
rtc-lp8788.c
rtc-lpc24xx.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-lpc32xx.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-ls1x.c rtc: ls1x: add range 2018-05-18 09:38:22 +02:00
rtc-m41t80.c rtc: m41t80: remove useless indirection 2018-03-17 14:20:48 +01:00
rtc-m41t93.c rtc: m41t93: stop validating rtc_time in .read_time 2018-03-02 10:12:19 +01:00
rtc-m41t94.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-m48t35.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-m48t59.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-m48t86.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-max6900.c rtc: max6900: remove useless indirection 2018-03-17 14:20:46 +01:00
rtc-max6902.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-max6916.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-max8907.c
rtc-max8925.c rtc: max8925: remove redundant check on ret 2017-07-31 00:17:48 +02:00
rtc-max8997.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-max8998.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-max77686.c rtc: max77686: stop validating rtc_time in .read_time 2018-03-02 10:12:20 +01:00
rtc-mc13xxx.c rtc: stop validating rtc_time after rtc_time64_to_tm 2018-03-01 10:49:41 +01:00
rtc-mc146818-lib.c
rtc-mcp795.c rtc: remove VLA usage 2018-03-17 14:20:56 +01:00
rtc-moxart.c
rtc-mpc5121.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-mrst.c rtc: mrst: switch to devm functions 2018-06-05 21:01:59 +02:00
rtc-msm6242.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-mt6397.c mfd: mt6397: Create irq mappings in mfd core driver 2018-04-16 15:16:04 +01:00
rtc-mt7622.c rtc: mt7622: fix module autoloading for OF platform drivers 2018-04-03 16:40:48 +02:00
rtc-mv.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-mxc.c rtc: mxc: Switch to SPDX identifier 2018-05-22 09:47:17 +02:00
rtc-mxc_v2.c rtc: mxc_v2: use rtc_time64_to_tm in mxc_rtc_read_alarm 2018-05-19 10:50:03 +02:00
rtc-nuc900.c rtc: nuc900: stop validating rtc_time in .read_time 2018-03-02 10:12:17 +01:00
rtc-omap.c rtc: omap: stop validating rtc_time in .set_time and .set_alarm 2018-03-02 10:12:21 +01:00
rtc-opal.c rtc: opal: Fix OPAL RTC driver OPAL_BUSY loops 2018-04-25 13:24:13 +10:00
rtc-palmas.c
rtc-pcap.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-pcf2123.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-pcf2127.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-pcf8523.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-pcf8563.c rtc: pcf8563: don't alway enable the alarm 2017-11-09 01:16:36 +01:00
rtc-pcf8583.c
rtc-pcf50633.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-pcf85063.c rtc: pcf85063: fix clearing bits in pcf85063_start_clock 2018-03-17 14:20:57 +01:00
rtc-pcf85363.c rtc: pcf85363: set time accurately 2018-03-17 14:20:49 +01:00
rtc-pic32.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-pl030.c
rtc-pl031.c rtc: pl031: make interrupt optional 2017-10-12 16:30:30 +02:00
rtc-pm8xxx.c rtc: pm8xxx: Fix issue in RTC write path 2018-03-17 14:20:52 +01:00
rtc-proc.c rtc/proc: switch to proc_create_single_data 2018-05-16 07:24:30 +02:00
rtc-ps3.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-puv3.c rtc: puv3: make alarms useful 2017-08-22 12:05:21 +02:00
rtc-pxa.c rtc: pxa: fix probe function 2018-06-07 20:11:08 +02:00
rtc-r7301.c rtc: r7301: stop validating rtc_time in .read_time 2018-03-02 10:12:18 +01:00
rtc-r9701.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-rc5t583.c
rtc-rk808.c rtc: rk808: fix possible race condition 2018-03-17 14:20:42 +01:00
rtc-rp5c01.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-rs5c313.c
rtc-rs5c348.c rtc: rs5c348: let the core handle invalid time 2018-03-01 10:49:40 +01:00
rtc-rs5c372.c rtc: rs5c372: remove useless indirection 2018-03-17 14:20:45 +01:00
rtc-rtd119x.c rtc: Add Realtek RTD1295 2017-09-05 09:55:02 +02:00
rtc-rv3029c2.c rtc: rv3029: Clean up error handling in rv3029_eeprom_write() 2017-10-12 16:24:19 +02:00
rtc-rv8803.c rtc: rv8803: fix possible race condition 2018-03-01 10:49:23 +01:00
rtc-rx4581.c rtc: rx4581: remove useless message 2018-03-02 10:12:24 +01:00
rtc-rx6110.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-rx8010.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-rx8025.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-rx8581.c rtc: rx8581: switch to regmap 2018-05-17 22:43:22 +02:00
rtc-s3c.c rtc: stop validating rtc_time in .read_time 2018-03-02 10:09:58 +01:00
rtc-s3c.h
rtc-s5m.c rtc: s5m: Remove VLA usage 2018-03-17 14:20:57 +01:00
rtc-s35390a.c rtc: s35390a: remove useless indirection 2018-03-17 14:20:44 +01:00
rtc-sa1100.c rtc: sa1100: make alarms useful 2017-08-24 11:03:35 +02: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: sprd: Add new RTC power down check method 2018-05-31 23:02:11 +02:00
rtc-sh.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-sirfsoc.c rtc: sirfsoc: remove useless sirfsoc_rtc_ioctl 2018-03-01 10:49:27 +01:00
rtc-snvs.c rtc: snvs: Add timeouts to avoid kernel lockups 2018-07-11 20:41:09 +02:00
rtc-spear.c rtc: spear: stop validating rtc_time in .set_time and .set_alarm 2018-03-02 10:12:21 +01:00
rtc-st-lpc.c rtc: st-lpc: add range 2018-05-23 09:26:19 +02:00
rtc-starfire.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-stk17ta8.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
rtc-stm32.c rtc: stm32: add stm32mp1 rtc support 2018-05-22 20:10:54 +02:00
rtc-stmp3xxx.c
rtc-sun4v.c
rtc-sun6i.c rtc: sun6i: Fix bit_idx value for clk_register_gate 2018-05-31 23:02:11 +02:00
rtc-sunxi.c rtc: sunxi: fix possible race condition 2018-06-04 14:36:14 +02:00
rtc-sysfs.c rtc: Add RTC range 2018-03-17 14:20:54 +01:00
rtc-tegra.c rtc: tegra: stop validating rtc_time in .set_time 2018-03-02 10:12:22 +01:00
rtc-test.c rtc: test: remove alarm support from the first device 2018-06-07 20:09:49 +02:00
rtc-tps6586x.c rtc: tps6586x: let the core handle rtc range 2018-05-17 22:54:24 +02:00
rtc-tps65910.c rtc: tps65910: add range 2018-05-17 22:37:11 +02:00
rtc-tps80031.c
rtc-twl.c mfd: twl: Move header file out of I2C realm 2017-09-04 14:41:02 +01:00
rtc-tx4939.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-v3020.c
rtc-vr41xx.c rtc: vr41xx: add range 2018-05-17 22:54:21 +02:00
rtc-vt8500.c
rtc-wm831x.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-wm8350.c rtc: wm8350: Remove unused to_wm8350_from_rtc_dev 2017-03-16 22:59:54 +01:00
rtc-x1205.c
rtc-xgene.c rtc: stop validating rtc_time after rtc_time_to_tm 2018-03-01 10:49:41 +01:00
rtc-zynqmp.c rtc: simplify getting .drvdata 2018-05-03 22:08:00 +02:00
systohc.c rtc: remove a warning during scripts/kernel-doc step 2018-03-27 10:45:05 +02:00