linux/drivers/i2c/busses
Troy Mitchell bfef208916 i2c: spacemit: fix detect issue
[ Upstream commit 25faa53646 ]

This commit addresses two issues causing i2c detect to fail.

The identified issues are:

1. Incorrect error handling for BED (Bus Error No ACK/NAK):
   Before this commit, Both ALD (Arbitration Loss Detected) and
   BED returned -EAGAIN.
2. Missing interrupt status clear after initialization in xfer():
   On the K1 SoC, simply fixing the first issue changed the error
   from -EAGAIN to -ETIMEOUT. Through tracing, it was determined that
   this is likely due to MSD (Master Stop Detected) latency issues.

   That means the MSD bit in the ISR may still be set on the next transfer.
   As a result, the controller won't work — we can see from the scope that
   it doesn't issue any signal.
   (This only occurs during rapid consecutive I2C transfers.
   That explains why the issue only shows up with i2cdetect.)

With these two fixes, i2c device detection now functions correctly on the K1 SoC.

Fixes: 5ea558473f ("i2c: spacemit: add support for SpacemiT K1 SoC")
Tested-by: Aurelien Jarno <aurelien@aurel32.net>
Signed-off-by: Troy Mitchell <troy.mitchell@linux.spacemit.com>
Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
Tested-by: Michael Opdenacker <michael.opdenacker@rootcommit.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20251113-fix-k1-detect-failure-v2-1-b02a9a74f65a@linux.spacemit.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-12-18 14:03:38 +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: drop free_irq() of devm_request_irq() allocated irq 2025-03-20 14:37:47 +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: determine HS tHIGH and tLOW based on HW parameters 2024-11-24 16:03:51 +01:00
i2c-designware-master.c i2c: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02: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: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02: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: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02: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: Remove redundant pm_runtime_mark_last_busy() calls 2025-10-14 13:51:07 +02: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