]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: tegra: Don't mark devices with pins as IRQ safe
authorMikko Perttunen <mperttunen@nvidia.com>
Tue, 3 Mar 2026 04:32:11 +0000 (13:32 +0900)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 22 Mar 2026 18:37:58 +0000 (11:37 -0700)
I2C devices with associated pinctrl states (DPAUX I2C controllers)
will change pinctrl state during runtime PM. This requires taking
a mutex, so these devices cannot be marked as IRQ safe.

Add PINCTRL as dependency to avoid build errors.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Reported-by: Russell King <rmk+kernel@armlinux.org.uk>
Link: https://lore.kernel.org/all/E1vsNBv-00000009nfA-27ZK@rmk-PC.armlinux.org.uk/
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/i2c/busses/Kconfig
drivers/i2c/busses/i2c-tegra.c

index e11d50750e635de43a63ac9b284eaa4b67d169d5..7cb6b9b864a74e731594a3d522cbf2b9cf133345 100644 (file)
@@ -1213,6 +1213,8 @@ config I2C_TEGRA
        tristate "NVIDIA Tegra internal I2C controller"
        depends on ARCH_TEGRA || (COMPILE_TEST && (ARC || ARM || ARM64 || M68K || RISCV || SUPERH || SPARC))
        # COMPILE_TEST needs architectures with readsX()/writesX() primitives
+       depends on PINCTRL
+       # ARCH_TEGRA implies PINCTRL, but the COMPILE_TEST side doesn't.
        help
          If you say yes to this option, support will be included for the
          I2C controller embedded in NVIDIA Tegra SOCs
index bec619b9af4e33c74398aa51baaf0a2df69ee23e..4eaeb395d5db19ec868fd9c283d1bdf46f950374 100644 (file)
@@ -2047,8 +2047,11 @@ static int tegra_i2c_probe(struct platform_device *pdev)
         *
         * VI I2C device shouldn't be marked as IRQ-safe because VI I2C won't
         * be used for atomic transfers. ACPI device is not IRQ safe also.
+        *
+        * Devices with pinctrl states cannot be marked IRQ-safe as the pinctrl
+        * state transitions during runtime PM require mutexes.
         */
-       if (!IS_VI(i2c_dev) && !has_acpi_companion(i2c_dev->dev))
+       if (!IS_VI(i2c_dev) && !has_acpi_companion(i2c_dev->dev) && !i2c_dev->dev->pins)
                pm_runtime_irq_safe(i2c_dev->dev);
 
        pm_runtime_enable(i2c_dev->dev);