linux/drivers/i2c/busses
Tommaso Merciai 0b4c0fbbe0 i2c: riic: Move suspend handling to NOIRQ phase
commit e383f09614 upstream.

Commit 53326135d0 ("i2c: riic: Add suspend/resume support") added
suspend support for the Renesas I2C driver and following this change
on RZ/G3E the following WARNING is seen on entering suspend ...

[  134.275704] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
[  134.285536] ------------[ cut here ]------------
[  134.290298] i2c i2c-2: Transfer while suspended
[  134.295174] WARNING: drivers/i2c/i2c-core.h:56 at __i2c_smbus_xfer+0x1e4/0x214, CPU#0: systemd-sleep/388
[  134.365507] Tainted: [W]=WARN
[  134.368485] Hardware name: Renesas SMARC EVK version 2 based on r9a09g047e57 (DT)
[  134.375961] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[  134.382935] pc : __i2c_smbus_xfer+0x1e4/0x214
[  134.387329] lr : __i2c_smbus_xfer+0x1e4/0x214
[  134.391717] sp : ffff800083f23860
[  134.395040] x29: ffff800083f23860 x28: 0000000000000000 x27: ffff800082ed5d60
[  134.402226] x26: 0000001f4395fd74 x25: 0000000000000007 x24: 0000000000000001
[  134.409408] x23: 0000000000000000 x22: 000000000000006f x21: ffff800083f23936
[  134.416589] x20: ffff0000c090e140 x19: ffff0000c090e0d0 x18: 0000000000000006
[  134.423771] x17: 6f63657320313030 x16: 2e30206465737061 x15: ffff800083f23280
[  134.430953] x14: 0000000000000000 x13: ffff800082b16ce8 x12: 0000000000000f09
[  134.438134] x11: 0000000000000503 x10: ffff800082b6ece8 x9 : ffff800082b16ce8
[  134.445315] x8 : 00000000ffffefff x7 : ffff800082b6ece8 x6 : 80000000fffff000
[  134.452495] x5 : 0000000000000504 x4 : 0000000000000000 x3 : 0000000000000000
[  134.459672] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff0000c9ee9e80
[  134.466851] Call trace:
[  134.469311]  __i2c_smbus_xfer+0x1e4/0x214 (P)
[  134.473715]  i2c_smbus_xfer+0xbc/0x120
[  134.477507]  i2c_smbus_read_byte_data+0x4c/0x84
[  134.482077]  isl1208_i2c_read_time+0x44/0x178 [rtc_isl1208]
[  134.487703]  isl1208_rtc_read_time+0x14/0x20 [rtc_isl1208]
[  134.493226]  __rtc_read_time+0x44/0x88
[  134.497012]  rtc_read_time+0x3c/0x68
[  134.500622]  rtc_suspend+0x9c/0x170

The warning is triggered because I2C transfers can still be attempted
while the controller is already suspended, due to inappropriate ordering
of the system sleep callbacks.

If the controller is autosuspended, there is no way to wake it up once
runtime PM disabled (in suspend_late()). During system resume, the I2C
controller will be available only after runtime PM is re-enabled
(in resume_early()). However, this may be too late for some devices.

Wake up the controller in the suspend() callback while runtime PM is
still enabled. The I2C controller will remain available until the
suspend_noirq() callback (pm_runtime_force_suspend()) is called. During
resume, the I2C controller can be restored by the resume_noirq() callback
(pm_runtime_force_resume()). Finally, the resume() callback re-enables
autosuspend. As a result, the I2C controller can remain available until
the system enters suspend_noirq() and from resume_noirq().

Cc: stable@vger.kernel.org
Fixes: 53326135d0 ("i2c: riic: Add suspend/resume support")
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Biju Das <biju.das.jz@bp.renesas.com>
Tested-by: Biju Das <biju.das.jz@bp.renesas.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-01-23 11:21:28 +01:00
..
i2c-acorn.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
i2c-ali15x3.c i2c: ali15x3: Fix an error handling path in ali15x3_probe() 2025-03-12 12:24:52 +01:00
i2c-ali1535.c i2c: ali1535: Fix an error handling path in ali1535_probe() 2025-03-12 12:24:52 +01:00
i2c-ali1563.c i2c: add missing MODULE_DESCRIPTION() macros 2024-07-09 00:46:06 +02:00
i2c-altera.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-amd-asf-plat.c i2c: amd-asf: Set cmd variable when encountering an error 2025-03-18 21:53:53 +01:00
i2c-amd-mp2-pci.c i2c: amd-mp2: fix reference leak in MP2 PCI device 2026-01-02 12:57:30 +01:00
i2c-amd-mp2-plat.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-amd-mp2.h i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-amd756.c i2c: amd756: Remove superfluous TODO 2025-01-14 11:09:47 +01:00
i2c-amd8111.c i2c: Don't let i2c adapters declare I2C_CLASS_SPD support if they support I2C_CLASS_HWMON 2024-01-18 21:10:41 +01:00
i2c-aspeed.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-at91-core.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-at91-master.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-at91-slave.c i2c: at91: Fix the functionality flags of the slave-only interface 2024-06-12 17:07:33 +01:00
i2c-at91.h i2c: at91: remove legacy DMA left overs 2020-11-03 21:34:40 +01:00
i2c-au1550.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-axxia.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-bcm-iproc.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-bcm-kona.c i2c: bcm-kona: Use i2c_10bit_addr_*_from_msg() helpers 2025-03-18 21:53:54 +01:00
i2c-bcm2835.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-brcmstb.c i2c: brcmstb: Use i2c_10bit_addr_*_from_msg() helpers 2025-03-18 21:53:54 +01:00
i2c-cadence.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-cbus-gpio.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-ccgx-ucsi.c i2c: add missing MODULE_DESCRIPTION() macros 2024-07-09 00:46:06 +02:00
i2c-ccgx-ucsi.h i2c: Introduce common module to instantiate CCGx UCSI 2022-02-15 10:04:53 +01:00
i2c-cgbc.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-cht-wc.c i2c: Switch to irq_domain_create_linear() 2025-05-16 21:06:09 +02:00
i2c-cp2615.c i2c: cp2615: reword according to newest specification 2024-07-11 15:13:30 +02:00
i2c-cpm.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-cros-ec-tunnel.c i2c: cros-ec-tunnel: defer probe if parent EC is not present 2025-04-13 21:33:44 +02:00
i2c-davinci.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-designware-amdisp.c i2c: amd-isp: Initialize unique adapter name 2025-06-25 23:38:33 +02:00
i2c-designware-amdpsp.c i2c: amd: Switch to guard(mutex) 2025-03-18 21:53:53 +01:00
i2c-designware-baytrail.c i2c: designware: Add AMD PSP I2C bus support 2022-02-11 15:38:23 +01:00
i2c-designware-common.c i2c: designware: Don't warn about missing get_clk_rate_khz 2025-05-23 10:02:27 +02:00
i2c-designware-core.h i2c: designware: Disable SMBus interrupts to prevent storms from mis-configured firmware 2026-01-02 12:57:03 +01:00
i2c-designware-master.c i2c: designware: Disable SMBus interrupts to prevent storms from mis-configured firmware 2026-01-02 12:57:03 +01:00
i2c-designware-pcidrv.c i2c: designware: Fix an error handling path in i2c_dw_pci_probe() 2025-05-14 17:28:24 +02:00
i2c-designware-platdrv.c i2c: designware: Add disabling clocks when probe fails 2025-09-26 09:38:58 +02:00
i2c-designware-slave.c i2c: designware: convert to dev_err_probe() on request IRQ error 2025-09-25 23:49:08 +02:00
i2c-digicolor.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-diolan-u2c.c i2c: diolan-u2c: reword according to newest specification 2024-07-11 15:14:08 +02:00
i2c-dln2.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-eg20t.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-elektor.c i2c: Don't let i2c adapters declare I2C_CLASS_SPD support if they support I2C_CLASS_HWMON 2024-01-18 21:10:41 +01:00
i2c-emev2.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-exynos5.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-fsi.c i2c: fsi: reword according to newest specification 2024-07-11 15:14:09 +02:00
i2c-gpio.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-gxp.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-highlander.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-hisi.c i2c: hisi: reword according to newest specification 2024-07-11 15:14:10 +02:00
i2c-hix5hd2.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-hydra.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
i2c-i801.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-ibm_iic.c i2c: ibm_iic: Use i2c_*bit_addr*_from_msg() helpers 2025-03-18 21:53:54 +01:00
i2c-ibm_iic.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
i2c-icy.c i2c: move drivers from strlcpy to strscpy 2022-08-11 23:02:51 +02:00
i2c-img-scb.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-imx-lpi2c.c i2c: imx-lpi2c: change to PIO mode in system-wide suspend/resume progress 2026-01-23 11:21:22 +01:00
i2c-imx.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-iop3xx.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-iop3xx.h Merge branch 'i2c/for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux 2019-07-15 21:10:39 -07:00
i2c-isch.c i2c: isch: Convert comma to semicolon 2025-01-07 23:46:10 +01:00
i2c-ismt.c i2c: ismt: Use non-hybrid PCI devres API 2025-05-19 22:23:57 +02:00
i2c-jz4780.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-k1.c i2c: spacemit: fix detect issue 2025-12-18 14:03:38 +01:00
i2c-keba.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-kempld.c i2c: kempld: Use i2c_10bit_addr_*_from_msg() helpers 2025-03-18 21:53:54 +01:00
i2c-ljca.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
i2c-lpc2k.c i2c: lpc2k: Add check for clk_enable() 2025-05-19 22:23:54 +02:00
i2c-ls2x.c i2c: ls2x: Fix frequency division register access 2025-02-26 23:23:33 +01:00
i2c-mchp-pci1xxxx.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-meson.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-microchip-corei2c.c i2c: microchip-core: re-fix fake detections w/ i2cdetect 2025-07-01 18:37:38 +02:00
i2c-mlxbf.c i2c: mlxbf: avoid 64-bit division 2025-05-23 10:02:27 +02:00
i2c-mlxcpld.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-mpc.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-mt65xx.c i2c: mt65xx: convert set_speed function to void 2025-10-04 18:55:44 +02:00
i2c-mt7621.c i2c: mt7621: Use i2c_10bit_addr_*_from_msg() helpers 2025-03-18 21:53:54 +01:00
i2c-mv64xxx.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-mxs.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-nct6694.c i2c: Add Nuvoton NCT6694 I2C support 2025-09-16 14:41:57 +01:00
i2c-nforce2.c i2c: Drop legacy muxing pseudo-drivers 2024-11-17 11:58:14 +01:00
i2c-nomadik.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-npcm7xx.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-nvidia-gpu.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-ocores.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-octeon-core.c i2c: octeon: add block-mode i2c operations 2025-05-19 22:23:55 +02:00
i2c-octeon-core.h i2c: octeon: add block-mode i2c operations 2025-05-19 22:23:55 +02:00
i2c-octeon-platdrv.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-omap.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-opal.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-owl.c i2c: owl: reword according to newest specification 2024-07-11 15:14:17 +02:00
i2c-parport.c parport: Remove parport_driver.devmodel 2024-07-03 16:44:22 +02:00
i2c-pasemi-core.c i2c: pasemi: Log bus reset causes 2025-05-19 22:23:57 +02:00
i2c-pasemi-core.h i2c: /pasemi: PASemi I2C controller IRQ enablement 2022-11-12 21:30:16 +01:00
i2c-pasemi-pci.c i2c: pasemi: Sort includes alphabetically 2025-05-19 22:23:55 +02:00
i2c-pasemi-platform.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-pca-isa.c i2c: rename wait_for_completion callback to wait_for_completion_cb 2025-10-04 18:52:58 +02:00
i2c-pca-platform.c i2c: rename wait_for_completion callback to wait_for_completion_cb 2025-10-04 18:52:58 +02:00
i2c-piix4.c Move FCH header to a location accessible by all archs 2025-06-30 13:42:11 +03:00
i2c-piix4.h i2c: piix4: Export i2c_piix4 driver functions as library 2024-11-13 23:29:46 +01:00
i2c-pnx.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-powermac.c i2c: powermac: convert of_node usage to fwnode 2025-05-20 22:49:21 +02:00
i2c-pxa-pci.c i2c: don't use ',' after delimiters 2024-09-10 00:33:52 +02:00
i2c-pxa.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-qcom-cci.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-qcom-geni.c i2c: qcom-geni: make sure I2C hub controllers can't use SE DMA 2026-01-23 11:21:22 +01:00
i2c-qup.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-rcar.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-riic.c i2c: riic: Move suspend handling to NOIRQ phase 2026-01-23 11:21:28 +01:00
i2c-rk3x.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-robotfuzz-osif.c i2c: robotfuzz-osif: disable zero-length read messages 2025-06-25 22:45:48 +02:00
i2c-rtl9300.c i2c: rtl9300: add support for RTL9310 I2C controller 2025-10-04 11:43:41 +02:00
i2c-rzv2m.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-s3c2410.c i2c: s3c2410: Drop S3C2410 OF support 2025-09-25 02:03:20 +02:00
i2c-scmi.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-sh7760.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-sh_mobile.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-sibyte.c i2c: Don't let i2c adapters declare I2C_CLASS_SPD support if they support I2C_CLASS_HWMON 2024-01-18 21:10:41 +01:00
i2c-simtec.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-sis96x.c i2c: Don't let i2c adapters declare I2C_CLASS_SPD support if they support I2C_CLASS_HWMON 2024-01-18 21:10:41 +01:00
i2c-sis630.c i2c: sis630: Fix an error handling path in sis630_probe() 2025-03-12 12:24:53 +01:00
i2c-sis5595.c i2c: sis5595: reword according to newest specification 2024-07-11 15:14:20 +02:00
i2c-sprd.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-st.c i2c: busses: Fix some spelling errors 2025-09-25 23:49:08 +02:00
i2c-stm32.c i2c: stm32: fix the device used for the DMA map 2025-07-10 11:58:33 +02:00
i2c-stm32.h i2c: stm32: Use the correct style for SPDX License Identifier 2019-08-14 14:56:54 +02:00
i2c-stm32f4.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-stm32f7.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-sun6i-p2wi.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-synquacer.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
i2c-taos-evm.c i2c: taos-evm: reword according to newest specification 2024-07-11 15:14:22 +02:00
i2c-tegra-bpmp.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-tegra.c i2c: tegra: Add Tegra256 support 2025-09-13 00:33:00 +02:00
i2c-thunderx-pcidrv.c i2c: thunderx: Use non-hybrid PCI devres API 2025-05-19 22:23:57 +02:00
i2c-tiny-usb.c i2c: tiny-usb: disable zero-length read messages 2025-06-25 22:49:57 +02:00
i2c-uniphier-f.c i2c: uniphier(-f): Replace dev_err() with dev_err_probe() in probe function 2025-05-19 22:23:55 +02:00
i2c-uniphier.c i2c: uniphier: Replace dev_err() with dev_err_probe() in probe function 2025-05-19 22:23:55 +02:00
i2c-usbio.c i2c: usbio: Add ACPI device-id for MTL-CVF devices 2025-10-14 13:54:43 +02:00
i2c-versatile.c i2c: Switch back to struct platform_driver::remove() 2024-11-17 11:58:14 +01:00
i2c-via.c i2c: via: Replace dev_err() with dev_err_probe() in probe function 2025-05-19 22:23:55 +02:00
i2c-viai2c-common.c i2c: viai2c: reword according to newest specification 2024-07-11 15:14:24 +02:00
i2c-viai2c-common.h i2c: viai2c: turn common code into a proper module 2024-06-26 16:07:21 +02:00
i2c-viai2c-wmt.c i2c: viai2c-wmt: Replace dev_err() with dev_err_probe() in probe function 2025-05-23 10:02:27 +02:00
i2c-viai2c-zhaoxin.c i2c: viai2c: reword according to newest specification 2024-07-11 15:14:24 +02:00
i2c-viapro.c i2c: viapro: Replace dev_err() with dev_err_probe() in probe function 2025-05-19 22:23:55 +02:00
i2c-viperboard.c i2c: busses: Fix some spelling errors 2025-09-25 23:49:08 +02:00
i2c-virtio.c i2c: virtio: Avoid hang by using interruptible completion wait 2025-07-24 00:38:01 +02:00
i2c-xgene-slimpro.c i2c: xgene-slimpro: Replace dev_err() with dev_err_probe() in probe function 2025-05-23 10:02:27 +02:00
i2c-xiic.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02:00
i2c-xlp9xx.c i2c: use inclusive callbacks in struct i2c_algorithm 2025-06-12 10:05:31 +02:00
Kconfig USB/Thunderbolt changes for 6.18-rc1 2025-10-04 16:07:08 -07:00
Makefile USB/Thunderbolt changes for 6.18-rc1 2025-10-04 16:07:08 -07:00
scx200_acb.c i2c: scx200_acb: Replace dev_err() with dev_err_probe() in probe function 2025-05-19 22:23:55 +02:00