Bug 216913 - i2c not working after hibernation (i2c_designware)
Summary: i2c not working after hibernation (i2c_designware)
Status: RESOLVED CODE_FIX
Alias: None
Product: Drivers
Classification: Unclassified
Component: I2C (show other bugs)
Hardware: AMD Linux
: P1 high
Assignee: Drivers/I2C virtual user
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-01-11 12:59 UTC by Georg
Modified: 2023-02-07 10:40 UTC (History)
4 users (show)

See Also:
Kernel Version: v6.1.x v6.2.x
Subsystem:
Regression: No
Bisected commit-id:


Attachments

Description Georg 2023-01-11 12:59:15 UTC
Hi guys,
on my Lenovo Yoga 7 Gen 7 (14ARB7) with Ryzen CPU, the i2c bus stops working after hibernation.

Jan 11 10:02:50 yoga kernel: PM: hibernation: hibernation exit
Jan 11 10:02:50 yoga kernel: ------------[ cut here ]------------
Jan 11 10:02:50 yoga kernel: i2c i2c-3: Transfer while suspended
Jan 11 10:02:50 yoga kernel: WARNING: CPU: 4 PID: 2905 at drivers/i2c/i2c-core.h:54 __i2c_smbus_xfer+0x3e7/0x400 [i2c_core]
Jan 11 10:02:50 yoga kernel: Modules linked in: uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videodev videobuf2_common btusb btrtl btbcm btintel btmtk snd_ctl_led joydev wacom usbhid hid_multitouch snd_hda_codec_realtek snd_soc_acp6x_mach snd_acp6x_pdm_dma snd_soc_dmic amdgpu snd_hda_codec_generic i2c_hid_acpi drm_ttm_helper i2c_hid ttm snd_pci_ps snd_rpl_pci_acp6x snd_acp_pci snd_hda_codec_hdmi gpu_sched i2c_algo_bit drm_buddy snd_pci_acp6x drm_display_helper snd_hda_intel mt7921e snd_pci_acp5x snd_intel_dspcfg drm_kms_helper mt7921_common snd_hda_codec syscopyarea snd_rn_pci_acp3x sysfillrect mt76_connac_lib snd_hwdep snd_acp_config nls_cp437 sysimgblt snd_soc_acpi snd_hda_core mt76 snd_pci_acp3x ideapad_laptop platform_profile tpm_crb tpm_tis tpm_tis_core tpm i2c_designware_platform acpi_tad i2c_designware_core serio_raw sch_fq_codel drm i2c_dev i2c_core efivarfs
Jan 11 10:02:50 yoga kernel: CPU: 4 PID: 2905 Comm: i2cset Not tainted 6.2.0-rc3-x86_64+ #52
Jan 11 10:02:50 yoga kernel: Hardware name: LENOVO 82QF/LNVNB161216, BIOS K5CN35WW 09/23/2022
Jan 11 10:02:50 yoga kernel: RIP: 0010:__i2c_smbus_xfer+0x3e7/0x400 [i2c_core]
Jan 11 10:02:50 yoga kernel: Code: 8b a7 c0 00 00 00 4d 85 e4 75 04 4c 8b 67 70 48 8d 7d 70 e8 bb a6 83 e1 4c 89 e2 48 89 c6 48 c7 c7 10 1b 01 a0 e8 3f f2 ee e1 <0f> 0b 41 bc 94 ff ff ff e9 72 fd ff ff 66 66 2e 0f 1f 84 00 00 00
Jan 11 10:02:50 yoga kernel: RSP: 0018:ffffc90006d5fda0 EFLAGS: 00010286
Jan 11 10:02:50 yoga kernel: RAX: 0000000000000000 RBX: 0000000000000048 RCX: 0000000000000027
Jan 11 10:02:50 yoga kernel: RDX: ffff888761d17408 RSI: 0000000000000001 RDI: ffff888761d17400
Jan 11 10:02:50 yoga kernel: RBP: ffff8881056160e8 R08: ffffffff82b1eb28 R09: 00000000ffffdfff
Jan 11 10:02:50 yoga kernel: R10: ffffffff82a3eb40 R11: ffffffff82aeeb40 R12: ffff8881039ba518
Jan 11 10:02:50 yoga kernel: R13: 0000000000000000 R14: 0000000000000002 R15: 0000000000000002
Jan 11 10:02:50 yoga kernel: FS:  00007f61e5d84740(0000) GS:ffff888761d00000(0000) knlGS:0000000000000000
Jan 11 10:02:50 yoga kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Jan 11 10:02:50 yoga kernel: CR2: 00007f61e5de03a5 CR3: 00000002f91de000 CR4: 0000000000750ee0
Jan 11 10:02:50 yoga kernel: PKRU: 55555554
Jan 11 10:02:50 yoga kernel: Call Trace:
Jan 11 10:02:50 yoga kernel:  <TASK>
Jan 11 10:02:50 yoga kernel:  ? do_filp_open+0xb1/0x160
Jan 11 10:02:50 yoga kernel:  i2c_smbus_xfer+0x7a/0x120 [i2c_core]
Jan 11 10:02:50 yoga kernel:  i2cdev_ioctl_smbus+0x181/0x240 [i2c_dev]
Jan 11 10:02:50 yoga kernel:  i2cdev_ioctl+0x1a2/0x2c0 [i2c_dev]
Jan 11 10:02:50 yoga kernel:  __x64_sys_ioctl+0xab/0xe0
Jan 11 10:02:50 yoga kernel:  ? exit_to_user_mode_prepare+0x39/0x130
Jan 11 10:02:50 yoga kernel:  do_syscall_64+0x43/0x90
Jan 11 10:02:50 yoga kernel:  entry_SYSCALL_64_after_hwframe+0x4b/0xb5
Jan 11 10:02:50 yoga kernel: RIP: 0033:0x7f61e5e7c26b
Jan 11 10:02:50 yoga kernel: Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <41> 89 c0 3d 00 f0 ff ff 77 1b 48 8b 44 24 18 64 48 2b 04 25 28 00
Jan 11 10:02:50 yoga kernel: RSP: 002b:00007ffdcc04a860 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
Jan 11 10:02:50 yoga kernel: RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f61e5e7c26b
Jan 11 10:02:50 yoga kernel: RDX: 00007ffdcc04a8c0 RSI: 0000000000000720 RDI: 0000000000000003
Jan 11 10:02:50 yoga kernel: RBP: 0000000000000000 R08: 00007ffdcc04a8f0 R09: 00007ffdcc04a780
Jan 11 10:02:50 yoga kernel: R10: fffffffffffffd09 R11: 0000000000000246 R12: 0000000000000000
Jan 11 10:02:50 yoga kernel: R13: 0000000000000003 R14: 0000000000000048 R15: 00007ffdcc04a980
Jan 11 10:02:50 yoga kernel:  </TASK>
Jan 11 10:02:50 yoga kernel: ---[ end trace 0000000000000000 ]---


And the return of i2cget or i2cset is a simple "Error: Read failed" or "Error: Write failed".
Comment 1 Georg 2023-01-11 17:16:56 UTC
I checked some files and found something.
This solution works for me.

diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index ba043b547393..289879c56a0c 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -484,7 +484,7 @@ static int __maybe_unused dw_i2c_plat_resume(struct device *dev)
 static const struct dev_pm_ops dw_i2c_dev_pm_ops = {
        .prepare = dw_i2c_plat_prepare,
        .complete = dw_i2c_plat_complete,
-       SET_LATE_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
+       SET_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
        SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend, dw_i2c_plat_runtime_resume, NULL)
 };
Comment 2 Georg 2023-01-11 19:30:20 UTC
Sorry, quick question: who do I actually have to report the problem and solution to?
Comment 4 Bjorn Helgaas 2023-02-01 22:54:15 UTC
Georg, I would start with these folks:

$ ./scripts/get_maintainer.pl -f drivers/i2c/busses/i2c-designware-platdrv.c
Jarkko Nikula <jarkko.nikula@linux.intel.com> (supporter:SYNOPSYS DESIGNWARE I2C DRIVER)
Andy Shevchenko <andriy.shevchenko@linux.intel.com> (reviewer:SYNOPSYS DESIGNWARE I2C DRIVER)
Mika Westerberg <mika.westerberg@linux.intel.com> (reviewer:SYNOPSYS DESIGNWARE I2C DRIVER)
Jan Dabros <jsd@semihalf.com> (reviewer:SYNOPSYS DESIGNWARE I2C DRIVER)
Philipp Zabel <p.zabel@pengutronix.de> (maintainer:RESET CONTROLLER FRAMEWORK)
linux-i2c@vger.kernel.org (open list:SYNOPSYS DESIGNWARE I2C DRIVER)
linux-kernel@vger.kernel.org (open list)

I would also add Hans de Goede <hdegoede@redhat.com> and Rafael J. Wysocki <rafael.j.wysocki@intel.com> since they made recent changes in that area:

  https://git.kernel.org/linus/c57813b8b288
  https://git.kernel.org/linus/541527728341
Comment 5 Georg 2023-02-06 17:43:42 UTC
With kernel version 6.2.0-rc6, the i2c hibernate and resuming works again.
Thanks.
Comment 6 Bjorn Helgaas 2023-02-07 00:48:00 UTC
Georg, can you identify the commit that fixed this?
Comment 7 Georg 2023-02-07 10:40:36 UTC
I think, the commit 
https://git.kernel.org/linus/75507a319876aba88932e2c7dab58b6c22d89f6b
from Richard Fitzgerald fixed the problem.

Note You need to log in before you can comment on or make changes to this bug.